4

使用 Thrustdevice_malloc而不是普通的cudaMalloc有什么好处,有什么作用device_new

因为device_malloc似乎使用它的唯一原因是它更干净一些。

device_new文档说:

“device_new 为驻留在设备内存中的类型实现放置 new 运算符。device_new 在设备内存中的对象数组上调用 T 的 null 构造函数。此函数不分配内存。”

我不明白...

4

2 回答 2

1

所以我想我发现了 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));
于 2013-04-18T11:15:01.790 回答
1

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)
于 2013-04-18T11:17:58.547 回答