GPU 프로그래밍

CUDA에서 GPU 커널(__global__을 붙인 함수)이 계산한 결과를 CPU 측 프로그램에서 받는 방법으로 올바른 것은?

  1. A커널의 반환값(return)으로 모든 스레드의 결과가 한꺼번에 CPU로 돌아온다
  2. B커널이 결과를 GPU 메모리상의 배열에 쓰고, CPU 측은 커널 종료 후 그 배열을 CPU 메모리로 복사하여(또는 통합 메모리를 읽어) 받는다
  3. C각 스레드가 printf로 출력한 값을 CPU 측 프로그램이 변수로 읽어 들인다
정답과 해설 보기

정답: B. 커널이 결과를 GPU 메모리상의 배열에 쓰고, CPU 측은 커널 종료 후 그 배열을 CPU 메모리로 복사하여(또는 통합 메모리를 읽어) 받는다

GPU 커널은 많은 스레드가 동시에 실행하므로 하나의 반환값으로 결과를 돌려줄 수 없으며, CUDA에서는 __global__ 함수의 반환형이 void로 정해져 있습니다. CPU 측은 GPU 메모리에 배열을 확보하고 그 포인터를 인수로 넘기며, 각 스레드는 담당하는 요소에 결과를 씁니다. 커널 실행은 비동기이므로, 커널이 끝난 뒤 cudaMemcpy 등으로 배열을 CPU 측으로 복사합니다(같은 스트림이라면 복사는 앞선 커널의 종료를 기다립니다). 커널 안의 printf는 표시를 위한 디버깅 수단이며, 그 값을 프로그램에서 받을 수는 없습니다.

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

관련 계산 도구

GPU 프로그래밍의 다른 문제

  1. 스레드 블록 하나당 스레드 수의 상한이 1024개인 GPU에서 blockDim.x를 2048로 하여 CUDA 커널을 실행했다. 일반적으로 어떻게 되는가?
  2. GPU의 SM에 명령을 발행하는 장치가 하나 있고, 1사이클에 하나의 워프에서 명령을 발행할 수 있다고 한다. 각 워프는 '20사이클분의 명령을 발행한 뒤 메모리 읽기 결과가 도착할 때까지 400사이클 기다리는' 것을 반복한다. 워프 전환에 시간이 걸리지 않을 때, 메모리 대기로 인한 빈 시간을 없애는(레이턴시 은닉) 데 필요한 워프 수는 최소 몇 개인가?
  3. CPU와 GPU의 설계 사고방식의 차이로 올바른 것은?
  4. GPU에서 빠르게 처리할 수 있는 작업의 특징으로 가장 적절한 것은?
  5. GPU에서 실행하면 효율이 떨어지기 쉬운 처리는?

이 분야의 비교