GPU 프로그래밍

위 CUDA 커널에 "if (i < n)"을 넣은 이유로 올바른 것은?

__global__ void add(float *c, const float *a,
                    const float *b, int n) {
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    if (i < n)
        c[i] = a[i] + b[i];
}
  1. A스레드 총수가 요소 수보다 많을 때, 남는 스레드가 배열 범위 밖을 읽거나 쓰지 않도록 하기 위해
  2. B덧셈 결과가 n을 넘지 않도록 하기 위해
  3. CGPU 속도를 2배로 하기 위해
정답과 해설 보기

정답: A. 스레드 총수가 요소 수보다 많을 때, 남는 스레드가 배열 범위 밖을 읽거나 쓰지 않도록 하기 위해

스레드는 블록 단위로 실행되므로 요소 수가 블록 크기의 배수가 아니면 스레드 총수가 요소 수를 넘습니다. 번호를 확인하지 않고 쓰면 할당된 배열 밖의 메모리를 망가뜨리거나 잘못된 접근으로 오류가 발생합니다. "i < n" 확인은 GPU 커널을 작성할 때 거의 정해진 형태입니다.

이 분야 연습하기 분야로 돌아가기

GPU 프로그래밍의 다른 문제

  1. NVIDIA GPU에서 32개의 스레드를 하나의 묶음으로 하여 같은 명령을 일제히 실행하는 단위를 무엇이라 하는가?
  2. GPU의 SIMT(단일 명령·다중 스레드) 방식과 CPU의 SIMD 명령의 차이로 올바른 것은?
  3. 하나의 워프 안에서 조건 분기에 의해 스레드의 절반이 if 쪽, 나머지 절반이 else 쪽으로 갈라졌다(워프 다이버전스). 일반적으로 어떻게 실행되는가?
  4. 위의 (1)과 (2)는 모두 스레드의 절반에 A, 나머지에 B를 실행시킨다. 워프 효율 측면에서 올바른 설명은? (1워프=32스레드로 한다)
  5. GPU의 메모리 병합 접근(코얼레싱)에 대한 설명으로 올바른 것은?

이 분야의 비교