首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据自动化系统中的全球设备变量:不良实践?

数据自动化系统中的全球设备变量:不良实践?
EN

Stack Overflow用户
提问于 2015-07-23 22:43:29
回答 1查看 445关注 0票数 0

我正在设计一个拥有大量CUDA内核的库来执行并行计算。所有内核都将作用于一个公共对象,比如使用C++样式对象定义的计算网格。计算域不一定需要从主机端访问,因此在设备端创建计算域并将其保持在当前状态是有意义的。我想知道以下几点是否被认为是“良好做法”:

  • 假设我的计算网格类名为Domain。首先,我定义了一个全局设备端变量来存储计算域: __device__域*D
  • 然后,我使用CUDA内核初始化计算域。 __global__ void initDomain(paramType P){ D=新域(P);}
  • 然后,我使用这个域与其他内核一起执行计算: __global__ void doComputation(double *x,double *y){ D->doThing(x,y);//.}

如果我的域保持固定(即内核在域创建后不会修改它),这可以吗?有更好的办法吗?最初,我尝试在主机端创建Domain对象,并将其复制到设备上,但结果发现这是一个麻烦,因为Domain是一个相对复杂的类型,使用cudaMemCpy甚至Thrust::device_new进行复制非常困难(至少,我无法让它很好地工作)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-24 06:48:36

是的没关系。

也许您可以提高性能使用

代码语言:javascript
复制
__constant__ 

使用此关键字,您的对象将在非常快的内存中在所有内核中可用。

为了复制您的对象,您必须使用: cudaMemcpyToSymbol,请注意,有一个限制:您的对象将被只读在您的设备代码中,并且必须没有默认的构造函数。

你可以找到这里的信息

如果您的对象很复杂,很难复制,那么您也许可以查找:统一存储器,然后通过值将变量传递给内核。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31599307

复制
相关文章

相似问题

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