don';无法理解cuda中与共享内存中的结构数组相关的此警告

don';无法理解cuda中与共享内存中的结构数组相关的此警告,cuda,Cuda,我的代码运行正常,但我不理解这个警告 警告:具有非空构造函数或解构器的共享内存变量(线程之间的潜在竞争) 我有一个名为facet_cuda的结构 struct facet_cuda { IS_Vector_cuda v[3]; IS_Vector_cuda normal; double z; }; IS\u Vector\u cuda是一个具有默认构造函数的类 在全局函数中,我在共享内存中创建一个面数组,由块中的每个线程填充 __shared__ facet_cuda Faces[BlockS

我的代码运行正常,但我不理解这个警告

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

我有一个名为facet_cuda的结构

struct facet_cuda {
IS_Vector_cuda v[3];
IS_Vector_cuda normal;
double z; };
IS\u Vector\u cuda
是一个具有默认构造函数的类

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

__shared__ facet_cuda Faces[BlockSize];
不确定会发生什么潜在的竞争条件


谢谢

您可能需要阅读有关构造函数的说明


全局(即
\uuuu device\uuuu
)或
\uuuu shared\uuuu
内存变量(根据定义,这些变量的作用域跨越多个线程)的设备代码中隐含的构造函数会引发这样一个问题:谁(哪个线程或多个线程)将运行构造函数?如果多个线程可以运行构造函数,则可能会出现竞态条件。

竞态条件的产生是因为您声明了
结构facet\u cuda的数组

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

struct facet_cuda {
   IS_Vector_cuda v[3];
   IS_Vector_cuda normal;
   double z; 
   __device__ facet_cuda() {};
};

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

谢谢。我现在明白了。对于C++11,默认构造函数声明更好地使用
=default