티스토리 뷰
본 포스팅은 "머신러닝과 블록체인을 떠받치는 GPU의 모든 기술" 책을 읽고, 글쓴이의 생각을 정리하는 포스팅 입니다.
https://book.naver.com/bookdb/book_detail.nhn?bid=13499076
머신러닝과 블록체인을 떠받치는 GPU의 모든 기술
이 책은 GPU의 기본 구조와 기술 동향에 초점을 맞춘 해설서입니다. 3D 그래픽, 게임, 모바일, VR/AR, 과학 기술 계산, 그리고 인공지능/딥러닝에 이르기까지 폭넓은 분야에서 GPU/병렬 계산의 중요도
book.naver.com
1. Work Group(Thread Block)
1_1. Nvidia
Cuda의 경우 Thread를 모아서 Block을, Blcok을 모아서 Grid를 만듭니다.
그리고 한 Block의 Thread는 무조건 같은 SM에 할당된다고 하였습니다.
만약 650개의 Thread가 하나의 Block에 있다면, 이제 드디어 최고의 성능을 볼 수 있을까요?
안타깝게도 아닙니다.
N당 GPU기준으로 32개의 Thread를 1개의 Warp로 지정하고, 이 Warp를 Pool형태로 관리하게 됩니다
https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#simt-architecture
Programming Guide :: CUDA Toolkit Documentation
Texture gather is a special texture fetch that is available for two-dimensional textures only. It is performed by the tex2Dgather() function, which has the same parameters as tex2D(), plus an additional comp parameter equal to 0, 1, 2, or 3 (see tex2Dgathe
docs.nvidia.com
따라서, Giga Thread Engine을 사용해서 위의 650개의 Thread의 경우 32*20 + 10 총 21개의 Warp Pool이 생성됩니다
(이때 8개인 Warp의 경우 나머지 22개의 Dummy Thread로 채워집니다)
그리고 이 Warp를 스케쥴러를 사용해 적절하게 Cuda Core에 전달하여 연산이 이뤄집니다.
Warp Pool의 크기는 제한이 있으며, 최신 아키텍쳐의 경우 최대 48개의 Warp Pool을 관리할 수 있다고 나와있습니다.
Programming Guide :: CUDA Toolkit Documentation
Texture gather is a special texture fetch that is available for two-dimensional textures only. It is performed by the tex2Dgather() function, which has the same parameters as tex2D(), plus an additional comp parameter equal to 0, 1, 2, or 3 (see tex2Dgathe
docs.nvidia.com
따라서 최신 아키텍쳐 기준 1개의 Thread Block내 Thread는 최대 48 Warp * 32 Thread/Warp = 1536개를 넘지않게 프로그래밍을 해줘야 합니다.
1_2. AMD
과거 GCN 아키텍쳐를 기준으로
16SP = 1SIMD Engine
4SIMD Engine = 1CU
이때 Work(=Thread)를 Work Group(Thread Block)으로 묶고, 하나의 1CU할당되게 되어있습니다.
이때 Nvidia의 Warp와 유사하게 A당은 WaveFront라는 단위로 Work의 Pool을 만듭니다.
Work 64개 = 1WaveFront
였습니다.(GCN 아키텍쳐 기준)
하지만 64개의 Work가 64개의 SP에 분배되어 처리되는것이 아니라 1개의 SIMD Engine에 할당되고 16*4를 하여 처리되는 것으로 알려져 있습니다.
(각 SIMD Engine끼리는 다른 명령어를 처리할 수 있고, Data이동 Latency를 감추기 용이했다고 합니다)
하지만 64개를 기준 단위로 할 경우 650개의 Thread의 경우 64*10 + 10 총 11개의 Work Group이 발생하고, 54개의 Dummy Work를 사용하게 됩니다.
(물론 64개를 사용하는게 유리할 때도 있지만, 다수의 경우 32개 단위로 처리할 때 Dummy의 양이 줄어듭니다)
최근 RDNA 아키텍쳐에서는 SIMD Engine(16SP -> 32SP)과 WaveFront(64Work -> 32Work)의 크기가 같게 변경되어
Work 32개 = 1WaveFront
로 변경되었다고 합니다.(물론 기존 64WaveFront도 지원합니다)
https://en.wikipedia.org/wiki/RDNA_(microarchitecture)
RDNA (microarchitecture) - Wikipedia
From Wikipedia, the free encyclopedia Jump to navigation Jump to search GPU microarchitecture and accompanying instruction set architecture A generic block diagram of a GPU. RDNA (Radeon DNA[2][3]) is the codename for a GPU microarchitecture and accompanyi
en.wikipedia.org
정리 : N당 A당 모두 32의 배수 형태로 Thread Block(Work Group)을 지정해 주는것이 현재로썬 가장 좋다
'컴퓨터과학 > GPU' 카테고리의 다른 글
GPU프로그래밍_2(메모리, 특수 변수Type) (0) | 2022.03.04 |
---|---|
GPU프로그래밍_1(개념) (0) | 2022.03.03 |
GPU 메모리 구조 (0) | 2022.03.03 |
GPU구조와 Thread(Work)의 단위 (0) | 2022.02.26 |
GPU 성능지표와 메모리 대역폭 (0) | 2022.02.25 |
- Total
- Today
- Yesterday
- stack
- git
- react
- 분할정복
- heap
- 이분탐색
- javascript
- 청첩장
- 셀프모청
- hash
- Greedy알고리즘
- SIMD
- 코딩테스트
- 동적계획법
- 프로그래머스
- C++
- Sort알고리즘
- Search알고리즘
- 모바일청첩장
- 사칙연산
- AVX
- 자료구조
- 컴퓨터그래픽스
- GDC
- 알고리즘
- 병렬처리
- Python
- 완전탐색 알고리즘
- prime number
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |