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 或贡献的任何其他被许可方/用户。