İş açısından verimli sürüm daha fazla adım gerektirse de, bu, aktif iş parçacığı sayısının daha hızlı azalması ve tüm iterasyonlardaki toplam aktif iş parçacığı sayısının önemli ölçüde daha az olması ile dengelenir. Bir çözgü, bir yineleme sırasında aktif dişlere sahip değilse, bu çözgü sadece aşağıdaki engele atlayacak ve askıya alınacak ve diğer çözgülerin çalışmasına izin verecektir. Bu nedenle, daha az aktif çözgüye sahip olmak, yürütme zamanında genellikle ödeyebilir. (Burada açık olan, GPU kodunun, aktif iş parçacıkları mümkün olduğunca az çözgü halinde bir araya getirilecek şekilde tasarlanması gerektiğidir - bir etkin iş parçacığı bile tüm çözgüyü zorlayacağından seyrek olarak dağılmasını istemezsiniz. aktif kalmak için.)
Naif algoritmada aktif evre sayısını düşünün. Makalesinde Şekil 2 baktığımızda, tüm ipler aktif olduğunu görebilirsiniz hariç ilk 2 için k üzerine k inci iterasyon. Böylece N iş parçacığıyla, etkin iş parçacığı sayısı N - 2 k gibi gider . Örneğin, N = 1024 ile, yineleme başına etkin iş parçacığı sayısı:
1023, 1022, 1020, 1016, 1008, 992, 960, 896, 768, 512
Bunu (32'ye bölerek ve yuvarlayarak) aktif çözgü sayısına dönüştürürsem:
32, 32, 32, 32, 32, 31, 30, 28, 24, 16
Öte yandan, iş açısından verimli algoritma yarıya kadar iş parçacığıyla başlar, daha sonra her yinelemede aktif olanların sayısını 1'e düşene kadar yarıya indirir, sonra geri dönene kadar iki katına çıkar. tekrar dizi boyutunun yarısı:
512, 256, 128, 64, 32, 16, 8, 4, 2, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512
Bunu aktif çözgülere dönüştürme:
16, 8, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 8, 16
Toplam 71, sadece dörtte biri. Böylece, tüm operasyon boyunca, etkin çözgü sayısının iş verimli algoritma ile çok daha az olduğunu görebilirsiniz. (Aslında, ortada uzun bir koşu için sadece bir avuç aktif çözgü vardır, bu da çipin çoğunun işgal edilmediği anlamına gelir. Örneğin, diğer CUDA akışlarından çalışan ek hesaplama görevleri varsa, bunu doldurmak için genişletilebilirler. boş alan.)