【发布时间】:2021-12-26 00:12:14
【问题描述】:
我有一个结构简单的构造函数,比如
struct TResult
{
int field1, field2;
__host__ __device__ TResult()
: field1(0),
field2(0)
{ }
};
并收集类似的代码
#define BLOCK_SIZE 128
__global__ void uniteResults(TResult *destResults, TResult *srcResults)
{
__shared__ TResult sums[BLOCK_SIZE];
sums[threadIdx.x] = TResult();
//...
}
据我了解,我正确实现了共享数组的初始化。 但我得到了
warning : dynamic initialization is not supported for a function-scope static __shared__ variable within a __device__/__global__ function
对于 __shared__ 行。好的,这意味着应该调用构造函数,但是 Nvidia 的编译器不能这样做。如何正确实施,让每个人都开心?
【问题讨论】:
-
显而易见的问题是哪个线程应该在定义时运行构造函数?如果他们都这样做,那么你就有了记忆竞赛。答案是有一个默认的可构造类型。如果您需要初始化,请在每个块调用中定义一个线程或执行它。
-
您还可以切换到动态分配的共享内存(或者甚至静态分配的基本类型,如
char和reinterpret_cast)然后从单个线程执行放置new以初始化您的对象,而无需更改任何课程代码。 -
你能写代码吗? __shared__ TResult sums[];?
标签: c++ visual-studio cuda