SPIR-?
⋯? ?ターゲット? ?トランスフォーム? ?翻訳 ⋯?
スピール?は、SPIR-V から派生したシェーダー指向の IR 設計を調査し、既存の SPIR-V ツールで可能な範囲を超えた、高度なコンパイル パイプラインを容易にするそのような IR を中心としたフレームワークを作成することを目的とした研究プロジェクトです。
このようなニーズは Rust-GPU プロジェクトで生じました。このプロジェクトでは、型なしメモリ上で動作する汎用 (Rust 1 ) コードを GPU に適した直接データフローに変えるために、さまざまな合法化パスが必要です。
私たちの目標は、既存の Rust-GPU SPIR-V 合法化パスをSPIR-?に置き換えることです。同等のもの - しかしさらに重要なのはSPIR -?より強力な合法化/最適化パスを記述できるはずですが、SPIR-V を直接操作する場合は計り知れないでしょう。
1ここでのニーズは Rust に特有のものではなく、最終的にはより多くの言語 (または IR) がそのようなフレームワークを利用する可能性がありますが、初期の設計と実装作業は Rust-GPU に重点を置いています。
2完全に不可能ではありませんが、過剰な開発/保守コストが必要になること、正確性とパワーのバランスを常に維持する必要があること (より保守的なパスの方が信頼されやすい) など。
このプロジェクトは、Khronos Group Inc.、またはその子会社や関連会社と提携、提携、承認、承認されておらず、いかなる形でも公式に関係していません。クロノス グループ株式会社の公式 Web サイトは、https://www.khronos.org でご覧いただけます。
SPIR、SPIR-V という名前、および関連する名前、マーク、エンブレム、および画像は、それぞれの所有者の商標です。
追加の背景: このプロジェクトの名前は SPIR-V のもじりであり、SPIR (古い IR 標準) とはまったく関係ありません。
?このプロジェクトは現在設計と開発が行われており、多くの詳細が変更される可能性があります。
SPIR-の使用に興味がある場合は?あなた自身も、まず問題トラッカーで関連する問題を調べて、自分のユースケースを説明する新しい問題を開いてみるとよいでしょう。
最初の焦点は Rust-GPU のユースケースにあり、さまざまな (本来は望ましい) 機能/API/ドキュメントが不足しているか、急速に変化している可能性があります。同時に、 SPIR の範囲と使いやすさの拡大に関する議論も行われています。長期的な方も大歓迎です。
Kernel
言語のサポートKernel
SPIR-V は、 Shader
SPIR-V よりも LLVM IR にはるかに近いため、LLVM を中心としたツールの方が適している可能性が高くなります。IR データ型:
| フレームワークユーティリティ:
パス (SPIR-? へ/から/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;
} | スピール? #[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 またはその他のコントリビューションのライセンシー/ユーザーを指します。