在类中声明 CUDA __constant__内存

declare cuda __constant__ memory in a class

本文关键字:constant 内存 CUDA 声明      更新时间:2023-10-16

我是CUDA编程的新手。目前,我正在尝试构建一个使用 CUDA 并行处理数据的 OO-框架。我目前正在使用 CUDA 8.0。

__constant__ int foo[3]有一些关键参数需要所有线程频繁访问,我认为将它们放入常量内存中可以帮助改进内存读取过程。我想在类头中声明一个,然后使用cudaMemcpyToSymbol初始化。

从其他示例中(不在 OO 上下文中),我了解到常量内存符号可以定义为全局变量并使用cudaMemcpyToSymbol初始化。但是,如果我在类的标头中定义常量内存符号,编译器会抱怨:

error : attribute "__constant__" does not apply here

我也无法在类定义中的任何位置指定__constant__。看起来它无法在面向对象的框架上下文中定义常量内存?如果有任何解决方法,请提供帮助。谢谢!


myClass.cuh

class myClass
{
private:
__constant__ int foo[3];
void initialize();
void compute(); // required repeated and heavy access of foo from every thread
}

myClass.cu

void myClass::initialize()
{
int bar[3] ={1,2,3};
//attempt to copy the data in bar to foo
cudaMemcpyToSymbol(foo, bar, 3*sizeof(int), 0, cudaMemcpyHostToDevice);
}

CUDA 对象模型不允许在结构或类中使用内存说明符(__constant____shared____global__)。这是一个深思熟虑和明智的设计选择 - 这意味着任何兼容的对象都可以在任何内存空间内实例化,任何兼容的对象都可以在内存空间之间复制。

所以你不能做你所描述的。如果你想让一个小数组存储在常量内存中,那么你必须在你需要访问它的编译单元上静态编译它,或者你需要使用单独的编译和链接,数组在链接中声明一次。如果想要或需要对范围进行更多控制,请使用命名空间。这是所能做到的。

另一方面,如果您的最终意图是按值将此结构传递给 CUDA 内核,那么您无需担心常量内存。这是因为在当前支持的体系结构上,所有内核参数都传递在专用常量内存中,您无需执行任何操作即可获得所需的效果。