병렬성의 제한적인 메모리
CUDA의 register, shared memory가 global memory access횟수를 줄이는데 효과적이라 해도 memory용량을 초과하지 않아야한다. 각 CUDA device는 제한된 크기의 CUDA memory를 제공하기 때문에 응용 프로그램이 주어질때 SM들이 동시에 수행되는 thread개수도 줄어든다. 각 thread가 더 많은 memory를 요구할수록 각 SM에 상주할 수 있는 thread개수도 줄어든다.
예를들어 각 SM이 8k(8192)개의 register를 가지고있는데, 전체 프로세서에 대해서는 총 128k개의 register가 있다. 이는 매우 큰 수이지만 개별 thread로 보면 하나의 thread는 매우 제한적인 개수의 register만 사용할 수 있다. 각 SM이 768개의 thread를 수용할 수 있을때 각 thread는 단지 8k/768 = 10개의 register만 사용할 수 있다. 만약 각 thread가 11개의 register를 사용한다면 각 SM에서 동시에 수행될 수 있는 thread 수는 줄어들 것이다.
이와 같은 thread감소단위는 1개씩 이뤄지는게 아니라 block단위로 이루어진다. blcok당 thread수가 256개라면, thread감소는 한번에 256개씩 줄어든다. 이것은 SM에서 동시에 상주할 수 있는 thread의 33%에 해당되며, 이것은 스케줄링 가능한 warp의수를 크게 줄이고, 이로인해 긴 지연시간을 가진 연산이 발생했을때 다른 연산으로 overlap하지 못할 경우가 발생한다.
shared memory의 사용또한 각 SM에 할당된 thread의 개수를 줄일 수 있다. 각 SM마다 16kB의 shared memory가 있다면, SM에 8개의 block이 있을때 각 blcok은 2kB의 shared memory를 초과해서는 안된다. 만약 초과한다면 SM에 할당된 block의 수를 줄인다.
행렬 곱셈에서 shared memory는 제한요소가 될 수 있다. 16*16크기의 tile에 대해서 각 block은 16*16*4=1KB의 용량이 Mds를 위해 필요하다. Nds도 1KB일 것이기에 각 block은 2KB의 shared memory를 사용한다. 이때 tile크기에 대해 shared memory는 제약사항으로 발생하지 않지만, 이때는 각 SM당 최대 768개의 thread를 가진다는 것이 제약으로 발생한다. tile size가 16*16이므로 각 block은 256thread를 가진다. 하지만 block수가 8개면 768을 초과하므로 SM당 3개의 block밖에 상주할 수 없다.
'Computer Architecture > GPU' 카테고리의 다른 글
[CUDA] 성능 고려 사항 (1) | 2022.10.29 |
---|---|
[CUDA] CUDA Memory (0) | 2022.10.29 |
[CUDA] Thread할당 (0) | 2022.10.29 |
[CUDA] 기초 (0) | 2022.10.29 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!