常量内存符号作为类的静态属性

时间:2014-03-04 11:45:17

标签: c++ cuda

我很抱歉这个糟糕的头衔...... 我想有一个具有静态属性值的类,我可以在设备代码中使用它。我尝试了以下内容:

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。

提前致谢。

1 个答案:

答案 0 :(得分:3)

CUDA中不支持静态类成员。

原因可能是没有定义的初始化点,如果所有线程都这样做,或者只有一个,如果是,那么,哪个线程。因此静态数据在这种情况下没有意义。

来自NVIDIA forum

  

但是,“静态类成员”的成语在GPU上甚至意味着什么呢?它   不能与GPU相同,因为有很多新问题   它的定义。也许每个线程都有自己的静态成员   如果该线程访问该类的多个副本?每个街区都有   一个静态成员?每个内核?每个设备,因为类可以   生活在内核调用之外的内存中?

来自CUDA编程指南的B 2.2:

  

常量限定符,可选择与设备一起使用,   声明一个变量:

     

驻留在常量内存空间中,具有应用程序的生命周期,   可以从网格中的所有线程和主机访问   通过运行时库(cudaGetSymbolAddress()/   cudaGetSymbolSize()/ cudaMemcpyToSymbol()/ cudaMemcpyFromSymbol()   用于运行时API和cuModuleGetGlobal()用于驱动程序API)。

您可以查看this thread