20160329

동시성 프로그램의 이해
– GPU 프로그래밍에서는 행렬의 한 개 요소 연산에 한 개의 쓰레드를 생성한다. dimGrid는 커널 연산에서의 쓰레드 블록의 차원을, dimBlock은 한 개 쓰레드 블록 내에서 쓰레드 차원을 정의한다. G80에는 16개의 streaming multiprocessor가 있음. 한 번에 한 개의 streaming muliprocessor가 한 개의 thread block를 실행할 수 있다. CUDA를 컴파일하면 PTX 코드가 생성됨. PTX는 CUDA를 위한 코드이다.

CUDA thread execution model을 이해해보자. 한 개의 thread block은 한 개의 streaming multiprocessor에서 실행됨. 여러 개의 thread block은 한 개의 streaming multiprocessor를 공유할 수 있음. 한 개의 thread block이 여러 개의 streaming multiprocessor에서 동시에 실행될 수는 없음.

– 4×4 행렬의 곱을 2×2 블록으로 blocking해 연산할 수 있음(총 네 개의 쓰레드, 한 개 쓰레드가 한 개의 블록을 연산). 한 개의 블록을 연산하기 위해서는 두 개의 행, 두 개의 열을 접근해야 함. GPU에는 여러 개의 streaming multiprocessor가 있으며, 이를 활용하기 위해서는 여러 개의 thread block을 만들어서 실행해야 함. GPU에는 여러 개의 제약 조건이 있음. GPU에서 실행할 수 있는 쓰레드의 수에도 제약이 있음. GPU의 메모리 크기라는 제약도 있음. 쓰레드가 모자라면 한 개의 쓰레드가 할 일을 늘리는 수밖에 없음.

– 한 개의 thread block은 한 개의 streaming multiprocessor에서 실행됨. 한 개의 block은 512개의 논리적 쓰레드를 가질 수 있다. 쓰레드들은 thread block 안에서 thread id를 갖는다. 같은 block 안에 있는 thread들은 데이터를 공유할 수 있으며, 동기화할 수 있다. 한 개의 thread block 안에 있는 thread들은 같은 streaming multiprocessor에서 실행되기 때문이다. 다른 thread block에 있는 thread들 끼리는 동기화가 힘들다(barrier를 쓸 수 없다). 실행 시점을 임의로 조정하기 어렵다. GPU는 thread block 단위로 실행하며, 따라서 streaming multiprocessor가 몇 개인지는 중요하지 않다.

– Geforce-8 HW는 streaming processor array로 구성된다. Streaming processor array는 여러 개의 texture processor cluster로 구성된다. Texture processor cluster는 한 개의 TEX와 두 개의 streaming multiprocessor로 구성된다. Streaming multiprocessor는 8개의 streaming processor로 구성된다. Streaming processor는 CPU에서 ALU, FPU와 같다. 하지만 8개의 streaming processor 모두 한 개의 instruction fetch/dispatch unit을 공유함. 이는 SIMD의 특성을 보여주는 것이다. 같은 명령어를 가지고 여덟 개의 다른 유닛에서 실행한다.

– CUDA 프로그래밍 모델은 SPMD를 지원한다. 쓰레드마다 다른 실행 경로를 갖는 것을 허용한다. 하지만 실제 streaming multiprocessor는 SIMD 모델이다. 왜 GPU를 SIMD로 구성했나? 명령어 fetch/dispatch에서의 오버헤드를 줄이고자(중요). 연산이 많은 경우에는 SIMD로 충분하다. 이를 통해 execution unit인 SP를 더 넣을 수 있게 됨. SIMD 머신으로 SPMD를 구현하려면 서로 다른 path를 두 번 실행하면 됨(중요). writeback을 끄면 됨.

– 한 개의 thread block은 반드시 한 개의 streaming multiprocessor에서 실행되어야 하지만, streaming multiprocessor는 자원량에 따라 여러 개의 thread block을 실행할 수 있음. 한 개의 thread block에 몇 개의 thread가 들어있느냐에 따라 streaming multiprocessor에 들어갈 수 있는 thread block의 수가 달라짐. G80의 SM은 한 번에 780개의 쓰레드를 실행할 수 있음. 8개의 SP가 있으므로, round-robin time에 96 cycle이 걸린다. 왜 이렇게 많은 thread를 적은 수의 SP에 매핑했을까? 메모리 요청과 같이 실행 이후에 기다려야 되는 것이 있기 때문이다. 많은 수의 thread를 매핑하지 않았다면 메모리 요청 이후에 단순히 기다려야 함 (사용하지 않고). 이렇게 많은 thread를 한 개의 SP에 매핑하는 것에는 두 가지 가정이 있다. 1) thread 사이의 context switching에 오버헤드가 적다는 것, 2) 메모리 대역폭이 충분하다는 것 (메모리 사용이 계속될 것이기 때문이다). Streaming multiprocessor의 스케쥴링 단위는 warp이며, 32개의 thread를 갖는다. 한 개의 SM은 8개의 SP를 가지므로 4 cycles가 걸린다. 한 번의 스케쥴에 한 개의 warp를 실행하며, operand가 모두 준비되었을 때에 warp를 실행한다 (scoreboarding 사용). Warp에 묶인 32개의 thread는 바뀌지 않는다.

Advertisements
Tagged with: , , , , , , , , , , , , , , , , , , , ,
Posted in 1) Memo

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

누적 방문자 수
  • 98,563 hits
%d bloggers like this: