2013-03-20 1 views
16

좋아요. 관련 질문을 반복해서 물어 보았습니다. 그리고 이것에 관해서 거의 모든 것을 읽었지만, 일들은 여전히 ​​불분명합니다. 아마 내가 서로 모순되는 것을 발견하고 읽었 기 때문일 수도 있습니다. 아마도 서로 다른 시간대에 있기 때문에 서로 다른 컴퓨팅 기능을 가진 장치를 참조했기 때문입니다. 실행 시간을 줄이기 위해보다 효율적으로 노력하고 있으므로 얼마나 많은 스레드/워프/블록을 동시에 병렬로 실행할 수 있는지 정확히 알아야합니다. 또한 이것을 일반화하고 최적의 스레드 수와 블록 수를 계산하여 (단순한 프로그램의 경우) 수행해야하는 작업 수와 시스템 사양에만 기반하여 커널에 전달할 것을 고려하고있었습니다.CUDA Blocks & Warps

GTX 550Ti, btw 및 계산 기능 2.1이 있습니다. SMs x 48 코어 4 개 = 192 CUDA 코어. 좋아

은 그래서 내게 불분명 것은 :

AT ONCE (병렬) 멀티 프로세서 (SM)에 1 개 이상의 블록 실행이 할 수 있습니까? 나는 최대 8 블록을 SM에 할당 할 수 있지만 SM이 어떻게 실행되는지는 알지 못한다. SM (1536) 당 최대 스레드 수가 블록 당 최대 스레드 수 (1024)보다 약간 크다는 사실로부터 블록이 병렬로 실행되지 않는다고 생각할 것입니다 (아마도 1 년 반 정도?). 아니면 적어도 내가 그들에 스레드의 최대 개수가 있다면. 또한 블록 수를 설정하면 4 (SM 수)를 각각 다른 SM으로 보냅니 까? 또는이 모든 것이 하드웨어에서 어떻게 분산되어 있는지를 제어 할 수 없으며 이것은 논점입니다. 내 실행 시간은 장치의 변덕에 따라 달라질 수 있습니다 ...

두 번째로, 스레드를 병렬로 실행되는 32 개의 스레드 그룹 (워프 (warps))으로 나눕니다. 이제이 날실 (서로 관계가 없다고 가정 할 때)은 평행하게도 달릴 수 있습니까? 페르미 (Fermi) 아키텍처에서는 2 개의 워프가 동시에 실행됨을 나타내므로 각각의 워프에서 하나의 명령어를 16 개 코어 그룹으로 보내고 다른 코어는 워프를 처리하는 1536 개의 최대 스레드를 설명합니다. 32 * 48) 그러나 조금 많이 보인다. 1 개의 CUDA 코어가 32 개의 스레드를 동시에 처리 할 수 ​​있습니까?

간단히 말하면, 나는 (예를 들어) 3 번째 벡터에서 2 개의 벡터를 더하고 싶다면, 어떤 길이를 주어야하는지 (nr의 연산 수)와 어떻게 나누어야하는지 블록 및 쓰레드를 (유휴 코어 또는 SM을 사용하지 않고) 전체 용량에서 동시에 (병렬로) 작업 할 수 있습니다.

이전에 질문을 받았지만받지 못했거나 보지 못해 죄송합니다. 당신이 나를 도울 수 있기를 바랍니다. 고맙습니다!

답변

15

작업의 배포 및 병렬 실행은 실행 구성과 장치에 의해 결정됩니다. 실행 구성은 격자 차원, 블록 크기, 스레드 당 레지스터 및 블록 당 공유 메모리를 나타냅니다. 이 정보와 장치에 따라 장치에서 동시에 실행할 수있는 블록 및 워프 수를 결정할 수 있습니다. 커널을 개발할 때 일반적으로 SM에서 활성화 될 수있는 warps와 SM에 대한 최대 warp 수를 비교합니다. 이를 이론적 인 점유라고합니다. CUDA Occupancy Calculator은 다른 실행 구성을 조사하는 데 사용할 수 있습니다.

