0

我是 cuda 编码的新手,最近我在编码时遇到了一个 matchcheck 错误,这是我可以重复错误的非常简化的代码:(在 Linux 和 Windows 上测试)

//test.cu:
__global__ void kernel(){

__shared__ double s1;
__shared__ double s2;
__shared__ double s3;
__shared__ double a1;
__shared__ double a2;
__shared__ double a3;

s1=1.0E-3;
s2=1.0E-3;
s3=1.0E-3;
a1=1.0E-3; // line 14
a2=1.0E-3; // line 15
a3=1.0E-3; // line 16

__syncthreads();
}

int main(){

dim3 blockdim(32,32);
kernel<<<1,blockdim>>>();
cudaDeviceReset();
return 0;
}

然后编译代码: nvcc -G -g test.cu -o test

然后使用以下命令测试代码: cuda-memcheck --tool racecheck test

我收到如下错误: ========= 错误:在 test.cu:14:kernel(void) ========= 的 0x00000350 处的写入访问和在 0x00000350 的写入访问之间报告了竞争test.cu:14:kernel(void) [1098 危险]

如果重复运行,此错误可能由第 14,15 或 16 行随机触发。如果我执行以下列表中的任何操作,则可以删除该错误:

  1. 删除“cudaDeviceReset()”
  2. 将块中的线程数减少几个线程,例如 (16, 32)
  3. 将所有变量类型从“double”更改为“float”
  4. 从代码中删除变量“s1”、“s2”和“s3”

这真的让我很困惑,并导致我有一个幼稚的问题,每个线程都试图执行内核函数中的每个句子吗?谢谢!

4

0 回答 0