C++ 在类中声明cuda常量内存

C++ 在类中声明cuda常量内存,c++,cuda,C++,Cuda,我是CUDA编程新手。目前,我正在尝试构建一个OO框架,使用CUDA并行处理数据。我目前正在使用CUDA 8.0 有一些关键参数需要所有线程频繁访问,我认为将它们放入常量内存有助于改进内存读取过程。我希望在类标题中声明一个,然后使用cudaMemcpyToSymbol初始化 从其他示例(不在OO上下文中)中,我了解到常量内存符号可以定义为一个全局变量,并使用cudaMemcpyToSymbol初始化。但是,如果我在类的头中定义常量内存符号,编译器会通过以下方式进行投诉: error : attr

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

有一些关键参数需要所有线程频繁访问,我认为将它们放入常量内存有助于改进内存读取过程。我希望在类标题中声明一个,然后使用
cudaMemcpyToSymbol
初始化

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

error : attribute "__constant__" does not apply here
我也不能在类定义中的任何位置指定
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。看起来它无法在面向对象框架的上下文中定义常量内存?如果有任何解决方法,请提供帮助。多谢各位


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对象模型不允许在结构或类中使用内存说明符(
\uuuuuu常量\uuuuuuu
\uuuuuu共享\uuuuuuuu
\uuuuu全局\uuuuuuuuu
)。这是一个深思熟虑且明智的设计选择——它意味着任何兼容对象都可以在任何内存空间中实例化,任何兼容对象都可以在内存空间之间复制

所以你不能做你所描述的。如果希望将小数组存储在恒定内存中,则必须在访问它所需的编译单元静态编译它,或者需要使用单独的编译和链接,在链接中声明一次数组。如果您想要或需要更多的范围控制,那么使用名称空间。这是我们所能做的


另一方面,如果您的最终目的是通过值将此结构传递给CUDA内核,那么您就不需要担心恒定内存。这是因为在当前支持的体系结构上,所有内核参数都是在专用的常量内存中传递的,您不需要做任何事情就可以得到想要的效果。

CUDA对象模型不允许在结构或类中使用内存说明符(
\uuuuuuuuuu常量
\uuuuuuu共享
\uuuuu全局
)。这是一个深思熟虑且明智的设计选择——它意味着任何兼容对象都可以在任何内存空间中实例化,任何兼容对象都可以在内存空间之间复制

所以你不能做你所描述的。如果希望将小数组存储在恒定内存中,则必须在访问它所需的编译单元静态编译它,或者需要使用单独的编译和链接,在链接中声明一次数组。如果您想要或需要更多的范围控制,那么使用名称空间。这是我们所能做的


另一方面,如果您的最终目的是通过值将此结构传递给CUDA内核,那么您就不需要担心恒定内存。这是因为所有内核参数都是在当前支持的体系结构上的专用常量内存中传递的,您不需要做任何事情就可以得到想要的效果。

谢谢您的帮助!提到最后一段,您的意思是我可以将我的内核声明为
\uuuuu global\uuuu void compute(intfoo[3])?只需通过值传递变量
foo
(而不是通过指针)?是的,这就是它的工作方式。参数列表的最大大小(以字节为单位)是有限制的(2kb IIRC),但如果您可以接受,作为参数传递值将自动获得缓存的恒定内存访问。感谢您的帮助!提到最后一段,您的意思是我可以将我的内核声明为
\uuuuu global\uuuu void compute(intfoo[3])?只需通过值传递变量
foo
(而不是通过指针)?是的,这就是它的工作方式。参数列表的最大大小(以字节为单位)是有限制的(2kb IIRC),但如果您可以接受,作为参数传递值将自动获得缓存的恒定内存访问。