为什么不能共享成员变量?
Why can't member variables be shared?
我想在 CUDA 代码中实例化一个类,该类与同一块中的其他线程共享其一些成员。
但是,在尝试编译以下代码时,我收到错误:
attribute "shared" does not apply here
(NVCC 版本 4.2)。
class SharedSomething {
public:
__shared__ int i; // this is not allowed
};
__global__ void run() {
SharedSomething something;
}
这背后的理由是什么?是否有解决方法来实现所需的行为(跨一个块的类的共享成员)?
标记为
__shared__
的对象驻留在每个线程块专用的共享内存中。它的大小有限,并且具有与线程块相同的生存期。
所以这就是为什么你不能将类成员声明为共享的原因 - 它们的生存期不是由类实例管理,而是由线程块管理。可能static
类成员可以共享,但没有检查它。
有关详细信息,请参阅 CUDA 编程指南。
Rost解释了限制背后的理由。为了回答问题的第二部分,一个简单的解决方法是让内核声明共享内存,并初始化一个指向类拥有的它的指针,例如在类构造函数中。例。
class Foo
{
public:
__device__
Foo(int *sPtr) : sharedPointer(sPtr, gPtr) {
sharedPointer[threadIdx.x] = gPtr[blockIdx.x * blockDim.x + threadIdx.x];
__syncthreads();
}
__device__
void useSharedData() { printf("my data: %fn", sharedPointer[threadIdx.x]); }
private:
int *sharedPointer;
};
__global__ void example(int *gData)
{
__shared__ int sData[BLOCKDIM];
Foo f(sData, gData);
f.useSharedData();
}
警告:用浏览器编写的代码,未经验证,未经测试(这是一个微不足道的例子,但这个概念延伸到真正的代码 - 我自己也使用过这种技术)。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- C++预处理会生成变量成员、资源库和映射
- 局部堆栈变量成员的返回值优化
- Google Mock:在目标类的构造函数中实例化的模拟私有变量成员
- 使用指向结构变量成员的指针访问该结构的成员的地址
- 如果派生类仅包含自动变量成员,是否有必要具有虚拟驱动器
- 线程安全性和静态变量/成员功能
- "static const char array"可以在 C 语言上包含变量成员吗
- 仅用于内部目的的类的所有变量/成员的技术术语是什么
- 如何强制转换变量成员以将其作为函数的引用参数传递
- 类中未声明变量成员函数
- 在 main 中初始化类的 "static const" 类型变量成员的更好方法
- c++模板类静态const变量成员作为映射键给出未定义引用
- 在类中初始化结构变量成员会导致分割错误
- 在c++中建模变量成员类型
- 模板私有静态变量成员的未定义符号
- 不能访问公共静态变量成员
- 常量变量成员在C++有什么用?
- g++ 4.8.2坚持简单变量成员是数组