Ошибка cuda racecheck при использовании double в ядре
Я новичок в кодировании cuda, недавно я столкнулся с ошибкой проверки при кодировании, и вот очень упрощенный код, который я могу повторить ошибку: (протестировано в 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
и я получил ошибки, такие как: ========= ОШИБКА: сообщается о гонке между доступом на запись в 0x00000350 в test.cu:14:kernel(void) ========= и доступом на запись в 0x00000350 в test.cu:14:kernel(void) [1098 опасностей]
Эта ошибка может быть случайно вызвана строкой 14,15 или 16, если она запускается повторно. Ошибка может быть устранена, если я сделаю какое-либо действие из списка ниже:
- удалить "cudaDeviceReset()"
- уменьшить количество потоков в блоке на несколько потоков, например (16, 32)
- изменить все типы переменных с "double" на "float"
- удалите переменные "s1", "s2" и "s3" из кода
Это действительно озадачивает меня и заставляет задаться наивным вопросом: каждый ли поток пытается выполнить каждое предложение в функции ядра? Спасибо!