如果在内核中使用double,则cuda racecheck错误

时间:2018-03-27 04:22:44

标签: cuda race-condition memcheck

我是cuda编码的新手,最近我在编码时遇到了一个racecheck错误,这里是非常简化的代码我可以重复错误:(在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,在test.cu:14中为0x00000350进行写入访问: kernel(void)[1098危害]

如果反复运行,可以通过14,15或16行随机触发此错误。 如果我对以下列表执行任何操作,则可以删除该错误:

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

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

0 个答案:

没有答案