Ç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:
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).
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 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ş?