使用推力device_malloc而不是普通cudaMalloc的优点是什么?device_new是做什么的?
对于device_malloc来说,使用它的唯一原因似乎是它有点干净。
device_new文档说:
"device_new为驻留在设备内存中的类型实现了放置新操作符。device_new在设备内存中的对象数组上调用T的空构造函数。此函数没有分配内存。“
但我不明白..。
发布于 2013-04-18 11:17:58
如果您计划在其他方面使用推力,device_malloc将返回适当类型的对象。如果你使用推力,通常没有理由使用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:用于构造一个或多个Ts的设备内存区域的device_ptr。
基本上,如果已经分配了内存,则可以使用此函数。只有默认的构造函数才会被调用,这将返回一个按T类型转换的device_pointer。
另一方面,下面的方法分配内存并返回一个device_ptr<T>
template<typename T >
device_ptr<T> thrust::device_new (const size_t n = 1)发布于 2013-04-18 11:15:01
所以我想我发现了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));https://stackoverflow.com/questions/16080630
复制相似问题