推力设备分配和设备新建

4
使用Thrust的device_malloc与普通的cudaMalloc相比的优势有哪些?device_new是什么?
使用device_malloc唯一的原因似乎只是代码更加简洁。
关于device_new,文档说明如下:
“device_new实现了用于驻留在设备内存中类型的放置new操作符。device_new在设备内存中的对象数组上调用T的空构造函数。该函数不分配任何内存。”
这个我不太理解...
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));

1
如果您计划在其他方面使用Thrust,则device_malloc将返回正确类型的对象。如果使用Thrust,则通常没有使用cudaMalloc的原因。封装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,用于构造一个或多个Ts。

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

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

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

大家好,我很惊讶为什么没有人指出我可以在我发布了一个有关将对象复制到设备内存的问题时使用thrust device_new! 我知道我仍然必须手动复制内部字段,但第一步(复制对象本身)最好使用thrust完成。 - SpaceMonkey
嗯,不是每个人都使用Thrust。对于简单的事情而言,你并不需要它,但是对于非CUDA开发人员来说,它可以让你的代码更清晰易读。虽然知道如何在没有Thrust的情况下完成任务是一件好事,否则你一旦开始调试你的代码就可能会迷失方向。 - BenC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接