20160412

동시성 프로그램의 이해
– 행렬곱을 메모리 접근을 고려하지 않고 만들면 메모리 접근이 과다하게 발생한다. 이를 해결하기 위해서는 blocking을 사용. Blocking을 사용하면 데이터 접근의 locality를 높일 수 있음. Blocking할 떄에는 캐시 크기를 고려해야 한다. Block이 캐시 안에 들어가도록 크기를 맞추어야 한다. CUDA의 __shared__는 프로그램 가능한 캐시 (스크래치 패드)이다. CPU에서는 이러한 것이 없음. 메모리 접근이 X라고 하면, blocking을 적용한다면 x/width만큼의 메모리 접근으로 줄게 됨. G80에서 최대 FLOPS을 달성하기 위해서는 1386GB/s의 메모리 대역폭 필요. 하지만 실제로는 86.4GB/s 대역폭을 제공함. Blocking을 적용한다면 대역폭을 넘지 않으면서 최대 FLOPS 달성 가능.

– Loop unrolling은 반복문을 풀어서 동시에 실행 가능하도록 하는 것. 속도 향상 가능하지만 코드 양이 늘어나고, 레지스터 사용량이 늘어남. 레지스터 수가 많다면 괜찮지만, 아니라면 레지스터를 교체해야 하므로 오버헤드가 크다.

– CUDA에는 local memory, shared memory, global memory가 있음. local memory와 global memory에는 큰 차이가 없다. 둘 모두 GPU DRAM에 저장되고, local memory는 레지스터에 매핑된다는 특징이 있다. shared memory는 스크래치패드 메모리에 저장된다. 하지만 많은 경우에 CUDA 프로그램은 shared memory를 사용하지 않는다. memory coalescing에 shared memory를 사용할 수도 있다.

– MAD는 multiply and addition을 담당하는 유닛이다. SM register file은 32KB의 크기 (8K entries)를 갖는다. SM register file은 8K entries를 갖지만, 몇 개의 thread block이 공유할지는 프로그래머의 결정이다. thread block이 많다면 더 적은 entry를 사용하게 될 것. 따라서 thread block에서 몇 개의 레지스터를 사용할 것인지의 결정도 중요하다. 레지스터의 수를 적절히 조절해서 전체 register file을 모두 사용할 수 있도록 해야 한다. 이를 동적으로 결정하도록 할 수도 있다. 반면에 thread 수가 줄더라도 memory latency를 숨길 수 있다면 좋을 수 있다.

– Row major matrix에서 쓰레드 사이에 memory coalescing을 할 수 있다. 서로 다른 thread 사이에 같은 메모리 주소를 요청할 때, 이를 coalescing한다. 따라서 column wise access에 대해 memory coalescing을 수행한다.

– Shared memory는 16개의 메모리 요청을 동시에 처리해주어야 함. SRAM에 여러 개의 port를 주어 여러 개의 메모리 요청을 동시에 처리할 수 있다. 하지만 그렇게 하기 위해서는 여러 개의 bitline을 가져야 한다. 더 많은 면적을 소모하게 되고, 느려진다. 여러 개의 bank를 사용해 병렬성을 높일 수 있다. 16개의 bank를 두고 번갈아 접근하도록 한다. 모든 접근이 서로 다른 bank에 발생하게 된다면 문제 해결됨. 하지만 모두가 같은 bank에 접근한다면 여전히 문제가 됨. GPU에서는 성능 향상을 위해 같은 주소에 대한 여러 개의 메모리 접근을 하나로 간주한다.

– Prefetching을 한다고 해도 bandwidth를 줄이지는 못한다. Latency는 줄어들게 됨. Software prefetching은 항상 정확하다. 하지만 hardware prefetching은 정확하지 않음. Prefetching이 효과를 보기 위해서는 실제 연산이 나타나기 전의 연산과 overlap되어야 한다.

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

누적 방문자 수
  • 93,420 hits
%d bloggers like this: