SPIR-?
⋯? ?objetivo? ?transformar? ?traducir ⋯?
ESPIR-? es un proyecto de investigación destinado a explorar diseños de IR orientados a sombreadores derivados de SPIR-V y producir un marco en torno a dicho IR para facilitar procesos de compilación avanzados, más allá de lo que permiten las herramientas SPIR-V existentes.
Tal necesidad surgió en el proyecto Rust-GPU, que requiere una variedad de pases de legalización para convertir el código de propósito general (Rust 1 ) que opera en memoria sin tipo , en un flujo de datos directo compatible con GPU.
Nuestro objetivo es reemplazar los pases de legalización SPIR-V de Rust-GPU existentes con SPIR-? equivalentes, pero aún más importante, ¿SPIR-? debería permitir escribir pases de legalización/optimización mucho más potentes, eso habría sido insondable 2 para la manipulación directa de SPIR-V.
1 Rust no es el único en sus necesidades aquí, y eventualmente más lenguajes (o IR) podrían hacer uso de dicho marco, pero el trabajo inicial de diseño e implementación se ha centrado en Rust-GPU.
2 no es del todo imposible, pero requiere un costo excesivo de desarrollo/mantenimiento, tener que equilibrar constantemente la corrección y la potencia (es más fácil confiar en los pases más conservadores), etc.
Este proyecto no está afiliado, asociado, autorizado, respaldado ni conectado oficialmente de ninguna manera con Khronos Group Inc., ni con ninguna de sus subsidiarias o afiliados. El sitio web oficial de Khronos Group Inc. se puede encontrar en https://www.khronos.org.
Los nombres SPIR, SPIR-V, así como los nombres, marcas, emblemas e imágenes relacionados son marcas comerciales de sus respectivos propietarios.
Contexto adicional: el nombre de este proyecto es un juego de palabras con SPIR-V y no tiene ninguna relación con SPIR (el estándar IR más antiguo).
? Este proyecto está en diseño y desarrollo activo, muchos detalles pueden cambiar y cambiarán .
Si está interesado en utilizar SPIR-? usted mismo, es posible que desee echar un vistazo primero al rastreador de problemas para detectar problemas relevantes e incluso abrir otros nuevos que describan su caso de uso.
Dado que el enfoque inicial está en el caso de uso de Rust-GPU, es posible que falten varias funcionalidades/API/documentos (que de otro modo serían deseables), o que estos cambien rápidamente; al mismo tiempo, ¿hay debates sobre la ampliación del alcance y la usabilidad de SPIR-? a largo plazo siguen siendo bienvenidos.
Kernel
("OpenCL") de SPIR-VKernel
SPIR-V está mucho más cerca de LLVM IR que Shader
SPIR-V y, como tal, es más probable que las herramientas orientadas alrededor de LLVM se ajusten mejorTipos de datos IR :
| Utilidades del marco :
Pases (hacia/desde/en 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 |
(y la visión de cómo SPIR-? encaja en ello)
La distinción que se hace aquí es entre:
Agradecemos las contribuciones de la comunidad a este proyecto.
Lea nuestra Guía del colaborador para obtener más información sobre cómo comenzar. Lea también nuestros Términos para contribuyentes antes de realizar cualquier contribución.
Cualquier contribución enviada intencionalmente para su inclusión en un proyecto de Embark Studios deberá cumplir con el modelo de licencia estándar de Rust (MIT O Apache 2.0) y, por lo tanto, tendrá una licencia dual como se describe a continuación, sin términos ni condiciones adicionales:
Esta contribución tiene doble licencia bajo CUALQUIERA DE
a tu elección.
Para mayor claridad, "su" se refiere a Embark o cualquier otro licenciatario/usuario de la contribución.