我很抱歉这个糟糕的头衔...... 我想有一个具有静态属性值的类,我可以在设备代码中使用它。我尝试了以下内容:
struct MyConstValue
{
static __constant__ int value;
};
理论上,现在,我应该定义MyConstValue :: value,初始化它,可能通过cudaMemcpyToSymbol
,然后我可以编写一个通过MyGlobalValue::value
访问该值的内核。
如果我添加
int __constant__ MyConstValue::value;
为了定义符号(有和没有__constant__
),nvcc输出
error: ‘static’ may not be used when defining (as opposed to declaring) a static data member [-fpermissive]
有没有办法实现我的想法?
我正在使用CUDA 5.5,我的目标计算能力> 2.0。
提前致谢。
答案 0 :(得分:3)
CUDA中不支持静态类成员。
原因可能是没有定义的初始化点,如果所有线程都这样做,或者只有一个,如果是,那么,哪个线程。因此静态数据在这种情况下没有意义。
来自NVIDIA forum:
但是,“静态类成员”的成语在GPU上甚至意味着什么呢?它 不能与GPU相同,因为有很多新问题 它的定义。也许每个线程都有自己的静态成员 如果该线程访问该类的多个副本?每个街区都有 一个静态成员?每个内核?每个设备,因为类可以 生活在内核调用之外的内存中?
来自CUDA编程指南的B 2.2:
常量限定符,可选择与设备一起使用, 声明一个变量:
驻留在常量内存空间中,具有应用程序的生命周期, 可以从网格中的所有线程和主机访问 通过运行时库(cudaGetSymbolAddress()/ cudaGetSymbolSize()/ cudaMemcpyToSymbol()/ cudaMemcpyFromSymbol() 用于运行时API和cuModuleGetGlobal()用于驱动程序API)。
您可以查看this thread。