首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >推力device_malloc和device_new

推力device_malloc和device_new
EN

Stack Overflow用户
提问于 2013-04-18 10:34:50
回答 2查看 1.2K关注 0票数 4

使用推力device_malloc而不是普通cudaMalloc的优点是什么?device_new是做什么的?

对于device_malloc来说,使用它的唯一原因似乎是它有点干净。

device_new文档说:

"device_new为驻留在设备内存中的类型实现了放置新操作符。device_new在设备内存中的对象数组上调用T的空构造函数。此函数没有分配内存。“

但我不明白..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-18 11:17:58

如果您计划在其他方面使用推力,device_malloc将返回适当类型的对象。如果你使用推力,通常没有理由使用cudaMalloc。封装CUDA的调用使它更容易,而且通常更干净。C++和STL容器与C样式数组和malloc也是一样的。

对于device_new,您应该阅读文档的下面一行

代码语言:javascript
复制
 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>

代码语言:javascript
复制
template<typename T >
device_ptr<T> thrust::device_new (const size_t n = 1)
票数 1
EN

Stack Overflow用户

发布于 2013-04-18 11:15:01

所以我想我发现了device_new的一个很好的用途

这基本上是一种更好的方法,用于初始化一个对象并将其复制到设备上,同时在主机上保存指向它的指针。

因此,与其做:

代码语言:javascript
复制
Particle *dev_p;
cudaMalloc((void**)&(dev_p), sizeof(Particle));
cudaMemcpy(dev_p, &p, sizeof(Particle), cudaMemcpyHostToDevice);

test2<<<1,1>>>(dev_p);

我能做的就是:

代码语言:javascript
复制
thrust::device_ptr<Particle> p = thrust::device_new<Particle>(1);
test2<<<1,1>>>(thrust::raw_pointer_cast(p));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16080630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档