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

Constant memory symbol as static property of class

本文关键字:常量 内存 符号 属性 静态      更新时间:2023-10-16

很抱歉标题不正确。。。我想要一个具有静态属性值的类,可以在设备代码中使用。我尝试的是:

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。

提前谢谢。

CUDA中不支持静态类成员。

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

来自NVIDIA论坛:

但是"静态类成员"习语在GPU上意味着什么?它不能和GPU一样,因为有很多关于它的定义。也许每个线程都有自己的静态成员,甚至如果该线程访问类的多个副本?每个区块都有一个静态成员?每个内核?每个设备,因为类可以存在于内核调用之外的内存中?

来自CUDA编程指南的B 2.2:

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

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

您可以看看这个线程。