2012-08-08 5 views
2

각 블록의 스레드 수가 이미 CUDA 코어 수보다 많으면 한 번에 하나의 블록을 실행하는 것보다 동시에 블록 그리드를 실행할 때 성능상의 이점이 있습니까?최적의 CUDA 병렬 블록 수

답변

5

나는 생각합니다. 스레드 블록은 스트리밍 멀티 프로세서 (SM)에 할당되며 SM은 각 블록의 스레드를 순차적으로 실행되도록 계획된 스레드 32 개 (최신 아키텍처는 더 큰 워프를 처리 할 수 ​​있음)의 나눗셈으로 나눕니다. 이를 고려하여 가능한 한 많은 SM을 차지하도록 각 계산을 블록으로 나누는 것이 더 빠를 것입니다. 또한 카드가 지원하는 워프 당 스레드의 배수 인 블록을 작성하는 데 충분합니다 (SM이 32 스레드 워프를 사용하는 경우 40 스레드가 아닌 32 또는 64 스레드 블록).

+1

Kepler GPU의 경우에도 워프 크기는 여전히 32 스레드입니다. – Eugene

+2

또한 SM에서 동시에 실행되는 그리드 (블록)의 수에는 제한이 있습니다 (위키피디아에서는 Fermi와 Kepler에 대해 16이라고 말합니다 - 이것이 적절한 수인지는 모르겠습니다). 따라서 많은 수의 작은 블록은 응용 프로그램이 하드웨어를 제대로 채울 수 없게합니다. – Eugene

1

실행 대기 시간

시작 지연 시간 (GPU에서 시작된 작업에 대한 API 호출) 그리드의 것은 윈도우 비스타/Win7에에 30 ~ 80 μs의 리눅스에 3-8 μS입니다.

SM에 블록을 배포하는 데는 10-100ns ns입니다.

블록 (32 개 스레드)에서 워프를 시작하면 몇 사이클이 소요되며 각 SM에서 병렬로 발생합니다.

리소스 제한

동시 커널 - 한번에 테슬라 N/A 1 개만 그리드 - 페르미 시간 16 그리드 - 케플러 16 그리드 (Kepler2 32 그리드)

최대 블록 (점유 제한을 고려하지 않음) - 테슬라 SmCount * 8 (gtx280 = 30 * 8 = 240) - 페르미 SmCount * 16 (gf100 = 16 * 16 = 256) - 케플러 SmCount * 16 (gk104 = 8 * 16 = 128)

이 ... 블록 당 스레드, SM 당 스레드, SM 당 레지스터, 스레드 당 레지스터에 대한 제한에 대한 점유 계산기를 참조

워프 예약 및 CUDA 코어

CUDA 코어가 부동 소수점/ALU 단위. 각 SM은로드/저장, 특수 기능, 분기 등 다른 유형의 실행 단위를 포함합니다. CUDA 코어는 x86 프로세서의 SIMD 장치와 같습니다. x86 코어와 동일하지 않습니다.

점유 율은 SM 당 최대 비프 니스 수에 대한 SM 당 측정 한 비프입니다. SM 당 워프가 많을수록 워프 스케줄러에 적합한 워프 일정이 잡힐 확률이 높아집니다. 그러나 점유율이 높을수록 스레드 당 사용 가능한 리소스가 줄어 듭니다. 기본 목표로 둘 이상의

25 % 8 테슬라 에 휘어 대상으로 지정할 50 % 페르미 (Fermi) 24 개 날실 50 % 케플러 (일반적으로 이상)

당신은 알 수

가 32 개 날실 이 계산에서 CUDA 코어와 실제 관계가 없습니다.

더 잘 이해하려면 Fermi 백서를 읽고 Nsight Visual Studio Edition CUDA 프로파일 러를 사용할 수 있다면 이슈 효율 실험 (CUDA 프로파일 러 또는 Visual Profiler에서는 아직 제공되지 않음)에서 커널이 얼마나 잘 숨고 있는지 이해하십시오 실행 및 메모리 대기 시간.

관련 문제