【发布时间】:2011-12-24 14:43:59
【问题描述】:
thrust::device_vector 的自动内存管理非常有用,唯一的缺点是无法在内核代码中使用它。
我在 Internet 上查看过,刚刚找到了诸如推力之类的向量库,它处理来自主机代码的设备内存。是否存在任何用于内核的向量库?如果没有,拥有这样的图书馆是不是一个坏主意?
【问题讨论】:
标签: c++ vector cuda device thrust
thrust::device_vector 的自动内存管理非常有用,唯一的缺点是无法在内核代码中使用它。
我在 Internet 上查看过,刚刚找到了诸如推力之类的向量库,它处理来自主机代码的设备内存。是否存在任何用于内核的向量库?如果没有,拥有这样的图书馆是不是一个坏主意?
【问题讨论】:
标签: c++ vector cuda device thrust
这样的库是可以写的,但是效率很低。
实际上thrust::device_vector 与thrust::host_vector 或std::vector 的区别仅在于它在设备而不是主机上分配内存。大小调整算法相同,在主机上运行。
调整大小的逻辑非常简单,但涉及分配/释放内存和复制数据。在多线程设置中,每次线程调整向量大小时,您都必须锁定整个向量 - 由于副本的原因,这可能会很长。
在内核将元素附加到向量的情况下,同步机制实际上会序列化工作,因为一次只允许一个线程调整大小。因此,您的代码将以单个设备处理器的速度运行,减去(相当大的)同步开销。这可能会比 CPU 实现慢很多。
【讨论】:
Thrust 不能在内核中使用,但是,thrust::device_vector 可以用于与内核的接口。此时,可以将指向底层数据的指针传递给内核。例如:
thrust::device_vector<int> my_int_vector;
my_kernel<<<blocks, threads>>>(thrust::raw_pointer_cast(my_int_vector.data());
根据您的情况,这可能仍然意味着 Thrust 库即使在实现您自己的内核时也很有用。
【讨论】: