CUDA中的全局设备变量:不好的做法?

时间:2015-07-23 22:43:29

标签: cuda

我正在设计一个具有大量CUDA内核的库来执行并行计算。所有内核都将作用于一个公共对象,比如计算网格,它是使用C ++样式对象定义的。计算域并不一定需要从主机端访问,因此在设备端创建并保持它在那里是有意义的。我想知道是否考虑以下情况"良好做法":

  • 假设我的计算网格类被称为Domain。首先,我定义一个全局设备端变量来存储计算域:

    __device__ Domain* D
    
  • 然后我使用CUDA内核初始化计算域

    __global__ void initDomain(paramType P){
        D = new Domain(P);
    }
    
  • 然后,我使用此域与其他内核执行计算:

    __global__ void doComputation(double *x,double *y){
        D->doThing(x,y);
        //...
    }
    

如果我的域名仍然是固定的(即内核在创建后不会修改域名),这样可以吗?有没有更好的办法?我最初尝试在主机端创建Domain对象并将其复制到设备上,但事实证明这是一个麻烦,因为Domain是一个相对复杂的类型,这使得复制过程变得很麻烦使用例如cudaMemCpy甚至Thrust::device_new(至少,我无法让它很好地运作)。

1 个答案:

答案 0 :(得分:1)

是的,没关系。

也许您可以使用

提高效果
__constant__ 

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

为了复制您的对象,您必须使用:cudaMemcpyToSymbol,请注意有限制:您的对象在您的设备代码中是只读的,必须没有默认值构造

您可以找到信息here

如果您的对象很复杂且难以复制,也许您可​​以查找:Unified memory,然后将值按值传递给内核。