2012-12-04 1 views
5

CUDA에서 같은 블록에있는 32 개의 인접한 스레드가 워프로 예약된다는 것을 알고 있습니다. 그러나 자주 블록 당 1 개의 스레드가있는 여러 개의 블록이있는 튜토리얼 CUDA 코드를 자주 찾습니다. 이 모델에서는 32 블록의 32 개 스레드가 워프로 예약됩니까? 그렇지 않다면이 모델이 블록 당 32 스레드로 구성하는 것보다 효율적이지 않다고 말할 수 있습니까? 감사!32 블록의 32 개 스레드가 워프로 예약됩니까?

답변

6

아니요, 서로 다른 블록의 스레드를 동일한 워프에서 예약 할 수 없습니다. 스레드 하나만있는 스레드 블록 그리드를 만드는 경우 시스템에서 완전한 성능을 얻지 못합니다. 블록 당 32 (또는 32의 정수 배수) 스레드를 갖는 것보다 효율적입니다. 예를 들어 페르미 (Fermi) SM은 32 개의 워프 레인을 사용할 수 있습니다. 단일 스레드의 블록을 스케줄하는 경우, 주어진 시간에 32 개의 레인 중 오직 하나만 사용할 수 있습니다.

스레드에는 단일 블록 내에서 정의되는 스레드 ID (threadIdx 기본 제공 변수)가 있습니다.

C 프로그래밍 가이드의 하드웨어 멀티 스레딩 섹션에는 a formula which defines the total number of warps in a single block이 나와 있습니다.

0

추가 할 사항이 한 번 더 있습니다. 항상은 워프를 통해 발생하기 때문에 블록 당 32 개 미만의 스레드 (1,2..8,16)를 할당하더라도 워프 (32 개 스레드)에 대해 계산이 발생하고 리소스는 32 스레드가 지연됩니다 블록.

각 스레드가 한 개씩 32 개의 블록을 할당하는 경우 32X32 스레드에 대한 리소스가 정지됩니다. 가능하다면 이것을 피하십시오.