我是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);
}
答案 0 :(得分:3)
CUDA对象模型不允许结构或类中的内存说明符(__constant__
,__shared__
,__global__
)。这是一个刻意且明智的设计选择 - 它意味着任何兼容对象都可以在任何内存空间中实例化,并且任何兼容对象都可以在内存空间之间复制。
所以你不能做你所描述的。如果你想要一个存储在常量内存中的小数组,那么你必须在你需要访问它的编译单元上静态编译它,或者你需要使用单独的编译和链接,并将数组声明为一次在联系内。如果您想要或需要更多范围控制,请使用命名空间。这是可以做到的。
另一方面,如果您的最终目的是通过值将此结构传递给CUDA内核,那么您不必担心常量内存。这是因为所有内核参数都在当前支持的体系结构的专用常量内存中传递,并且您将获得所需的效果而无需执行任何操作。