티스토리 뷰

728x90
반응형

본 포스팅은 "머신러닝과 블록체인을 떠받치는 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을 관리할 수 있다고 나와있습니다.

https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#features-and-technical-specifications

 

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)을 지정해 주는것이 현재로썬 가장 좋다

728x90
반응형

'컴퓨터과학 > 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
링크
«   2024/12   »
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
글 보관함