HLSL Shader Model 6.0

Menjelaskan intrinsik operasi gelombang yang ditambahkan ke HLSL Shader Model 6.0.

Model Shader 6.0

Untuk model shader sebelumnya, pemrograman HLSL hanya memaparkan satu utas eksekusi. Operasi tingkat gelombang baru disediakan, dimulai dengan model 6.0, untuk secara eksplisit memanfaatkan paralelisme GPU saat ini - banyak utas dapat dijalankan di lockstep pada inti yang sama secara bersamaan. Misalnya, intrinsik model 6.0 memungkinkan penghapusan konstruksi penghalang ketika cakupan sinkronisasi berada dalam lebar prosesor SIMD, atau beberapa set utas lain yang dikenal atom relatif terhadap satu sama lain.

Potensi kasus penggunaan meliputi: pemadatan aliran, pengurangan, transpose blok, pengurutan bitonik atau Transformasi Fourier Cepat (FFT), pengikatan, de-duplikasi aliran, dan skenario serupa.

Sebagian besar intrinsik muncul dalam shader piksel dan shader komputasi, meskipun ada beberapa pengecualian (dicatat untuk setiap fungsi). Fungsi telah ditambahkan ke persyaratan untuk DirectX Feature Level 12.0, di bawah API level 12.

Parameter <jenis> dan nilai pengembalian untuk fungsi-fungsi ini menyiratkan jenis ekspresi, jenis yang didukung adalah yang berasal dari daftar berikut yang juga ada dalam model shader target untuk aplikasi Anda:

  • setengah, setengah2, setengah3, setengah4
  • float, float2, float3, float4
  • double, double2, double3, double4
  • int, int2, int3, int4
  • uint, uint2, uint3, uint4
  • short, short2, short3, short4
  • ushort, ushort2, ushort3, ushort4
  • uint64_t, uint64_t2, uint64_t3, uint64_t4

Beberapa operasi (seperti operator bitwise) hanya mendukung jenis bilangan bulat.

Terminologi

Jangka Waktu Definisi
Jalur Satu utas eksekusi. Model shader sebelum versi 6.0 hanya mengekspos salah satu dari ini di tingkat bahasa, meninggalkan ekspansi untuk pemrosesan SIMD paralel sepenuhnya hingga implementasi.
Gelombang Satu set jalur (utas) dijalankan secara bersamaan dalam prosesor. Tidak ada hambatan eksplisit yang diperlukan untuk menjamin bahwa mereka mengeksekusi secara paralel. Konsep serupa termasuk "warp" dan "wavefront."
Jalur Tidak Aktif Jalur yang tidak dijalankan, misalnya karena aliran kontrol, atau pekerjaan yang tidak cukup untuk mengisi ukuran minimum gelombang.
Jalur Aktif Jalur yang eksekusinya sedang dilakukan. Dalam shader piksel, ini dapat mencakup jalur piksel pembantu apa pun.
Quad Satu set 4 jalur yang berdekatan sesuai dengan piksel yang disusun dalam persegi 2x2. Mereka digunakan untuk memperkirakan gradien dengan berbeda dalam x atau y. Gelombang mungkin terdiri dari beberapa quad. Semua piksel dalam quad aktif dijalankan (dan mungkin "Jalur Aktif"), tetapi piksel yang tidak menghasilkan hasil yang terlihat disebut "Helper Lanes".
Jalur Pembantu Jalur yang dijalankan hanya untuk tujuan gradien dalam piksel shader quads. Output dari jalur tersebut akan dibuang, sehingga tidak dirender ke permukaan tujuan.

Intrinsik bahasa bayangan

Semua operasi model shader ini telah ditambahkan dalam berbagai fungsi intrinsik.

Kueri Gelombang

Intrinsik untuk mengkueri satu gelombang.

Intrinsik Deskripsi Bayangan piksel Shader komputasi
WaveGetLaneCount Mengembalikan jumlah lajur dalam gelombang saat ini. * *
WaveGetLaneIndex Mengembalikan indeks jalur saat ini dalam gelombang saat ini. * *
WaveIsFirstLane Mengembalikan true hanya untuk jalur aktif dalam gelombang saat ini dengan indeks terkecil * *

Suara Gelombang

Kumpulan intrinsik ini membandingkan nilai di seluruh utas yang saat ini aktif dari gelombang saat ini.

Intrinsik Deskripsi Bayangan piksel Shader komputasi
WaveActiveAnyTrue Mengembalikan true jika ekspresi benar di setiap jalur aktif dalam gelombang saat ini. * *
WaveActiveAllTrue Mengembalikan true jika ekspresi benar di semua jalur aktif dalam gelombang saat ini. * *
WaveActiveBallot Mengembalikan bitmask bilangan bulat tidak bertanda 64-bit dari evaluasi ekspresi Boolean untuk semua jalur aktif dalam gelombang yang ditentukan. * *

Siaran Gelombang

Intrinsik ini memungkinkan semua jalur aktif dalam gelombang saat ini untuk menerima nilai dari jalur yang ditentukan, secara efektif menyiarkannya. Nilai yang dikembalikan dari jalur yang tidak valid tidak terdefinisi.

