Pengantar
- Tulisan ini bertujuan meluruskan miskonsepsi terkait percabangan di GPU.
- Beberapa situs edukasi menyebarkan informasi yang keliru, dan ini ingin diperbaiki.
Masalah
- Disajikan contoh kode yang menggunakan operator ternary untuk mengimplementasikan eksekusi kondisional dalam kode GPU.
- Sebagian orang mengusulkan "optimasi" dengan menggantinya menjadi operasi aritmetika, tetapi ini didasarkan pada pemahaman yang keliru.
- Operator ternary melakukan perpindahan kondisional, yang diimplementasikan dengan operasi bit sederhana.
- Percabangan nyata memang terjadi dalam kode GPU, tetapi tidak digunakan untuk perpindahan register kecil.
Masalah pada optimasi yang keliru
- Optimasi yang diusulkan justru berjalan lebih lambat daripada kode asli.
- Fungsi
step()diimplementasikan dengan operator ternary, sehingga menambahkan perkalian dan penjumlahan yang tidak perlu. - Pada kode asli, nilainya dipindahkan secara kondisional secara langsung.
Analisis kode mesin
- Melalui kode mesin dari kompiler AMD dan Microsoft, dapat dipastikan bahwa GPU tidak melakukan percabangan.
- Perpindahan kondisional dilakukan dengan menggunakan operasi perbandingan dan bit mask.
Kesimpulan
-
Usulan optimasi dengan fungsi
step()adalah informasi yang keliru dan perlu diluruskan. -
Informasi yang salah ini telah menyebar lebih dari 20 tahun, dan perlu diperbaiki.
-
Inigo Quilez - mempelajari grafika komputer sejak 1994.
1 komentar
Komentar Hacker News
Saya yakin kesimpulan TFA benar, tetapi argumennya akan lebih kuat jika disertai hasil pembangkitan kode untuk kedua versi, bukan hanya versi yang lebih baik
Akan bagus jika ada cara yang baik untuk mengetahui kapan
ifbenar-benar memaksa terjadinya percabanganmix/lerpyang lebih mahal adalah karena, meskipun ada sedikit overhead, mereka takut membuat percabanganv = x > y ? a : b;benar-benar berfungsi, tetapi mengkhawatirkan bahwaifadalah sintaks yang kadang menjadi percabangan dan kadang tidakArtikel ini juga relevan: meluruskan nasihat yang salah tentang menulis percabangan di GPU
Saya penasaran mengapa kompilator tidak menyadari bahwa versi yang 'dioptimalkan' itu setara
step()dan mengoptimalkan secara terpisah untuk kasusstep()=0.0danstep()==1.0Saya pernah terkena masalah ini. Claude/ChatGPT juga menyarankan ini sebagai optimisasi, tetapi justru menyebabkan penurunan performa
Saya penasaran bagaimana cara mengetahui apakah fungsi OpenGL diemulasikan alih-alih memanggil kemampuan dasar GPU
Saat menulis kode, dibutuhkan pengalaman untuk yakin bahwa tidak akan ada percabangan kondisional
Menjelaskan bagaimana varian fungsi
mixbekerja untuk vektor