아래는 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이고 하나는 4, 하나는 2, 하나는 1이 될 것으로 예상했습니다. 그러나 인쇄 된 값은 모두 8이었습니다. 왜 이것이 ? 모든 스레드가 * 무언가를 한 번 분할해서는 안됩니다.
잠금 단계는 무엇을 의미합니까? 그들이 락 메커니즘을 따르는 경우 실행은 원자 – Programmer
입니다. lock-step은 모든 스레드가 동시에 같은 명령어를 실행 함을 의미합니다. 사실, CPU 명명법을 사용하면 4 와이드 SIMD로 실행되는 스레드가 하나 뿐인 것과 비교할 수 있습니다. 단일 명령어가 4 개의 "스레드"에 대해 메모리에서 읽으면 단일 명령어가 나누기를 수행하고 단일 명령어는 4 개의 값을 동일한 메모리 위치에 씁니다. – Bahbar