Intrinsik Deskripsi Bayangan piksel Shader komputasi
WaveReadLaneAt Mengembalikan nilai ekspresi untuk indeks jalur yang diberikan dalam gelombang yang ditentukan. * *
WaveReadLaneFirst Mengembalikan nilai ekspresi untuk jalur aktif gelombang saat ini dengan indeks terkecil. * *

Pengurangan Gelombang

Intrinsik ini menghitung operasi yang ditentukan di semua jalur aktif dalam gelombang dan menyiarkan hasil akhir ke semua jalur aktif. Oleh karena itu, output akhir dijamin seragam di seluruh gelombang.

Intrinsik Deskripsi Bayangan piksel Shader komputasi
WaveActiveAllEqual Mengembalikan true jika ekspresi sama untuk setiap jalur aktif dalam gelombang saat ini (dan dengan demikian seragam di seluruhnya). * *
WaveActiveBitAnd Mengembalikan BITWISE AND dari semua nilai ekspresi di semua jalur aktif dalam gelombang saat ini, dan mereplikasi hasilnya ke semua jalur dalam gelombang. * *
WaveActiveBitOr Mengembalikan bitwise OR dari semua nilai ekspresi di semua jalur aktif dalam gelombang saat ini, dan mereplikasi hasilnya ke semua jalur dalam gelombang. * *
WaveActiveBitXor Mengembalikan Bitwise Exclusive OR dari semua nilai ekspresi di semua jalur aktif dalam gelombang saat ini, dan mereplikasi hasilnya ke semua jalur dalam gelombang. * *
WaveActiveCountBits Menghitung jumlah variabel boolean yang dievaluasi ke true di semua jalur aktif dalam gelombang saat ini, dan mereplikasi hasilnya ke semua jalur dalam gelombang. * *
WaveActiveMax Menghitung nilai maksimum ekspresi di semua jalur aktif dalam gelombang saat ini, dan mereplikasi hasilnya ke semua jalur dalam gelombang. * *
WaveActiveMin Menghitung nilai minimum ekspresi di semua jalur aktif dalam gelombang saat ini, dan mereplikasi hasilnya ke semua jalur dalam gelombang. * *
WaveActiveProduct Mengalikan nilai ekspresi bersama-sama di semua jalur aktif dalam gelombang saat ini, dan mereplikasi hasilnya ke semua jalur dalam gelombang. * *
WaveActiveSum Menjumlahkan nilai ekspresi di semua jalur aktif dalam gelombang saat ini dan mereplikasinya ke semua jalur dalam gelombang saat ini, dan mereplikasi hasilnya ke semua jalur dalam gelombang. * *

Wave Scan dan Awalan

Intrinsik ini menerapkan operasi ke setiap jalur dan meninggalkan setiap hasil parsial komputasi di jalur yang sesuai.

Intrinsik Deskripsi Shader piksel Shader komputasi
WavePrefixCountBits Mengembalikan jumlah semua variabel boolean yang ditentukan yang diatur ke true di semua jalur aktif dengan indeks yang lebih kecil dari jalur saat ini. * *
WavePrefixSum Mengembalikan jumlah semua nilai di jalur aktif dengan indeks yang lebih kecil dari yang satu ini. * *
WavePrefixProduct Mengembalikan produk dari semua nilai di jalur sebelum salah satu gelombang yang ditentukan ini. * *

Operasi Acak Seluruh Quad

Intrinsik ini melakukan operasi pertukaran pada nilai di seluruh gelombang yang diketahui berisi quad shader piksel seperti yang didefinisikan di sini. Indeks piksel dalam quad didefinisikan dalam garis pemindaian atau urutan membaca - di mana koordinat dalam quad adalah:

+---------> X

| [0] [1]

| [2] [3]

v

Y

Rutinitas ini berfungsi di shader komputasi atau shader piksel. Dalam shader komputasi, mereka beroperasi dalam quad yang didefinisikan sebagai kelompok yang dibagi secara merata 4 dalam gelombang SIMD. Dalam shader piksel, mereka harus digunakan pada gelombang yang ditangkap oleh WaveQuadLanes, jika tidak, hasilnya tidak terdefinisi.

Intrinsik Deskripsi Shader piksel Shader komputasi
QuadReadLaneAt Mengembalikan nilai sumber yang ditentukan yang dibaca dari jalur quad saat ini yang diidentifikasi oleh quadLaneID [0..3] yang harus seragam di seluruh quad. *
QuadReadAcrossDiagonal Mengembalikan nilai lokal yang ditentukan yang dibaca dari jalur yang berlawanan secara diagonal dalam quad ini. *
QuadReadAcrossX Mengembalikan nilai sumber yang ditentukan yang dibaca dari jalur lain dalam quad ini ke arah X. *
QuadReadAcrossY Mengembalikan nilai sumber yang ditentukan yang dibaca dari jalur lain dalam quad ini ke arah Y. *

Kemampuan perangkat keras

Untuk memeriksa apakah fitur operasi gelombang tersedia pada perangkat keras tertentu, panggil ID3D12Device::CheckFeatureSupport, mencatat deskripsi dan penggunaan struktur D3D12_FEATURE_DATA_D3D12_OPTIONS1 .