Monday, June 2, 2008

CUDA에서 구현시 생각해야 할 것

1) global memory access
알고리즘에 따라 메모리에 접근하는 방법이 다를 텐데, CUDA에서는 global memory에 Random access를 할 경우 성능이 무지하게 저하되어 버린다. global memory를 쓰려면 Coalesced access를 할 필요가 있는데, 이게 조건이 상당히 까다롭네.

뭐 물론 익숙해지면 여러가지 방법을 쓸 수 있겠지만, 일단 아직 익숙치가 않다. 흑...

2) shared memory access
shared memory는 global memory 보다 무지하게 빠르므로 최대한 이용할 수 있도록 한다. 레지스터 보다는 좀 느린 것 같긴 한데, 그래도 충분히 빠르니까.

문제는 shared memory 크기가 그리 크지 않다는 것인데, 16KB로 전부 나눠써야하니까 너무 낭비하게 되면 다른 thread block을 할당할 수 없는 사태가 발생할 수도 있으니 주의. 그래두 뭐 이런 것도 레지스터를 적게 쓰는 알고리즘을 만들었을때나 통하는 얘기고, 레지스터 많이 써버리면 결국 한 블록 밖에 못 돌리니까 shared memory는 더 많이 쓸 수 있게 되더라... 좋은 건지는 모르겠지만.

3) constant memory
constant memory는 device에서 쓸 수는 없고 읽을 수만 있기 때문에 kernel 진입전에 전부 set해주고 들어가야 함. global memory상에 있으나 8KB/MP의 비교적 큰 캐시를 사용하게되고 동시에 돌리는 어떤 thread block에서도 coalescing 없이 빠르게 접근이 가능하므로 상수 테이블을 올려서 사용하면 좋을 듯. 특히 8KB이내의 테이블이면 레지스터를 사용하듯 사용할 수 있다. 물론 읽기만 되지만...

4) thread control
쓰레드 배치는 memory coalescing 과 관련이 깊으므로 심사숙고 해야 함. 특히 thread내에서 divergent branch가 일어나면 다 엉망이 되므로 thread sync시점을 잘 조정해야 할 듯.

No comments: