我可以使用thrust::host_vector 还是必须使用cudaHostAlloc 进行Thrust 的零拷贝?
Posted
技术标签:
【中文标题】我可以使用thrust::host_vector 还是必须使用cudaHostAlloc 进行Thrust 的零拷贝?【英文标题】:Can I use thrust::host_vector or I must use cudaHostAlloc for zero-copy with Thrust? 【发布时间】:2012-07-26 09:34:30 【问题描述】:我想通过cudaHostGetDevicePointer
对映射内存使用零拷贝。我可以使用thrust::host_vector
还是必须使用cudaHostAlloc(...,cudaHostAllocMapped)?
还是用 Thrust 更容易做到?
【问题讨论】:
【参考方案1】:我很确定仍然无法将推力::host_vector 用作映射的主机分配。有一个固定的内存分配器,但我不相信映射内存可用。你需要做的是这样的:
-
使用
cudaHostAlloc
分配的映射、固定主机内存
使用cudaHostGetDevicePointer
获取零拷贝内存的设备指针
在该设备指针上使用thrust::device_pointer_cast
创建thrust::device_ptr
(有关详细信息,请参阅here)
您可以使用thrust::device_ptr
创建thrust::device_vector
或直接将thrust::device_ptr
传递给任何接受迭代器的算法。
【讨论】:
谢谢!但是如何使用推力::device_ptr 制作推力::device_vector? 你可以从一个迭代器范围创建一个thrust::device_vector
,所以像thrust::device_vector<int> v(p, p+n)
这样的东西从device_ptr
p
创建向量v
,它指向n
元素的分配。
但它会创建新的 device_vector 并将内存从 device_ptr p 复制到 vector,不是吗?
是的,它会创建一个新的device_vector
,但不,它不会分配任何内存或进行任何复制。实例将引用您分配的零拷贝内存。
Thrust fallback allocator example 给出了一个可能的实现方式,就像 talonmies 所描述的那样,用推力实现映射的固定内存。以上是关于我可以使用thrust::host_vector 还是必须使用cudaHostAlloc 进行Thrust 的零拷贝?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不隐式调用“复制”的情况下初始化 CUDA 推力向量?
不允许从 __host__ __device__ 函数调用 __host__ 函数