그리드가 시작되면 계산 작업 분배기는 그리드를 래스터 화하고 스레드 블록을 SM으로 분배하며 스레드 자원에 대한 SM 자원이 스레드 블록에 할당됩니다. SM에 충분한 리소스가있는 경우 여러 스레드 블록을 SM에서 동시에 실행할 수 있습니다.

워프를 시작하기 위해 SM은 워프 스케줄러에 워프를 할당하고 워프에 대한 레지스터를 할당합니다. 이 시점에서 워프는 활성 워프로 간주됩니다.

각 워프 스케줄러는 일련의 워프 (Fermi에서는 24 개, Kepler에서는 16 개)를 관리합니다. 스톨되지 않은 워프는 적격 한 워프라고합니다. 매주기마다 워프 스케줄러는 적합한 워프를 선택하고 int/fp 유닛, 배정도 부동 소수점 유닛, 특수 함수 유닛, 분기 해결 유닛 및로드 저장 유닛과 같은 실행 유닛에 대한 워프 명령을 내립니다. 실행 유닛은 파이프 라인 방식으로되어있어 많은 워프가 매주기마다 1 개 이상의 명령어를 처리 할 수 ​​있습니다. 워프는 명령어 인출, 데이터 의존성, 실행 의존성, 장벽 등에 대해 지연 될 수 있습니다.

각 커널은 다른 최적의 실행 구성을 갖습니다. Nsight Visual Studio Edition 및 NVIDIA Visual Profiler와 같은 도구를 사용하여 실행 구성을 조정할 수 있습니다. 여러 가지 실행 구성을 시도 할 수 있도록 유연한 방식으로 코드를 작성하는 것이 좋습니다. 나는 적어도 50 %의 점유를 제공하는 구성을 사용하여 시작하여 점유를 늘리거나 줄여보십시오. 각 질문

Q에

답변 : 1 개 이상의 블록이 실행 AT ONCE (병렬) 멀티 프로세서 (SM)의 수 있는가?

예, 최대 수는 장치의 컴퓨팅 기능을 기반으로합니다. See Tabe 10. Technical Specifications per Compute Capability : Maximum number of residents blocks per multiprocessor 값을 결정하십시오. 일반적으로 실행 구성은 런타임 값을 제한합니다. 자세한 내용은 점유 계산기 또는 NVIDIA 분석 도구 중 하나를 참조하십시오.

Q : SM 당 최대 스레드 수 (1536)가 블록 당 최대 스레드 수 (1024)보다 약간 크다는 사실에서 블록이 병렬로 실행되지 않는다고 생각합니다. 반?).

시작 구성은 SM 당 블록 수를 결정합니다. SM 당 최대 스레드 대 블럭 당 최대 스레드의 비율은 개발자가 작업을 분할하는 방법을보다 융통성있게 할 수 있도록 설정됩니다.

Q : 블록 수를 4로 설정하면 (각각의 SM 수), 각각 다른 SM으로 전송됩니까? 또는이 모든 것이 하드웨어에 어떻게 분산되어 있는지를 제어 할 수는 없습니다. 그리고 나서 이것은 논점입니다. 내 실행 시간은 장치의 변덕에 따라 달라질 것입니다 ...

작업 분배가 제한되어 있습니다. 더 많은 공유 메모리를 할당하여 점유를 제한함으로써 인위적으로 제어 할 수 있지만 이는 고급 최적화입니다.

Q : 둘째, 블록이 스레드를 병렬로 실행되는 32 개의 스레드 그룹 (워프)으로 나눕니다. 이제이 워프들은 서로 평행을 이룰 수 있습니다.

예, 병행은 병렬로 실행될 수 있습니다.

Q : 페르미 아키텍처는 2 개 경사 동시에

실행한다고 때문에 각 페르미 SM은 2 스케줄러 만곡 갖는다. 각 워프 스케줄러는 매 사이클마다 1 워프에 대한 명령어를 디스패치 할 수 있습니다. 명령어 실행은 파이프 라인 방식이므로 많은 워프가 매주기마다 1 개 이상의 명령어를 가질 수 있습니다.

