GPU'da karşılaştırmalar neden bu kadar pahalı?


10

Çarpışma algılama sınıfımın performansını artırmaya çalışırken, gpu'da harcanan sürenin ~% 80'inin, döngüden geçmesi gereken kovaların sınırlarını anlamaya çalışıp çalışmadığı / başka koşulların harcandığını gördüm.

Daha kesin:

  1. her iş parçacığı bir kimlik alır, bu kimlikle üçgeni bellekten alır (her biri 3 tamsayı) ve bu 3 tarafından köşelerini alır (her biri 3 float).

  2. Daha sonra köşeleri tamsayı ızgara noktalarına (şu anda 8x8x8) dönüştürür ve bu ızgaradaki üçgen sınırlara dönüştürür

  3. 3 noktayı sınırlara dönüştürmek için, her bir boyut arasında her bir boyutun min / maks değerini bulur

Kullandığım programlama dilinde bir minmax içsel eksik olduğu için, kendim bir tane yaptım, şöyle görünüyor:

procedure MinMax(a, b, c):
   local min, max

   if a > b:
      max = a
      min = b
   else:
      max = b
      min = a
   if c > max:
      max = c
   else:
      if c < min:
         min = c

   return (min, max)

Ortalama olarak, gerçek üçgen kenarlı kavşak testlerinden (yaklaşık 100 * 11-50 talimat) daha fazla zaman alan 2.5 * 3 * 3 = 22.5 karşılaştırmaları olmalıdır.

Aslında, cpu üzerinde gerekli kovaları önceden hesaplamanın (tek dişli, vektörizasyon yok), kova tanımıyla birlikte bir gpu görünümünde istiflenmesinin ve gpu'nun iş parçacığı başına ~ 4 ekstra okuma yapmasının denemeden 6 kat daha hızlı olduğunu buldum yerinde sınırları bulmak için. (dinamik kafeslerle uğraştığım için her yürütmeden önce yeniden hesaplandıklarını unutmayın)

Öyleyse karşılaştırma neden bir GPU'da bu kadar korkunç bir şekilde yavaş?


2
Sorunuz, belirli bir donanım türündeki belirli bir kod parçasının komut düzeyindeki performansı ile ilgilidir. Bu bana bir bilgisayar bilimi sorusundan çok programlama sorusu gibi geliyor.
David Richerby

7
Benim tahminim o olmadığıdır karşılaştırmalar pahalı ama dallarıdır. Derleyici tahmin kullanmazsa (veya GPU böyle bir bilgi sağlamazsa), "iş parçacığı" çatalına neden olan dallar kullanılır (çünkü GPU'lar SIMD yönelimlidir). Koşulu bir maskeye dönüştürmek ve koşullu hareketleri / takasları sentezlemek için maskeyi kullanmak makul bir alternatif olabilir.
Paul A. Clayton

1
@DavidRicherby Bu kadar özel olduğundan emin değilim. Bu soru herhangi bir SIMD mimarisi için geçerli olmaz mı?
kasperd

1
@DavidRicherby: CS departmanlarında comp arch'ı öğretmemizin nedeni comp arch'ın seçtiğiniz algoritmalar üzerinde etkisi olmasıdır. SIMD mimarileri, programı iç içe geçmiş dallar olmadan nasıl yazacağınızı anlarsanız yüksek verim üretebilir.
Gezici Mantık

2
Gezici Mantık'ın cevabı daha az belirgin bir şekilde belirtildiği gibi, GPU'lar birçok "iş parçacığının" aynı anda aynı talimatta olduğunu varsayarak çalışır. Dolayısıyla, GPU'lar kabaca konuşmak gerekirse, sadece gerçek dalları değil, her dalı alırlar. Bu yüzden GPU'lar komşuların genellikle aynı dalları aldıkları gerçeğinden yararlanır; ve bu doğru olmadığında performans korkunç.
Rob

Yanıtlar:


10

GPU'lar SIMD mimarileridir. SIMD mimarilerinde, işlediğiniz her eleman için her talimatın yürütülmesi gerekir. (Bu kuralın bir istisnası vardır, ancak nadiren yardımcı olur).

Bu nedenle, MinMaxrutininizde her çağrının üç şube talimatını da alması gerekmez (ortalama olarak yalnızca 2.5 değerlendirilse bile), aynı zamanda her atama ifadesi de bir döngü gerektirir (aslında "yürütme" olmasa bile) ).

