GPU 프로그래밍
CUDA에서 GPU 커널(__global__을 붙인 함수)이 계산한 결과를 CPU 측 프로그램에서 받는 방법으로 올바른 것은?
- A커널의 반환값(return)으로 모든 스레드의 결과가 한꺼번에 CPU로 돌아온다
- B커널이 결과를 GPU 메모리상의 배열에 쓰고, CPU 측은 커널 종료 후 그 배열을 CPU 메모리로 복사하여(또는 통합 메모리를 읽어) 받는다
- C각 스레드가 printf로 출력한 값을 CPU 측 프로그램이 변수로 읽어 들인다
정답과 해설 보기
정답: B. 커널이 결과를 GPU 메모리상의 배열에 쓰고, CPU 측은 커널 종료 후 그 배열을 CPU 메모리로 복사하여(또는 통합 메모리를 읽어) 받는다
GPU 커널은 많은 스레드가 동시에 실행하므로 하나의 반환값으로 결과를 돌려줄 수 없으며, CUDA에서는 __global__ 함수의 반환형이 void로 정해져 있습니다. CPU 측은 GPU 메모리에 배열을 확보하고 그 포인터를 인수로 넘기며, 각 스레드는 담당하는 요소에 결과를 씁니다. 커널 실행은 비동기이므로, 커널이 끝난 뒤 cudaMemcpy 등으로 배열을 CPU 측으로 복사합니다(같은 스트림이라면 복사는 앞선 커널의 종료를 기다립니다). 커널 안의 printf는 표시를 위한 디버깅 수단이며, 그 값을 프로그램에서 받을 수는 없습니다.