使用 Thrustdevice_malloc
而不是普通的cudaMalloc
有什么好处,有什么作用device_new
?
因为device_malloc
似乎使用它的唯一原因是它更干净一些。
device_new
文档说:
“device_new 为驻留在设备内存中的类型实现放置 new 运算符。device_new 在设备内存中的对象数组上调用 T 的 null 构造函数。此函数不分配内存。”
我不明白...
所以我想我发现了 device_new 的一个很好的用途
它基本上是初始化对象并将其复制到设备的更好方法,同时在主机上持有指向它的指针。
所以不要这样做:
Particle *dev_p;
cudaMalloc((void**)&(dev_p), sizeof(Particle));
cudaMemcpy(dev_p, &p, sizeof(Particle), cudaMemcpyHostToDevice);
test2<<<1,1>>>(dev_p);
我可以这样做:
thrust::device_ptr<Particle> p = thrust::device_new<Particle>(1);
test2<<<1,1>>>(thrust::raw_pointer_cast(p));
device_malloc
如果您打算将 Thrust 用于其他事情,则返回正确类型的对象。cudaMalloc
如果您使用 Thrust,通常没有理由使用。封装 CUDA 调用使其更容易并且通常更清晰。C++ 和 STL 容器与 C 样式数组和malloc
.
对于,您应该阅读文档device_new
的以下行:
template<typename T>
device_ptr<T> thrust::device_new (device_ptr< void > p, const size_t n = 1)
p:指向设备内存区域的 device_ptr,在该区域中构造一个或多个 T。
基本上,如果内存已经分配,则可以使用此功能。只会调用默认构造函数,这将返回device_pointer
转换为 T 的类型。
另一方面,以下方法分配内存并返回 a device_ptr<T>
:
template<typename T >
device_ptr<T> thrust::device_new (const size_t n = 1)