GPU 프로그래밍

스레드 블록 하나당 스레드 수의 상한이 1024개인 GPU에서 blockDim.x를 2048로 하여 CUDA 커널을 실행했다. 일반적으로 어떻게 되는가?

  1. AGPU가 자동으로 1024개씩 두 개의 블록으로 나누어 실행한다
  2. B처음 1024개의 스레드만 실행되고 나머지는 무시된다
  3. C실행 설정이 잘못된 것으로 처리되어 커널은 실행되지 않고 오류가 반환된다
정답과 해설 보기

정답: C. 실행 설정이 잘못된 것으로 처리되어 커널은 실행되지 않고 오류가 반환된다

스레드 블록의 스레드는 모두 하나의 SM에 동시에 올라가 공유 메모리나 __syncthreads()로 협력할 수 있어야 하므로, 블록 하나당 스레드 수에는 상한이 있습니다. 상한을 넘는 설정으로 실행하면 커널은 스레드가 하나도 실행되지 않고, 실행 설정이 잘못되었음을 나타내는 오류가 됩니다. 커널 실행은 값을 반환하지 않으므로 cudaGetLastError() 등으로 오류를 확인하지 않으면 결과 배열이 갱신되지 않았다는 사실을 알아차리기 어렵습니다. 2048개분의 작업은 1024개 이하의 블록을 여러 개 실행하여 분담시킵니다.

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

관련 계산 도구

GPU 프로그래밍의 다른 문제

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

이 분야의 비교