그래픽 처리 유니트 (GPU) - GPU의 개념과 CUDA 프로그래밍
글 작성자: _rian
원래 GPU는 실시간 그래픽 처리용으로 개발되었으나, 계산 능력이 강화되어 일반적인 산술 연산 처리에도 쉽게 이용할 수 있도록 개선되면서 다양한 데이터 병렬 응용(data parallel application)들을 위한 가장 이상적인 보조 프로세서로서의 입지를 굳혀가고 있다.
초기 GPU는 몇 가지 치명적인 결점들을 가지고 있었는데 다양한 데이터 병렬 응용을 위한 범용 GPU로 발전하게 된 계기가 있는데, 이는 아래와 같다.
- 통합된 그래픽 및 계산 구조 (unified graphic and compute architecture) : 그래픽 응용뿐 아니라 일반적인 계산에도 적합한 하드웨어 구조
- CUDA (Compute Unified Device Arcitecture) 프로그래밍 모델 : 일반적인 프로그래밍 언어들을 이용하여 GPU를 위한 프로그램을 쉽게 작성할 수 있게 해주는 프로그래머-친화적 병렬 컴퓨팅 플랫폼으로서, NVIDIA 사에 의해 개발된 프로그래밍 모델
위의 두 가지 기술들이 도입됨으로써, GPU 사용자는 C 프로그램에 CUDA 확장자들만 추가하면 대규모 병렬 프로세서를 이용할 수 있게 되었다.
GPU의 내부 구성
- 다수의 스트리밍 다중 프로세서들 (streaming multiprocessor : SM)
- 각 SM 내에는 실제 프로그램 코드를 수행하는 다수의 스트리밍 프로세서들 (streaming processor : SP)
CUDA 프로그램
2007년 NVIDIA사에서 개발한 병렬 프로그래밍 모델이다. CPU 및 GPGPU를 이용한 응용 프로그램의 병렬 처리를 지원한다. 프로그래머 친화적 병렬 컴퓨팅 플랫폼으로써, GPU 활용 증대에 크게 기여하였다.
CUDA 프로그램을 처리하는 컴퓨터 시스템
일반적인 CPU 혹은 컴퓨터를 지칭하는 호스트(host)와 GPU 같은 병렬 프로세서를 지칭하는 디바이스 (device)로 구성된다.
- 호스트 (host) : 일반적인 CPU, PC 혹은 SMP. 순차적 프로그램 처리
- 디바이스 (device) : GPU와 같은 병렬 프로세서로 계산량이 많고 병렬처리 가능한 부분을 처리함.
CUDA 프로그램의 구성 요소들
- 호스트 코드 : ANSI C 기반의 순차적 프로그램
- 디바이스 코드 : ANSI C 코드와 커널 함수(kernel function)로 구성
- 커널 함수 : 병렬 함수 및 데이터 구조를 명시하는 키워드들을 확장한 형태로 작성된 코드로서, 디바이스가 실행하는 부분 (병렬 처리가 가능한 부분)
- 스레드 (thread) : 커널 함수의 한 인스턴스 (instance)로서, GPU의 SP(CUDA 코어)에 의해 실행
- 그리드 (grid) : 하나의 병렬 커널에 의해 실행되는 스레드 전체
- 블록 (block) : 그리드 내의 스레드들을 적절한 수의 스레드들로 분할한 단위 -> 하나의 스트리밍 프로세서 (SM)에게 할당
CUDA 프로그램 실행 과정
- 호스트가 순차적 코드를 실행한다.
- 커널 함수가 호출되면, 병렬 커널 코드가 디바이스로 보내진다.
- 디바이스에서 커널이 그리드(다수의 블록 및 스레드들 포함)를 생성하여 SM들에게 할당하며, SM내의 SP들이 한 스레드씩을 담당하여 실행한다.
- 모든 스레드들의 실행이 완료되면 그리드가 종료되고, 결과값들이 호스트로 전송된다.
- 호스트는 다음 순차적 코드를 실행하며, 또 다른 커널을 만난다면 2~4번 과정을 반복한다.
GPU 기억장치 계층
- 지역 기억장치 (local memory) : 각 스레드가 사용하며, 주로 레지스터 세트로 구현
- 공유 기억장치 (shared memory) : 같은 블록에 포함된 스레드들이 공동으로 사용
- 전역 기억장치 (global memory) : 모든 응용프로그램들이 생성한 그리드들이 공유하는 기억장치로서, 호스트와 GPU 간의 데이터 교환에도 사용됨.
CUDA 실행을 위한 기억장치 구조
호스트 - 디바이스 간 정보 전송을 위한 함수들
- 기억 장소 할당 : cudaMalloc((void**)&MD, size);
- 데이터 전송 (호스트 -> 디바이스) : cudaMemcpy(Md, M, size, cudaMemcpyHostToDevice);
- 데이터 전송 (디바이스 -> 호스트) : cudaMemcpy(Md, M, size, cudaMemcpyDeviceToHost);
- 기억 장소 해제 : cudaFree(Md);
Reference
김종현, (2019) '컴퓨터 구조론", 생능 출판사
'Computer Engineering > 병렬 처리(Parallel Processing)' 카테고리의 다른 글
[병렬 처리] 고성능 입출력 시스템 구조 (0) | 2019.06.20 |
---|---|
[병렬처리] 상호 연결망 구조 - 정적 상호 연결망의 종류 (0) | 2019.06.20 |
단일-버스 다중프로세서 시스템(2) - 캐쉬 일관성 유지를 위한 버스 감시 매커니즘 (MESI protocol), 디렉토리 기반 캐쉬 프로토콜 (0) | 2019.06.18 |
단일-버스 다중프로세서 시스템(1) - 버스 중재 방식과 캐시 일관성 유지 방법 (0) | 2019.06.17 |
다중-버스 다중 프로세서 시스템 - 크로스바 네트워크, 다중-버스, 계층 버스 구조 (0) | 2019.06.17 |
댓글
이 글 공유하기
다른 글
-
[병렬 처리] 고성능 입출력 시스템 구조
[병렬 처리] 고성능 입출력 시스템 구조
2019.06.20 -
[병렬처리] 상호 연결망 구조 - 정적 상호 연결망의 종류
[병렬처리] 상호 연결망 구조 - 정적 상호 연결망의 종류
2019.06.20 -
단일-버스 다중프로세서 시스템(2) - 캐쉬 일관성 유지를 위한 버스 감시 매커니즘 (MESI protocol), 디렉토리 기반 캐쉬 프로토콜
단일-버스 다중프로세서 시스템(2) - 캐쉬 일관성 유지를 위한 버스 감시 매커니즘 (MESI protocol), 디렉토리 기반 캐쉬 프로토콜
2019.06.18 -
단일-버스 다중프로세서 시스템(1) - 버스 중재 방식과 캐시 일관성 유지 방법
단일-버스 다중프로세서 시스템(1) - 버스 중재 방식과 캐시 일관성 유지 방법
2019.06.17