以下は、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回割り切れると期待していました。私は彼らが何かを分割する順序は固定されていないことを理解しています。したがって、値を印刷しようとすると、印刷された値の1つが8、1が4、1が2、1が1となることが予想されました。しかし、すべての印刷値は8でした。 ?すべてのスレッドが*何かを一度分割するべきではない。
ロックステップは何を意味しますか?それらがロック機構に従うと、実行はアトム – Programmer
ロックステップは、すべてのスレッドが同じ命令を同時に実行することを意味します。実際、CPU命名法を使用する場合は、4ワイドSIMDとして実行するスレッドが1つだけであることに匹敵します。 1つの命令が4つの「スレッド」についてメモリから読み出し、1つの命令が除算を行い、1つの命令が4つの値を(同じメモリ位置に)書き込む。 – Bahbar