CUDA를 몇 주 동안 사용해 왔지만 블록 / 워프 / 스레드 할당에 대한 의구심이 있습니다. 교훈적인 관점 (대학 프로젝트) 에서 아키텍처를 연구하고 있으므로 최고 성능에 도달하는 것은 내 관심사가 아닙니다.
우선, 나는 이러한 사실들을 바로 잡았는지 이해하고 싶습니다.
프로그래머는 커널을 작성하고 스레드 블록 그리드에서 실행을 구성합니다.
각 블록은 스트리밍 멀티 프로세서 (SM)에 할당됩니다. 일단 할당되면 다른 SM으로 마이그레이션 할 수 없습니다.
각 SM은 자체 블록을 워프 (현재 최대 32 개의 스레드)로 분할합니다. 워프의 모든 스레드는 SM의 리소스에서 동시에 실행됩니다.
스레드의 실제 실행은 SM에 포함 된 CUDA 코어에 의해 수행됩니다. 스레드와 코어 사이에는 특정 매핑이 없습니다.
워프에 20 개의 스레드가 포함되어 있지만 현재 사용 가능한 코어가 16 개인 경우 워프가 실행되지 않습니다.
반면에 블록에 48 개의 스레드가 포함 된 경우 2 개의 워프로 분할되며 사용 가능한 메모리가 충분하면 병렬로 실행됩니다.
스레드가 코어에서 시작되면 메모리 액세스 나 긴 부동 소수점 연산을 위해 중단됩니다. 다른 코어에서 실행이 재개 될 수 있습니다.
그들이 맞습니까?
이제 GeForce 560 Ti를 사용하므로 사양에 따라 각각 48 개의 CUDA 코어 (전체 384 코어)를 포함하는 8 개의 SM이 장착되어 있습니다.
저의 목표는 아키텍처의 모든 핵심이 동일한 명령을 실행하도록하는 것입니다. 내 코드가 각 SM에서 사용 가능한 것보다 많은 레지스터를 요구하지 않는다고 가정하면 다른 접근법을 상상했습니다.
각 48 개의 스레드로 8 개의 블록을 만들어 각 SM에 1 개의 블록이 실행되도록합니다. 이 경우 SM에서 48 개의 스레드가 병렬로 실행됩니까 (사용 가능한 48 개의 코어를 모두 사용)?
6 스레드 64 블록을 시작하면 차이가 있습니까? (SM간에 균등하게 매핑된다고 가정)
예정된 작업에서 GPU를 "서브 머지 (submerge)"하면 (예를 들어 각각 1024 스레드의 1024 블록 생성) 모든 코어가 특정 시점에 사용되며 동일한 계산을 수행한다고 가정하는 것이 합리적입니다 (스레드가 마구간)?
프로파일 러를 사용하여 이러한 상황을 확인할 수있는 방법이 있습니까?
이 물건에 대한 참조가 있습니까? CUDA 프로그래밍 안내서와 "대량 병렬 프로세서 프로그래밍"및 "CUDA 응용 프로그램 설계 및 개발"에서 하드웨어 아키텍처 전용 장을 읽었습니다. 그러나 나는 정확한 답을 얻을 수 없었다.