在类中声明 CUDA __constant__内存
declare cuda __constant__ memory in a class
我是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 内核,那么您无需担心常量内存。这是因为在当前支持的体系结构上,所有内核参数都传递在专用常量内存中,您无需执行任何操作即可获得所需的效果。
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 类型总是使用其大小存储在内存中吗
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存