GPU 프로그래밍에서 업무 효율성이 필요한 이유는 무엇입니까?


13

CUDA에서 병렬 스캔을 수행하는 방법에 대한 다음 기사를 읽었습니다.

https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch39.html

이 기사에서는 스캔을 "작업 효율화"하는 데 중점을 둡니다. 다시 말해, GPU 알고리즘은 CPU 알고리즘 O (n) 이상의 추가를 수행하지 않아야합니다. 저자는 두 가지 알고리즘, 즉 O (nlogn) 추가를 수행하는 "순진"알고리즘과 "작업 효율"을 고려한 알고리즘을 제시합니다. 그러나 작업 효율적인 알고리즘은 루프 반복의 두 배를 수행합니다.

내 이해에 따르면 GPU는 단순히 거대한 SIMD 프로세서이므로 잠금 단계로 작동해야합니다. "작업 효율"알고리즘에서 두 배의 루프를 수행하면 많은 스레드가 유휴 상태가되어 장기적으로 성능이 저하 될 것입니다. 내가 무엇을 놓치고 있습니까?

답변:


21

우선, "GPU는 단순히 거대한 SIMD 프로세서이므로 잠금 단계에서 작동해야합니다."그보다 조금 더 복잡합니다. 전체 GPU는 록 스텝에서 실행되지 않습니다. 셰이더 스레드는 "워프"라는 32 개의 그룹으로 구성됩니다 (NVIDIA에서는 AMD는 "웨이브 프론트"라는 64 개의 그룹이지만 동일한 개념입니다). 워프 내에서 모든 스레드는 SIMD 배열로 잠금 단계로 실행됩니다. 그러나 서로 다른 날실은 서로 밀접한 관계가 없습니다. 또한 CPU 스레드와 같이 일부 워프가 적극적으로 실행되고 다른 워프가 일시 중지 될 수 있습니다. 워프는 무언가를 기다리는 중이거나 (메모리 트랜잭션이 돌아 오거나 장애물이 없어지는 등) 중단되어있을 수 있습니다.

이제 질문으로 돌아가십시오. 이 논문의 "작업 효율"알고리즘이 "순진"알고리즘보다 더 효율적인 것처럼 보이는 두 가지 방법을 볼 수 있습니다.

  1. 작업 효율적인 버전을 시작하려면 절반의 스레드가 필요합니다. 순진한 알고리즘에서는 배열 요소 당 하나의 스레드가 있습니다. 그러나 작업 효율적인 버전에서 각 스레드는 배열의 인접한 두 요소에서 작동하므로 배열 요소의 절반에 불과한 스레드 만 필요합니다. 실이 적을수록 날실이 적으므로 날실의 큰 부분이 활발히 진행될 수 있습니다.

  2. 작업 효율적인 버전에는 더 많은 단계가 필요하지만 활성 스레드 수는 더 빨리 감소하고 모든 반복에서 총 활성 스레드 수는 상당히 적다는 사실로 인해 상쇄됩니다. 반복 중에 워프에 활성 스레드가없는 경우 해당 워프는 다음 장벽으로 건너 뛰고 일시 중지되어 다른 워프를 실행할 수 있습니다. 따라서 활성 워프가 적 으면 실행 시간이 단축 될 수 있습니다. (이것은 GPU 코드가 활성 스레드를 가능한 한 적은 수의 워프로 묶는 방식으로 설계되어야한다는 것을 의미합니다. 하나의 활성 스레드만으로도 전체 워프가 강제로 흩어지기를 원하지 않습니다. 활동을 유지합니다.)

    순진 알고리즘의 활성 스레드 수를 고려하십시오. 기사의 그림 2를 보면 k 번째 반복 에서 처음 2k제외한 모든 스레드가 활성화되어 있음을 알 수 있습니다 . 따라서 N 스레드의 경우 활성 스레드의 수는 N -2 k 와 같습니다 . 예를 들어, N = 1024 인 경우 반복 당 활성 스레드 수는 다음과 같습니다.

    1023, 1022, 1020, 1016, 1008, 992, 960, 896, 768, 512
    

    이것을 32의 나눗셈으로 반올림하여 활성 워프 수로 변환하면 다음과 같이 나타납니다.

    32, 32, 32, 32, 32, 31, 30, 28, 24, 16
    

    반면에 작업 효율적인 알고리즘은 스레드 수의 절반으로 시작한 다음 1로 내려갈 때까지 각 반복에서 활성 알고리즘의 수를 반으로 줄인 다음 다시 올라갈 때까지 두 배로 시작합니다. 배열 크기의 절반을 다시 :

     512, 256, 128, 64, 32, 16, 8, 4, 2, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512
    

    이것을 활성 워프로 변환 :

    16, 8, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 8, 16
    

    합계는 71이며 이는 1/4에 불과합니다. 따라서 전체 작업 과정에서 작업 효율 알고리즘을 사용하면 활성 워프 수가 훨씬 적습니다. (사실, 중간에 장시간 실행되는 경우에는 약간의 활성 워프 만 있습니다. 이는 대부분의 칩이 점유되지 않았 음을 의미합니다. 예를 들어 다른 CUDA 스트림에서 실행중인 추가 컴퓨팅 작업이있는 경우 확장 할 수 있습니다. 빈 공간.)

그러나 GPU Gems 기사 에서이 중 어느 것도 명확하게 설명하지 않고 대신 큰 관련이없는 "추가 수"분석에 중점을 두지만이 알고리즘이 왜 관련이 없는지에 대한 많은 세부 정보를 놓친다는 것은 불행한 일입니다. 빨리.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.