我正在设计一个具有大量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
(至少,我无法让它很好地运作)。
答案 0 :(得分:1)
是的,没关系。
也许您可以使用
提高效果__constant__
使用此关键字,您的对象将在所有内核中以非常快的速度存在。
为了复制您的对象,您必须使用:cudaMemcpyToSymbol,请注意有限制:您的对象在您的设备代码中是只读的,必须没有默认值构造
您可以找到信息here
如果您的对象很复杂且难以复制,也许您可以查找:Unified memory,然后将值按值传递给内核。