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