不理解cuda中与_shared_ memory中的结构数组相关的警告

od0*_*d08 2 cuda

我的代码运行正常,但我不明白这个警告.

警告:具有非空构造函数或解构函数的共享内存变量(线程之间的潜在竞争)

我有一个名为facet_cuda的结构

struct facet_cuda {
IS_Vector_cuda v[3];
IS_Vector_cuda normal;
double z; };
Run Code Online (Sandbox Code Playgroud)

IS_Vector_cuda 是一个具有默认构造函数的类.

在全局函数内部,我在共享内存中创建一个facet数组,由块中的每个线程填充

__shared__ facet_cuda Faces[BlockSize];
Run Code Online (Sandbox Code Playgroud)

不确定可能发生什么样的竞争条件.

谢谢

tal*_*ies 5

竞争条件的出现是因为你声明了一个数组struct facet_cuda.

在C++中,每当声明一个类的数组时,都会调用默认构造函数来初始化该数组的所有元素.默认构造函数不是空函数.编译器发出警告,因为它没有在CUDA模型中定义如何初始化共享内存(即,哪个线程或线程应该实际运行构造函数来设置值).你应该能够通过为设备定义一个空构造函数来解决这个问题

struct facet_cuda {
   IS_Vector_cuda v[3];
   IS_Vector_cuda normal;
   double z; 
   __device__ facet_cuda() {};
};
Run Code Online (Sandbox Code Playgroud)

编译器应该优化构造函数,警告应该消失(注意完全未经测试......).