Q : 각 워프에서 16 개 (?) 코어 그룹으로 하나의 명령어를 보내는 반면, 다른 코어에서는 1536 개의 최대 스레드 (32x48)를 설명 할 수있는 워프를 처리하지만, . 1 개의 CUDA 코어가 32 개의 스레드를 동시에 처리 할 수 ​​있습니까?

예. CUDA 코어는 정수 및 부동 소수점 실행 단위의 수입니다. SM에는 위에 나열된 다른 유형의 실행 단위가 있습니다. GTX550은 CC 2.1 장치입니다. 매 사이클마다 SM은 사이클 당 최대 4 개의 명령어 (128 개 스레드)를 전달할 수 있습니다. 실행의 정의에 따라주기 당 비행중인 총 쓰레드는 수백에서 수천까지 다양 할 수 있습니다.

+0

질문 확장 : * 1 CUDA 코어가 32 개의 스레드를 동시에 처리 할 수 ​​있습니까? *, 32 개 스레드가 동일해야합니다 블록? CUDA 코어가 서로 다른 블록의 두 스레드를 동시에 실행할 수 있습니까? – haccks

+0

CUDA 코어는 "코어"가 아니며 정수/부동 소수점 실행 파이프 라인입니다. 워프와 실행 파이프 라인의 스레드 레인 id (ptx % laneid) 사이에는 고정 된 매핑이 있습니다. CC 3.x 장치에서 워프의 32 스레드는 32 와이드 int/fp 실행 경로로 발송됩니다. CC 2.x 장치에서 워프의 32 스레드는 2 개의 핫 클을 통해 16 와이드 더블 클럭 인/fp 실행 경로로 발송됩니다. 배 정밀도 단위가 너비가 아니기 때문에 워프가 여러주기에 걸쳐 발행됩니다. 모든 스레드는 동일한 워프의 일부 여야합니다. –

+0

그래, 알아. 모든 스레드는 동일한 랩의 일부 여야합니다. GPU의 CPU 코어는 SM이며 랩 (32 개 스레드)에서 스레드를 실행합니다. 각 SP는 스레드를 처리합니다. 저를 혼란스럽게하는 것은 SM이 둘 이상의 블록 상주를 가질 수 있습니다. 즉, 다중 스레드 블록이 하나의 다중 프로세서에서 동시에 실행할 수 있습니다. SM에 8 SP가 있으며 한 번에 8 개의 상주 블록과 64 개의 스레드가있는 각 블록을 가질 수 있다면 처음 8 개 사이클에서 단 하나의 블록 만 처리해야합니까? – haccks

-2

CUDA 칩에서 컨텍스트 스위칭을위한 하드웨어 지원의 효율성이 절호의 하나입니다.

결과적으로 컨텍스트 스위치는 모든 메모리 액세스에서 발생하므로 다른 컨텍스트가 번갈아 가며 메모리 컨텍스트에서 대기하는 동안 많은 컨텍스트에서 계산을 진행할 수 있습니다. GPGPU 아키텍처가 성능을 얻는 방법 중 하나는 다중 코어에서 병렬화하는 것 외에도이 방법을 병렬화하는 것입니다.

메모리 액세스에서 코어가 대기하지 않을 때 최상의 성능을 얻을 수 있으며, 이러한 상황이 발생하는 데 충분한 컨텍스트 만 있으면 최상의 성능을 얻을 수 있습니다.

+0

사실이 아닙니다. 워프 스케줄러는 각주기를 선택하여 적합한 활성 워프 세트에서 명령어를 실행할 수 있습니다. 실행 종속성, 데이터 종속성, 패치 등으로 인해 실속하지 않는 경우 warp가 적합합니다. –

1

필자는 실행 시간을 줄이기 위해보다 효율적인 방법을 찾고 있으며, 따라서 얼마나 많은 스레드/워프/블록을 동시에 병렬로 실행할 수 있는지 알고 싶습니다.

요컨대, 동시에 실행할 수있는 스레드/워프/블록의 수는 몇 가지 요인에 따라 달라집니다.CUDA C 베스트 프랙티스 가이드에는 Execution Configuration Optimizations에 대한 정보가 있으며 이러한 요소를 설명하고 애플리케이션을 형성하는 방법에 대한 추론을위한 몇 가지 팁을 제공합니다.