티스토리 뷰

728x90
반응형

본 포스팅은 "머신러닝과 블록체인을 떠받치는 GPU의 모든 기술" 책을 읽고, 글쓴이의 생각을 정리하는 포스팅 입니다.

https://book.naver.com/bookdb/book_detail.nhn?bid=13499076 

 

머신러닝과 블록체인을 떠받치는 GPU의 모든 기술

이 책은 GPU의 기본 구조와 기술 동향에 초점을 맞춘 해설서입니다. 3D 그래픽, 게임, 모바일, VR/AR, 과학 기술 계산, 그리고 인공지능/딥러닝에 이르기까지 폭넓은 분야에서 GPU/병렬 계산의 중요도

book.naver.com

 

1. GPU 프로그래밍의 메모리

 

GPU프로그래밍의 메모리를 추상화해서 정리하면 아래와 같습니다.

 

출처 : https://www.khronos.org/registry/OpenCL/specs/3.0-unified/html/OpenCL_API.html#_fundamental_memory_regions

 

GPU 프로그래밍 상의 메모리 계층도

1_1. Shared Memory(=OpenCL Local Memory).

N당의 경우 SM, A당의 경우 CU단위로 존재하던 Shared Memory에 해당합니다. 각 Work Group(Thread Block)의 Work(Thread)끼리 빠른 데이터 공유가 가능한 SRAM에 해당합니다. 

 

1_2. Global Memory(=OpenCL Global Memory).

모든 Work(Thread)가 접근 가능한 GPU메모리 입니다. CPU에서 DDR메모리와 같은 포지션을 하고 있습니다. 데이터가 없을 경우 CPU와 통신해서 CPU의 DDR메모리(Host Memory)에서 데이터를 가지고 옵니다.

 

유사하게 Const Memory가 존재하는데, 이 경우는 Glboal과 유사하나 상수만 저장 가능하게(Read Only) 제한한 경우입니다.(이 경우 Read 속도가 빠르다고 하네요)

 

1_3. Local Memory(=OpenCL Private Memory).

Shared Memory와 유사한 구조를 가지고 있습니다(Work Group 혹은 Thread Block 단위로 공유). 대신 장치메모리쪽에 존재하기 때문에 CPU에서 가상메모리처럼 동작하는걸로 추정해 볼 수 있습니다.

 

OpenCL의 경우 레지스터, L2 Cache, 장치메모리가 모두 이 부분에 포함된다고 합니다.

 

2. GPU 프로그래밍의 특수 변수Type

2_1. CUDA

일반적인 Int, FLoat, double, char 등의 자료형은 C언어와 동일하게 사용이 가능합니다.

 

그 외에 특수하게 Vector형 Type이 제공됩니다.

 

CUDA의 경우 int3, double2 와 같이 최대 16byte까지 가능한 Vector형 변수가 존재하며, 아래처럼 사용이 가능합니다.

 

변수의 생성 및 초기화 : make_( x, ... )

//변수Type 변수명 = make_변수Type(x, y, z, w)
float2 xx = make_float2( 1., 2. );

변수의 성분 접근 : variable.x,  variable.y,  variable.z,  variable.w.

http://www.icl.utk.edu/~mgates3/docs/cuda.html

 

CUDA reference

CUDA syntax Source code is in .cu files, which contain mixture of host (CPU) and device (GPU) code. Declaring functions __global__ declares kernel, which is called on host and executed on device __device__ declares device function, which is called and exec

www.icl.utk.edu

이때 dim3이라는 변수Type은 일반적인 int3과 비슷한 형태이나, GPU에서 실행 될 kernal 프로그램의 grid, block의 차원을 표시할 때 사용합니다.(즉, grid 내 block, block 내 thread는 각각 3차원까지 가능합니다)

 

2_2. OpenCL

OpenCL의 경우 C언어와 동일한 Type을 사용하나, 앞에 cl_을 붙여서 OpenCL에 사용하는 변수임을 명시해 줍니다

(Ex. char temp[] -> cl_char temp[])

 

Vector형 Type또한 가능 합니다.

 

Vector형 Type의 경우 접근이 변수명.sindex형태로 사용이 가능합니다(CUDA와 같은 x, y, z, w도 가능).

 

대신, OpenCL의 경우 최대 16개의 Component를 가질 수 있기때문에 16진수 형태로 사용됩니다.

//type 변수명 = (type)(성분1, 2, 3, 4)
float4 f = (float4)(1.0f, 2.0f, 3.0f, 4.0f);

//f vector의 0번째 Element의 값을 읽을 때
printf("%d", f.s0);

https://www.khronos.org/registry/OpenCL/specs/2.2/html/OpenCL_C.html

 

The OpenCL™ C 2.0 Specification

Chuck Rose, Adobe Eric Berdahl, Adobe Shivani Gupta, Adobe Bill Licea Kane, AMD Ed Buckingham, AMD Jan Civlin, AMD Laurent Morichetti, AMD Mark Fowler, AMD Marty Johnson, AMD Michael Mantor, AMD Norm Rubin, AMD Ofer Rosenberg, AMD Brian Sumner, AMD Victor

www.khronos.org

728x90
반응형

'컴퓨터과학 > GPU' 카테고리의 다른 글

GPU프로그래밍_1(개념)  (0) 2022.03.03
GPU의 Thread(Work) 처리 방법  (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
글 보관함