下面是我寫的一個小程序,用於查看CUDA中如何發生競爭情況,但我對輸出感到驚訝。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.爲什麼是這樣?不應該所有的線程都會分開*一次。
鎖步是什麼意思?如果它們遵循鎖定機制,那麼執行是原子的。 – Programmer
鎖定步驟意味着所有線程同時執行相同的指令。事實上,如果您使用CPU命名法,則與只有一個執行爲4寬SIMD的線程相當。一條指令從內存中讀取4個「線程」,一條指令執行除法,一條指令寫入4個值(到同一個內存位置)。 – Bahbar