GPU programlamasında neden iş verimliliği isteniyor?


13

CUDA'da paralel tarama yapmayla ilgili aşağıdaki makaleyi okudum:

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

Makalede, taramanın "verimli çalışması" üzerine bir vurgu vardır. Başka bir deyişle, bir GPU algoritması bir CPU algoritmasından (O (n)) daha fazla ekleme yapmamalıdır. Yazarlar, biri O (nlogn) ilavesini yapan "naif" ve "verimli çalışma" olarak değerlendirdikleri iki algoritma sunar. Ancak, iş verimli algoritma iki kat döngü yinelemesi yapar.

Anladığım kadarıyla, GPU'lar sadece dev SIMD işlemcileridir ve kilit adımda çalışmalıdır. "İş verimli" algoritmasında iki kat daha fazla döngü yapmak, birçok iş parçacığının boşta kalacağı ve uzun vadede performansı düşüreceği anlamına gelir. Neyi kaçırıyorum?

Yanıtlar:


21

Her şeyden önce, yeniden: "GPU'lar sadece dev SIMD işlemciler ve kilit adımında çalışması gerekir", bundan biraz daha karmaşık. Tüm GPU lockstep içinde çalışmaz. Gölgelendirici iplikleri "çözgü" olarak adlandırılan 32 kişilik gruplar halinde düzenlenmiştir (NVIDIA'da; AMD'de "dalga önleri" olarak adlandırılan 64'lü gruplardır, ancak aynı kavramdır). Bir çözgü içinde, tüm evreler SIMD dizisi olarak kilit adımında çalışır. Bununla birlikte, farklı çözgüler birbirine kilitlenmez. Ayrıca, CPU ipliklerine benzer şekilde, bazı çözgüler aktif olarak çalışıyorken diğerleri askıya alınabilir. Çözgü, ya bir şey bekledikleri (hafıza işlemlerinin geri dönmesi ya da temizlenecek engeller gibi) ya da olmadığı için askıya alınabilir.

Şimdi, sorunuza geri dönelim. Bu çalışmadaki "iş açısından verimli" algoritmanın "naif" algoritmadan daha verimli olacağına dair iki yol görüyorum.

  1. İş açısından verimli versiyonun başlayabilmesi için çok fazla iş parçacığının yarısı gerekir. Saf algoritmada, dizi öğesi başına bir iş parçacığı vardır; ancak iş açısından verimli sürümde, her iş parçacığı dizinin iki bitişik öğesi üzerinde çalışır ve bu nedenle dizi öğelerinin yalnızca yarısına kadar iş parçacığı gerektirir. Daha az sayıda iplik daha az çözgü anlamına gelir ve böylece çözgülerin daha büyük bir kısmı aktif olarak çalışabilir.

  2. İş 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.)

Tüm söylenenler, GPU Gems makalesinin bunları açıkça açıklamaması talihsizdir, bunun yerine tamamen alakasız olmasa da, bu algoritmanın neden olduğu hakkında birçok ayrıntıyı kaçırdığı büyük O "ekleme sayısı" analizine odaklanmak Daha hızlı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.