본문 바로가기

Programming/Todo's CUDA

스레드 블록 아키텍처(Thread Block Architecture) - CUDA 스레드 모델

01. CUDA 스레드 모델


1.1 CPU의 스레드, 태스크 분할


CPU환경에서 생성하는 스레드는 생성 즉시 실행 코드가 프로세서에서 실행된다. 생성한 스레드의 개수와 CPU의 코어 수가 동일하면 최적의 효율을 나타내지만, 코어 수보다 많아지 시분할 스케줄로 동작하게 되어 효율이 떨어진다.


병렬처리에서 효율성을 높이는 방법은 태스크(Task) 분할 방식으로 작업을 처리하는 것이다.



| 태스크 분할 처리과정 



① 스레드의 개수를 코어 수와 동일하게 생성한다.

② 해야 할 작업을 태스크 단위로 작게 분할하여 태스크 큐에 넣는다.

③ 스레드가 작업을 태스크 단위로 가져와서 처리한다.

④ 스레드가 하나의 태스크를 완료하면 다음 태스크를 에서 가져와서 다시 작업을 수행한다.


태스크란?

https://kyulingcompany.wordpress.com/2016/06/03/%EB%B3%91%EB%A0%AC%EC%B2%98%EB%A6%AC%EC%9D%98-%EB%8B%A8%EC%9C%84/



1.2 CUDA의 스레드 모델


CUDA의 스레드 모델은 기존의 스레드 개념과 작업을 분할하는 태스크의 개념이 혼합되어 있다. CUDA의 스레드는 그래픽 카드가 발휘할 수 있는 성능 이내의 개수에서는 즉시 생성되어 코어에서 동작하게 된다. 설정된 스레드 생성 개수가 그래픽 카드의 최대 성능을 낼 수 있는 스레드 개수를 넘어서면, 효율이 떨어지지 않는 스레드 개수만큼 실행하고 나머지는 대기하게 된다. GPU에서 작업을 계속 처리하여 유휴 코어가 발생하면 대기하는 스레드를 처리한다.



GPU의 코어는 연산을 위한 최소한의 단위로 구성하여 스레드를 스위칭 하고 실행하는데 부하가 거의 발생하지 않는다. 따라서 해야 할 전체 작업을 작은 크기로 나누어 많은 개수로 분할하게 되면 모든 코어가 동작하게 되어 유휴 코어의 발생을 줄일 수 있다.



1.3 CUDA의 스레드 모델



NVIDIA 사의 GPU의 스레드 처리 능력은 그래픽 카드의 종류에 따라 차이가 난다.


G80 계열의 SM은 최대 768개의 스레드를 동시에 실행할 수 있고, GT200 계열의 SM은 최대 1024 개의 스레드를 동시에 실행할 수 있다. G80 계열의 GPU 는 16개의 SM을 가지고 있으므로 16 X 768 = 12,288 개의 스레드를 동시에 실행할 수 있다. GT200 계열의 GPU는 30개의 SM을 가지고 있으므로 30 X 1024 = 30,720 개의 스레드를 동시에 실행할 수 있다.


GPU의 최대 스레드 실행가능 개수 = SM의 최대 동시 실행가능 스레드 개수 X SM의 개수



최대로 실행 가능한 스레드 개수보다 많은 스레드를 생성하도록 하면 최대 갯수를 실행한 후 나머지 스레드는 대기 시킨다. 처리가 완료된 스레드가 발생하고 유휴 코어가 생기면 대기하는 스레드들을 실행하게 된다.



CUDA프로그램을 작성할 때는 스레드를 생성하고 실행하면서 발생하는 부하에 대한 걱정보다는 많은 스레드를 생성하여 유휴 코어가 발생하지 않았는지에 대한 고려를 더 많이 해야한다. 따라서 CUDA 프로그래밍을 할 때 스레드를 생성한다고 생각하는 것보다 작업을 분할한다고 생각하는것이 좋다. 해야할 작업을 작은 크기의 많은 수로 나누면 모든 코어가 동시에 동작하게 되고 작업을 완료한 코어는 다음 작업을 가져와서 처리하게 될 것이다.