1 poin oleh GN⁺ 2025-02-10 | 1 komentar | Bagikan ke WhatsApp

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

 
GN⁺ 2025-02-10
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

    • Memang ditunjukkan kode mesin yang dihasilkan untuk memperlihatkan bahwa versi yang "dioptimalkan" sebenarnya berjalan jauh lebih lambat daripada versi asli, tetapi itu tidak membuktikan bahwa versi buruk lebih buruk lagi
  • Akan bagus jika ada cara yang baik untuk mengetahui kapan if benar-benar memaksa terjadinya percabangan

    • Alasan orang memakai mix/lerp yang lebih mahal adalah karena, meskipun ada sedikit overhead, mereka takut membuat percabangan
    • Bagus bahwa v = x > y ? a : b; benar-benar berfungsi, tetapi mengkhawatirkan bahwa if adalah sintaks yang kadang menjadi percabangan dan kadang tidak
  • Artikel ini juga relevan: meluruskan nasihat yang salah tentang menulis percabangan di GPU

    • Dulu optimisasi untuk menghindari percabangan memang efektif, tetapi sekarang sebaiknya tidak lagi dilakukan
    • Karena prosesor dan kompilator berubah, lebih baik menyediakan beberapa varian dan memilih yang tercepat saat runtime
  • Saya penasaran mengapa kompilator tidak menyadari bahwa versi yang 'dioptimalkan' itu setara

    • Ia seharusnya bisa memahami step() dan mengoptimalkan secara terpisah untuk kasus step()=0.0 dan step()==1.0
  • Saya pernah terkena masalah ini. Claude/ChatGPT juga menyarankan ini sebagai optimisasi, tetapi justru menyebabkan penurunan performa

    • Terima kasih kepada Inigo
  • 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

    • Sulit mengetahui berapa banyak operasi setelah kondisi yang memicu percabangan, dan operasi mana yang bisa dihilangkan oleh kompilator
    • Saya jadi bertanya-tanya apakah perlu memakai suite uji performa untuk memeriksa penurunan performa yang tidak disengaja
  • Menjelaskan bagaimana varian fungsi mix bekerja untuk vektor