일반적으로 블록/그리드의 크기를 데이터와 일치시키고 동시에 점유도, 즉 한 번에 활성화되는 스레드 수를 최대화하려고합니다. 점유에 영향을주는 주요 요소는 공유 메모리 사용, 레지스터 사용 및 스레드 블록 크기입니다.
CUDA 지원 GPU는 처리 능력이 SM (스트리밍 멀티 프로세서)으로 분리되어 있으며 SM의 수는 실제 카드에 따라 다르지만 여기서 간단하게 SM을 중점적으로 다룹니다 (모두 똑같이 작동합니다).). 각 SM은 32 비트 레지스터, 공유 메모리, 최대 활성 블록 수 및 최대 활성 스레드 수를 갖습니다. 이 수치는 GPU의 CC (연산 능력)에 따라 다르며 위키피디아 기사 http://en.wikipedia.org/wiki/CUDA의 중간에 있습니다.
커널은 커널이 32 비트 스레드에서 명령을 실행하기 때문에 스레드 블록 크기는 항상 32의 배수 여야합니다.예를 들어, 블록 크기가 50 개일 경우 GPU는 여전히 64 개의 스레드에 명령을 내리고 그 스레드를 낭비하게됩니다.
둘째, 공유 메모리와 레지스터에 대해 걱정하기 전에 카드의 계산 기능에 해당하는 최대 스레드 수와 블록 수를 기반으로 블록의 크기를 조정하십시오. 때로는 여러 가지 방법이 있습니다. 예를 들어 CC 3.0 카드의 경우 각 SM은 16 개의 활성 블록과 2048 개의 활성 스레드를 가질 수 있습니다. 즉, 블록 당 128 개의 스레드가있는 경우 2048 개의 스레드 제한을 초과하기 전에 SM에 16 개의 블록을 넣을 수 있습니다. 256 스레드를 사용하는 경우 8 개만 맞출 수 있지만 여전히 사용 가능한 모든 스레드를 사용하고 있으며 전체 사용량을 유지합니다. 그러나 블록 당 64 개의 스레드를 사용하면 16 개의 블록 한도에 도달 할 때 1024 개의 스레드 만 사용되므로 점유량은 50 %에 불과합니다. 공유 메모리 및 레지스터 사용이 병목 현상이 아닌 경우 데이터 차원 이외의 주요 관심사 여야합니다.
그리드의 주제에 ... 그리드의 블록이 SM을 통해 펼쳐지기 시작한 다음 나머지 블록이 파이프 라인에 배치됩니다. 해당 SM에 블록을 가져올만큼 충분한 리소스가있는 즉시 블록이 SM으로 이동되어 처리됩니다. 다시 말해, SM에서 블록이 완성되면 새로운 블록이 옮겨집니다. 이전 블록에서 256보다 작은 블록을 갖는 인수가 더 느린 블록으로 인해 리소스가 적어지기 때문에 더 빨리 완료 될 수 있습니다. 이것은 코드에 크게 의존합니다.
레지스터 및 공유 메모리에 대해서는 점유를 제한 할 수 있으므로 다음을 살펴보십시오. 공유 메모리는 전체 SM에 대해 유한하므로 가능한 한 많은 블록을 SM에 맞출 수 있도록 사용하십시오. 레지스터 사용에도 동일하게 적용됩니다. 다시 말하지만,이 수치는 컴퓨팅 성능에 따라 다르며 위키 피 디아 페이지에서 도표로 볼 수 있습니다. 행운을 빕니다!
디바이스 기능을 사용하여 블록/스레드를 계산할 수없는 이유는 무엇입니까? 내가 2.1의 능력 (GT 520)을 가진 장치를 가지고 있기 때문에, 그것은 48 SM, 8 블록 각각과 블록 당 1024 스레드를 가지고있다. 나는 그것을 얻을 수 없다, 나의 질문이 바보 인 경우에 유감스러운. – greg
일부 CUDA API를 사용하여 프로그래밍 방식으로 블록 당 최대 스레드 수를 결정할 수있는 방법이 있습니까? –