gpt4 book ai didi

c++ - 在类中声明 cuda __constant__ 内存

转载 作者:行者123 更新时间:2023-11-30 01:40:33 24 4
gpt4 key购买 nike

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

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

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

error : attribute "__constant__" does not apply here

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


我的类(class).cuh

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

我的类(class).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 内核,那么您无需担心常量内存。这是因为在当前支持的体系结构上,所有内核参数都在专用常量内存中传递,您无需执行任何操作即可获得所需的效果。

关于c++ - 在类中声明 cuda __constant__ 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43051339/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com