我可以使用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_ptrp创建向量v,它指向n元素的分配。 但它会创建新的 device_vector 并将内存从 device_ptr p 复制到 vector,不是吗? 是的,它会创建一个新的device_vector,但不,它不会分配任何内存或进行任何复制。实例将引用您分配的零拷贝内存。 Thrust fallback allocator example 给出了一个可能的实现方式,就像 talonmies 所描述的那样,用推力实现映射的固定内存。

以上是关于我可以使用thrust::host_vector 还是必须使用cudaHostAlloc 进行Thrust 的零拷贝?的主要内容,如果未能解决你的问题,请参考以下文章

将推力与 printf / cout 一起使用

如何使用推力和 CUDA 流将内存从主机异步复制到设备

如何在不隐式调用“复制”的情况下初始化 CUDA 推力向量?

不允许从 __host__ __device__ 函数调用 __host__ 函数

我可以同时使用 UIPageViewControllers 吗?

一旦我可以使用 XMPP 列出用户,我如何在这些用户之间实现聊天?