使用Thrust device_malloc
代替普通cudaMalloc
以及device_new
做什么有什么好处?
对于device_malloc
来说,似乎使用它的唯一原因是它只是更清洁。
device_new
文档说:
“device_new为驻留类型实现了贴装新运算符 在设备内存中。 device_new在数组上调用T的null构造函数 设备内存中的对象。此功能没有分配内存。“
我不明白......
答案 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)
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)