SPIR-?
⋯? ?target? ?mengubah? ?terjemahan ⋯?
SPIR-? adalah proyek penelitian yang bertujuan untuk mengeksplorasi desain IR berorientasi shader yang berasal dari SPIR-V, dan menghasilkan kerangka kerja seputar IR tersebut untuk memfasilitasi alur kompilasi tingkat lanjut, melampaui apa yang dimungkinkan oleh peralatan SPIR-V yang ada.
Kebutuhan seperti itu muncul dalam proyek Rust-GPU, yang memerlukan berbagai proses legalisasi untuk mengubah kode tujuan umum (Rust 1 ) yang beroperasi pada memori yang tidak diketik , menjadi aliran data langsung yang ramah GPU.
Tujuan kami adalah mengganti legalisasi Rust-GPU SPIR-V yang ada dengan SPIR-? setara - tetapi yang lebih penting, SPIR-? harus memungkinkan penulisan izin legalisasi/optimasi yang jauh lebih kuat, yang tidak dapat diduga untuk manipulasi SPIR-V langsung.
1 Rust tidak memiliki kebutuhan yang unik di sini, dan lebih banyak bahasa (atau IR) pada akhirnya dapat menggunakan kerangka kerja seperti itu, namun desain awal dan implementasinya berfokus pada Rust-GPU
2 bukannya tidak mungkin, namun membutuhkan biaya pengembangan/pemeliharaan yang berlebihan, harus selalu menyeimbangkan kebenaran dan kekuatan (pass yang lebih konservatif lebih mudah dipercaya), dll.
Proyek ini tidak berafiliasi, terkait, disahkan, didukung oleh, atau dengan cara apa pun secara resmi terhubung dengan Khronos Group Inc., atau anak perusahaan atau afiliasinya. Situs web resmi Khronos Group Inc. dapat ditemukan di https://www.khronos.org.
Nama SPIR, SPIR-V, serta nama, merek, lambang dan gambar terkait adalah merek dagang dari pemiliknya masing-masing.
Konteks tambahan: nama proyek ini adalah plesetan dari SPIR-V, dan sama sekali tidak terkait dengan SPIR (standar IR yang lebih lama).
? Proyek ini sedang dalam desain dan pengembangan aktif, banyak detail yang dapat dan akan berubah ?
Jika Anda tertarik menggunakan SPIR-? sendiri, Anda mungkin ingin melihat pelacak masalah terlebih dahulu untuk mengetahui masalah yang relevan, dan bahkan membuka pelacak masalah baru yang menjelaskan kasus penggunaan Anda.
Dengan fokus awal pada kasus penggunaan Rust-GPU, berbagai fungsi/API/dokumen (yang diinginkan) mungkin kurang, atau berubah dengan cepat - pada saat yang sama, diskusi seputar perluasan cakupan dan kegunaan SPIR-? dalam jangka panjang masih diterima.
Kernel
("OpenCL") SPIR-VKernel
SPIR-V lebih mirip dengan LLVM IR, dibandingkan Shader
SPIR-V, dan karena itu perkakas yang berorientasi pada LLVM kemungkinan besar lebih cocokTipe data IR :
| Utilitas kerangka :
Tiket masuk (ke/dari/di SPIR-?) :
|
GLSL ( #version 450
out int output0;
void main() {
int o = 1 ;
for ( int i = 1 ; i < 10 ; i ++ )
o *= i;
output0 = o;
} WGSL ( @vertex
fn main() -> @location( 0 ) i32 {
var o : i32 = 1 ;
for (var i : i32 = 1 ; i < 10 ; i ++ ) {
o *= i;
}
return o;
} | SPIR-? #[spv.Decoration.Flat]
#[spv.Decoration.Location(Location: 0 )]
global_var GV0 in spv.StorageClass.Output: s32
func F0 () -> spv.OpTypeVoid {
loop (v0: s32 <- 1s32, v1: s32 <- 1s32) {
v2 = spv. OpSLessThan (v1, 10s32): bool
(v3: s32, v4: s32) = if v2 {
v5 = spv. OpIMul (v0, v1): s32
v6 = spv. OpIAdd (v1, 1s32): s32
(v5, v6)
} else {
(spv. OpUndef : s32, spv. OpUndef : s32)
}
(v3, v4) -> (v0, v1)
} while v2
spv. OpStore (Pointer: &GV0, Object: v0)
} | SPIR-V ( %typeof_output0 = OpTypePointer Output %i32
%output0 = OpVariable %typeof_output0 Output
%typeof_main = OpTypeFunction %void
%main = OpFunction %void None %typeof_main
%entry = OpLabel
OpBranch %bb0
%bb0 = OpLabel
OpBranch %bb1
%bb1 = OpLabel
%o = OpPhi %i32 %1 _i32 %bb0 %o_next %bb5
%i = OpPhi %i32 %0 _i32 %bb0 %i_next %bb5
OpLoopMerge %bb6 %bb5 None
OpBranch %bb2
%bb2 = OpLabel
%cond = OpSLessThan %bool %i %10 _i32
OpSelectionMerge %bb4 None
OpBranchConditional %cond %bb4 %bb3
%bb3 = OpLabel
OpBranch %bb6
%bb4 = OpLabel
%o_next = OpIMul %i32 %o %i
OpBranch %bb5
%bb5 = OpLabel
%i_next = OpIAdd %i32 %i %1 _i32
OpBranch %bb1
%bb6 = OpLabel
OpStore %output0 %o
OpReturn
OpFunctionEnd |
(dan visi bagaimana SPIR-? cocok dengannya)
Perbedaan yang dibuat di sini adalah antara:
Kami menyambut kontribusi komunitas untuk proyek ini.
Silakan baca Panduan Kontributor kami untuk informasi lebih lanjut tentang cara memulai. Harap baca juga Ketentuan Kontributor kami sebelum Anda memberikan kontribusi apa pun.
Setiap kontribusi yang sengaja diajukan untuk dimasukkan dalam proyek Embark Studios, harus mematuhi model lisensi standar Rust (MIT ATAU Apache 2.0) dan oleh karena itu memiliki lisensi ganda sebagaimana dijelaskan di bawah, tanpa syarat atau ketentuan tambahan apa pun:
Kontribusi ini memiliki lisensi ganda di bawah SALAH SATU
sesuai pilihan Anda.
Untuk lebih jelasnya, "milik Anda" mengacu pada Embark atau penerima lisensi/pengguna kontribusi lainnya.