SPIR-?
……? ? ? ?
SPIR-?是一個研究項目,旨在探索源自 SPIR-V 的面向著色器的 IR 設計,並圍繞此類 IR 生成一個框架,以促進高級編譯管道,超出現有 SPIR-V 工具允許的範圍。
Rust-GPU 專案中出現了這樣的需求,該專案需要各種合法化過程才能將在無類型記憶體上運行的通用(Rust 1 )程式碼轉換為 GPU 友善的直接資料流。
我們的目標是用SPIR-? 取代現有的 Rust-GPU SPIR-V 合法化通行證。等價物 - 但更重要的是, SPIR -?應該允許編寫更強大的合法化/最佳化通道,這對於直接 SPIR-V 操作來說是深不可測的2 。
1 Rust 的需求並不獨特,更多語言(或 IR)最終可以使用這樣的框架,但最初的設計和實作工作主要集中在 Rust-GPU
2並非完全不可能,但需要過多的開發/維護成本,必須不斷平衡正確性和權力(更保守的通行證更容易信任)等。
本項目與 Khronos Group Inc. 或其任何子公司或關聯公司不隸屬、關聯、授權、認可或以任何方式正式關聯。 Khronos Group Inc. 的官方網站位於 https://www.khronos.org。
SPIR、SPIR-V 名稱以及相關名稱、標記、徽章和圖像是其各自所有者的商標。
附加背景:此項目的名稱是 SPIR-V 的雙關語,與 SPIR(舊的 IR 標準)完全無關。
?該項目正在積極設計和開發中,許多細節可以而且將會改變?
如果您有興趣使用SPIR-?對於您自己,您可能想先查看問題追蹤器以了解相關問題,甚至打開描述您的用例的新問題。
由於最初的重點是 Rust-GPU 的用例,各種(本來是理想的)功能/API/文件可能會缺乏或快速變化 - 同時,圍繞擴大SPIR-?的範圍和可用性進行討論。從長遠來看,仍然受到歡迎。
Kernel
方言Shader
SPIR-V 相比, Kernel
SPIR-V 更接近 LLVM IR,因此圍繞 LLVM 的此類工具更有可能更適合紅外線資料類型:
| 框架實用程式:
通行證(往返於 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 |
(以及SPIR-如何融入其中的願景)
這裡的差別在於:
我們歡迎社區對此計畫做出貢獻。
請閱讀我們的貢獻者指南,以了解有關如何開始的更多資訊。在做出任何貢獻之前,請先閱讀我們的貢獻者條款。
有意提交納入 Embark Studios 專案的任何貢獻應符合 Rust 標準授權模式(MIT 或 Apache 2.0),因此應如下所述獲得雙重許可,無需任何附加條款或條件:
此貢獻已獲得雙重許可
由您選擇。
為清楚起見,「您的」是指 Embark 或貢獻的任何其他被授權人/使用者。