推动device_malloc和device_new

时间:2013-04-18 10:34:51

标签: cuda thrust

使用Thrust device_malloc代替普通cudaMalloc以及device_new做什么有什么好处?

对于device_malloc来说,似乎使用它的唯一原因是它只是更清洁。

device_new文档说:

  

“device_new为驻留类型实现了贴装新运算符   在设备内存中。 device_new在数组上调用T的null构造函数   设备内存中的对象。此功能没有分配内存。“

我不明白......

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分:1)

如果您打算将Thrust用于其他事情,

device_malloc将返回正确类型的对象。如果您使用Thrust,通常没有理由使用cudaMalloc。封装CUDA调用使其更容易,通常更清晰。 C ++和STL容器与C样式数组和malloc相同。

对于device_new,您应该阅读documentation的以下行:

 template<typename T>
 device_ptr<T> thrust::device_new (device_ptr< void > p, const size_t n = 1) 
  

p:device_ptr到要构造的设备内存区域   一个或多个Ts。

基本上,如果已经分配了内存,则可以使用此功能。只会调用默认构造函数,这将返回device_pointer转换为T的类型。

另一方面,以下方法分配内存并返回device_ptr<T>

template<typename T >
device_ptr<T> thrust::device_new (const size_t n = 1)