작업 효율적인 버전에는 더 많은 단계가 필요하지만 활성 스레드 수는 더 빨리 감소하고 모든 반복에서 총 활성 스레드 수는 상당히 적다는 사실로 인해 상쇄됩니다. 반복 중에 워프에 활성 스레드가없는 경우 해당 워프는 다음 장벽으로 건너 뛰고 일시 중지되어 다른 워프를 실행할 수 있습니다. 따라서 활성 워프가 적 으면 실행 시간이 단축 될 수 있습니다. (이것은 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 스트림에서 실행중인 추가 컴퓨팅 작업이있는 경우 확장 할 수 있습니다. 빈 공간.)