티스토리 뷰
본 포스팅은 "머신러닝과 블록체인을 떠받치는 GPU의 모든 기술" 책을 읽고, 글쓴이의 생각을 정리하는 포스팅 입니다.
https://book.naver.com/bookdb/book_detail.nhn?bid=13499076
1. GPU구조
GPU의 구조를 극도로 간소화 하면, 아래와 같습니다.
GPU 칩 내부에 숫자연산을 할 수 있는 연산기 다수 + 캐시가 존재하고, 부족한 캐시용량을 RAM을 사용해서 메모리 계층구조를 생성합니다.
GPU는 개별적인 OS운용이나 프로그램의 실행이 어렵기 때문에, PCI를 통해서 CPU와 통신을 합니다.
CPU로부터 필요한 Kernal 함수(GPU에서 계산할 함수)를 전달받거나, CPU RAM의 데이터를 GPU RAM으로 복사시켜 동작합니다.
그럼, 위의 극도로 추상화된 GPU가 실제 최신 그래픽카드에서 어떤지 살짝 알아보겠습니다.
1_1. Nvidia
https://developer.nvidia.com/blog/nvidia-ampere-architecture-in-depth/
N당의 경우
정수연산기 16개, 실수연산기 16개, 정밀실수연산기 8개, Load/Store Unit 8개 ,SFU(Special Function Unit) 1개 ,Tensor Core1개가
1개의 연산 Block가 됩니다.
(위의 정수, 실수연산기를 Cuda Core라고 부릅니다)
Float 연산기 16개 = Block
Block 4개 = SM(Streaming multiprocessor)
SM 2개 = TPC(Texture Proces Cluster)
TPC 8개 = GPC(Graphics Processing Cluster)
Nvdia A100의 경우
16CUDA/Block * 4Block/SM * 2SM/TPC * 8TPC/GPC * 8GPC/1GPU= 8192 CUDA/GPU
이상적으로 동작할 때 8192개의 부동소수점 연산을 1Hz마다 두번씩 가능하므로,
(이때 불량을 고려해서 TPC10개가 비활성화 또는 제거되어 6912개가 동작합니다.)
6912 Float op / HZ * 1.410GHz/s * 2Operation/op = 19500GFlops = 19.5TFlops
의 두뇌풀가동 연산 성능을 갖게 됩니다.
1_2. AMD
https://www.amd.com/system/files/documents/rdna-whitepaper.pdf
A당의 경우
정수/실수 연산기를 SP(Streaming Processor)라고 부릅니다.
SP 32개 = SPs(Streaming Processors) or SIMD Engine
SPs 2개 = CU(Computing Unit)
CU 2개 = DCU(Dual CU) or WGP(Work Group Processor)
때문에, AMD 5700XT의 경우
32 SP/SPs * 2SPs/CU * 2CU/DCU * 20DCU/1GPU = 2560SP/GPU가 되고
이상적으로 동작할 때 2560개의 부동소수점 연산을 1Hz마다 두번씩 가능하므로,
2560 Float op / HZ * 1.905GHz/s * 2Operation/op = 9750GFlops = 9.75TFlops
의 두뇌풀가동 연산 성능을 갖게 됩니다.
2. WORK의 단위
위에서 갑자기 재미없는 단위환산 놀이를 한 이유는 이 단위가 생각보다 OpenCL을 프로그래밍 하는데 중요한 요인이 되기 때문입니다.
지난 포스팅에서 gpu의 발전 방향이 SIMD -> SIMT로 발전되었다고 했습니다.
CPU에서는 Work를 저장한 Thread를 다수 만들고, 이 Thread가 GPU로 전달되며 GPU는 이 Thread를 처리하게 됩니다.
이때, Thread를 단순히 1~N개의 1차원 형식으로 전달하는것이 아니라
Cuda에서는 Thread를 모아서 Block을, Block을 모아서 Grid를 생성합니다.
OpenCL의 경우 Work(=Thread)를 모아서 Work Group(=Block), Work Group을 모아서 ND Range(=Grid)를 만듭니다.
GPU역시 한정된 자원으로 동작하는 장치인 만큼, 레지스터 <-> 캐시 <-> GDDR의 메모리 계층구도를 이루고 있습니다.
이때, Work Group(=Block)에 존재하는 Work(=Thread)는 무조건 같은 CU(혹은 SM)에 할당됩니다.
때문에 동일한 Data를 공유해야하는 Work가 다른 CU(혹은 SM)에 할당된 경우 CU(혹은 SM)끼리의 데이터 교환(다른 CU, SM의 Cache의 데이터 조회)이 발생하고, 이 때문에 불필요한 오버헤드가 발생할 수 있습니다.
(같은 CU 혹은 SM에 할당하기 위해서 Group(=Block)와 ND Range(=Grid)의 차원을 조절하게 됩니다)
때문에 OpenCL을 활용해서 빠른 성능을 얻고자 한다면 이러한 아키텍쳐의 대략적인 처리방향을 알면 큰 도움이 됩니다.
'컴퓨터과학 > GPU' 카테고리의 다른 글
GPU프로그래밍_1(개념) (0) | 2022.03.03 |
---|---|
GPU의 Thread(Work) 처리 방법 (0) | 2022.03.03 |
GPU 메모리 구조 (0) | 2022.03.03 |
GPU 성능지표와 메모리 대역폭 (0) | 2022.02.25 |
SIMD와 SIMT (0) | 2022.02.24 |
- Total
- Today
- Yesterday
- 동적계획법
- 자료구조
- C++
- 완전탐색 알고리즘
- hash
- 사칙연산
- Sort알고리즘
- Search알고리즘
- prime number
- 알고리즘
- Greedy알고리즘
- 컴퓨터그래픽스
- GDC
- heap
- Python
- 코딩테스트
- AVX
- stack
- 프로그래머스
- SIMD
- 병렬처리
- 분할정복
- git
- 이분탐색
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |