Ketika mencoba untuk meningkatkan kinerja kelas deteksi tabrakan saya, saya menemukan bahwa ~ 80% dari waktu yang dihabiskan di GPU, dihabiskan untuk jika kondisi lain hanya mencoba mencari batas untuk ember yang harus dilingkari.
Lebih tepatnya:
setiap utas mendapat ID, dengan ID itu ia mengambil segitiga dari memori (masing-masing 3 bilangan bulat) dan oleh mereka 3 ia mengambil simpulnya (masing-masing 3 mengapung).
Kemudian mengubah simpul menjadi titik-titik kotak integer (saat ini 8x8x8) dan mengubahnya menjadi batas segitiga pada kotak itu
Untuk mengubah 3 titik menjadi batas, ia menemukan min / maks dari setiap dimensi di antara masing-masing titik
Karena bahasa pemrograman yang saya gunakan tidak memiliki intrinsik minmax, saya membuatnya sendiri, terlihat seperti ini:
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)
Jadi rata-rata seharusnya perbandingan 2,5 * 3 * 3 = 22,5 yang berakhir memakan waktu jauh lebih banyak daripada tes persimpangan segitiga-tepi yang sebenarnya (sekitar 100 * 11-50 instruksi).
Bahkan, saya menemukan bahwa pre-menghitung ember yang diperlukan pada cpu (berulir tunggal, tidak ada vektorisasi), menumpuknya dalam tampilan gpu bersama dengan definisi bucket dan membuat gpu melakukan ~ 4 pembacaan tambahan per thread adalah 6 kali lebih cepat daripada mencoba untuk mencari tahu batas di tempat. (perhatikan bahwa mereka akan dihitung ulang sebelum setiap eksekusi karena saya berurusan dengan jaring dinamis)
Jadi mengapa perbandingannya begitu lambat pada GPU?