Ниже приведена небольшая программа, которую я написал, чтобы увидеть, как могут возникнуть условия гонки в CUDA, но я был удивлен результатом.
#include<cutil.h>
#include<iostream>
__global__ void testLocal(int *something, int val[]){
*something = *something/2;
val[threadIdx.x] = *something;
}
void main(){
int *a, *c;
int r =16;
cudaMalloc((void**)&a, 4*sizeof(int));
cudaMalloc((void**)&c, sizeof(int));
cudaMemcpy(c, &r, sizeof(int) , cudaMemcpyHostToDevice);
testLocal<<<1,4>>>(c,a);
int *b = (int *)malloc(4 * sizeof(int));
cudaMemcpy(b,a, 4 * sizeof(int), cudaMemcpyDeviceToHost);
for( int j =0 ; j< 4; j++){
printf("%d\n",b[j]);
}
getchar();
}
Поскольку я запускаю 4 потока, я ожидал, что каждый поток разделит * что-то на 2 раза. Я понимаю, что порядок, в котором они будут делиться *, не является фиксированным. Таким образом, когда я пытался напечатать значения, я ожидал, что одно из напечатанных значений будет 8, одно будет 4, одно будет 2 и одно будет 1. Однако все напечатанные значения были 8. Почему это ? Не должны ли все потоки разделить * что-то один раз.