SPIR-?
⋯? ?cible ? ?transformer ? ?traduire ⋯?
SPIR-? est un projet de recherche visant à explorer les conceptions IR orientées shader dérivées de SPIR-V et à produire un cadre autour d'une telle IR pour faciliter les pipelines de compilation avancés, au-delà de ce que permettent les outils SPIR-V existants.
Un tel besoin est apparu dans le projet Rust-GPU, qui nécessite une variété de passes de légalisation pour transformer le code à usage général (Rust 1 ) fonctionnant sur une mémoire non typée , en un flux de données direct compatible avec les GPU.
Notre objectif est de remplacer les passes de légalisation Rust-GPU SPIR-V existantes par SPIR-? équivalents - mais plus important encore, SPIR-? devrait permettre d'écrire des passes de légalisation/optimisation beaucoup plus puissantes, cela aurait été insondable 2 pour une manipulation directe de SPIR-V.
1 Rust n'est pas unique dans ses besoins ici, et davantage de langages (ou IR) pourraient éventuellement utiliser un tel cadre, mais le travail initial de conception et de mise en œuvre s'est concentré sur Rust-GPU.
2 pas carrément impossible, mais nécessitant des coûts de développement/maintenance excessifs, devant constamment équilibrer l'exactitude et la puissance (les passes plus conservatrices sont plus faciles à faire confiance), etc.
Ce projet n'est pas affilié, associé, autorisé, approuvé par ou officiellement lié de quelque manière que ce soit à Khronos Group Inc., ou à l'une de ses filiales ou de ses sociétés affiliées. Le site Web officiel de Khronos Group Inc. peut être consulté à l'adresse https://www.khronos.org.
Les noms SPIR, SPIR-V, ainsi que les noms, marques, emblèmes et images associés sont des marques commerciales de leurs propriétaires respectifs.
Contexte supplémentaire : le nom de ce projet est un jeu de mots sur SPIR-V et n'a aucun rapport avec SPIR (l'ancienne norme IR).
? Ce projet est en cours de conception et de développement, de nombreux détails peuvent et vont changer ?
Si vous êtes intéressé à utiliser SPIR-? vous-même, vous souhaiterez peut-être d'abord jeter un œil au système de suivi des problèmes pour détecter les problèmes pertinents, et même en ouvrir de nouveaux décrivant votre cas d'utilisation.
L'accent étant initialement mis sur le cas d'utilisation de Rust-GPU, diverses fonctionnalités/API/documents (par ailleurs souhaitables) peuvent manquer ou évoluer rapidement - en même temps, les discussions autour de l'élargissement de la portée et de la convivialité de SPIR-? à long terme sont toujours les bienvenus.
Kernel
("OpenCL") de SPIR-VKernel
SPIR-V est beaucoup plus proche de LLVM IR que de Shader
SPIR-V, et en tant que tel, les outils orientés autour de LLVM sont plus susceptibles d'être mieux adaptés.Types de données IR :
| Utilitaires du framework :
Pass (vers/de/sur 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 |
(et la vision de la façon dont SPIR-? s'y intègre)
La distinction est faite ici entre :
Nous apprécions les contributions de la communauté à ce projet.
Veuillez lire notre Guide du contributeur pour plus d'informations sur la façon de commencer. Veuillez également lire nos conditions de contribution avant d'effectuer une contribution.
Toute contribution intentionnellement soumise pour inclusion dans un projet Embark Studios doit être conforme au modèle de licence standard Rust (MIT OU Apache 2.0) et donc bénéficier d'une double licence comme décrit ci-dessous, sans aucun terme ou condition supplémentaire :
Cette contribution est sous double licence sous SOIT
à votre choix.
Pour plus de clarté, « votre » fait référence à Embark ou à tout autre titulaire de licence/utilisateur de la contribution.