Bu soruna bazen iş parçacığı sapması denir . Makinenizde 32 SIMD yürütme şeridi gibi bir şey varsa, yine de yalnızca tek bir getirme birimi olacaktır. (Burada "iş parçacığı" terimi temel olarak "SIMD yürütme şeridi" anlamına gelir.) Bu nedenle dahili olarak her SIMD yürütme şeridinde "etkin / devre dışı bırakıldım" biti var ve dallar aslında bu biti işliyor. (İstisna, her SIMD şeridinin devre dışı kaldığı noktada, getirme biriminin genellikle doğrudan "başka" maddesine atlamasıdır.)

Kodunuzda her SIMD yürütme şeridi şunları yapıyor:

compare (a > b)
assign (max = a if a>b)
assign (min = b if a>b)
assign (max = b if not(a>b))
assign (min = a if not(a>b))
compare (c > max)
assign (max = c if c>max)
compare (c < min if not(c>max))
assign (min = c if not(c>max) and c<min)

Bazı GPU'larda, GPU'nun kendisi yapması koşuluyla bu koşulların kestirime dönüştürülmesi daha yavaş olabilir. @ PaulA.Clayton tarafından işaret edildiği gibi, programlama dilinizde ve mimarinizde önceden belirlenmiş bir koşullu hareket işlemi varsa (özellikle formdan biri if (c) x = y else x = z) daha iyisini yapabilirsiniz. (Ama muhtemelen çok daha iyi değil).

Ayrıca, yerleştirme c < minkoşullu iç elseve c > maxgereksizdir. Kesinlikle hiçbir şeyden tasarruf etmiyor ve (GPU'nun otomatik olarak tahminlere dönüştürmesi gerektiği göz önüne alındığında) aslında iki farklı koşulda iç içe geçmesi acı verici olabilir.


2
(Bunun herhangi bir kısmı net değilse üzgünüm, teorisyenler konuyu kapalı konu olarak kapatmadan önce bir cevap almaya çalışıyorum.)
Gezici Mantık

Temel bilgiler hakkında daha fazla bilgi için: http.developer.nvidia.com/GPUGems2/gpugems2_chapter34.html Ve daha yeni geçici çözümler için: eecis.udel.edu/~cavazos/cisc879/papers/a3-han.pdf
Fizz

Bazı algoritmaların SIMD paralelliğiyle hızlandırılamaması söz konusudur. (örn: Nedenin daha teorik bir tedavisi için Work, Span, vb.)
Rob

1
İşte diverjansın temelleri üzerine başka bir konferans people.maths.ox.ac.uk/gilesm/cuda/lecs/lec3-2x2.pdf Bunlardan sorunun (zaten Nvidia'da) sadece çözgü başına olduğuna dikkat edin. Farklı çözgülerde çalışan kodlar mutlu bir şekilde farklı olabilir. Ve bundan kaçınmak için bir yöntem öneren başka bir makale: hal.inria.fr/file/index/docid/649650/filename/sbiswi.pdf
Fizz

Biraz farklı bir çakışmada , ama eprint.iacr.org/2012/137.pdf sorusu altında yazdığım yorumlara uygun olarak: aşağıya inmedikçe , bir GPU için tahmin edilen performansa göre 10x yavaşlama "normal" olabilir (genellikle resmi olarak desteklenmeyen araçlarla). GPU hedefleme derleyicilerinin iyileşmesi mümkündür, ancak nefesimi tutmazdım.
Fizz
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.