SPIR-?
⋯? ?alvo? ?transformar ? ?traduzir ⋯?
ESPIR-? é um projeto de pesquisa que visa explorar designs de IR orientados a shaders derivados do SPIR-V e produzir uma estrutura em torno de tal IR para facilitar pipelines de compilação avançados, além do que as ferramentas SPIR-V existentes permitem.
Essa necessidade surgiu no projeto Rust-GPU, que requer uma variedade de passes de legalização para transformar código de uso geral (Rust 1 ) operando em memória não digitada , em fluxo de dados direto compatível com GPU.
Nosso objetivo é substituir os passes de legalização Rust-GPU SPIR-V existentes por SPIR-? equivalentes - mas ainda mais importante, SPIR-? deveria permitir escrever passes de legalização/otimização muito mais poderosos, o que seria incompreensível 2 para manipulação direta do SPIR-V.
1 Rust não é o único em suas necessidades aqui, e mais linguagens (ou IRs) poderiam eventualmente fazer uso de tal estrutura, mas o trabalho inicial de design e implementação se concentrou em Rust-GPU
2 não é totalmente impossível, mas requer custos excessivos de desenvolvimento/manutenção, tendo que equilibrar constantemente correção e poder (passes mais conservadores são mais fáceis de confiar), etc.
Este projeto não é afiliado, associado, autorizado, endossado ou de qualquer forma oficialmente conectado ao Khronos Group Inc., ou a qualquer uma de suas subsidiárias ou afiliadas. O site oficial do Khronos Group Inc. pode ser encontrado em https://www.khronos.org.
Os nomes SPIR, SPIR-V, bem como nomes, marcas, emblemas e imagens relacionados são marcas registradas de seus respectivos proprietários.
Contexto adicional: o nome deste projeto é um trocadilho com SPIR-V e não tem nenhuma relação com SPIR (o padrão IR mais antigo).
? Este projeto está em fase ativa de design e desenvolvimento, muitos detalhes podem e irão mudar ?
Se você estiver interessado em usar o SPIR-? você mesmo, você pode querer primeiro dar uma olhada no rastreador de problemas para problemas relevantes e até mesmo abrir novos que descrevam seu caso de uso.
Com o foco inicial no caso de uso do Rust-GPU, várias funcionalidades/APIs/documentos (de outra forma desejáveis) podem estar faltando ou mudando rapidamente - ao mesmo tempo, discussões sobre a ampliação do escopo e usabilidade do SPIR-? a longo prazo ainda são bem-vindos.
Kernel
("OpenCL") do SPIR-VKernel
SPIR-V está muito mais próximo do LLVM IR do que Shader
SPIR-V e, como tal, é mais provável que as ferramentas orientadas em torno do LLVM sejam mais adequadasTipos de dados IR :
| Utilitários de estrutura :
Passes (de/para/no 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;
} | ESPIR-? #[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 |
(e a visão de como o SPIR-? se encaixa nisso)
A distinção feita aqui é entre:
Aceitamos contribuições da comunidade para este projeto.
Leia nosso Guia do Colaborador para obter mais informações sobre como começar. Leia também nossos Termos do Colaborador antes de fazer qualquer contribuição.
Qualquer contribuição enviada intencionalmente para inclusão em um projeto da Embark Studios deverá cumprir o modelo de licenciamento padrão Rust (MIT OU Apache 2.0) e, portanto, ser licenciada dupla conforme descrito abaixo, sem quaisquer termos ou condições adicionais:
Esta contribuição tem licença dupla sob QUALQUER DE
a sua opção.
Para maior clareza, “seu” refere-se à Embark ou a qualquer outro licenciado/usuário da contribuição.