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 .
Topik terkait
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk