SPIR-?
⋯? ?цель? ?преобразовать? ?перевести ⋯?
СПИР-? - это исследовательский проект, направленный на изучение шейдерно-ориентированных IR-проектов, полученных из SPIR-V, и создание структуры вокруг такого IR для облегчения расширенных конвейеров компиляции, выходящих за рамки того, что позволяют существующие инструменты SPIR-V.
Такая необходимость возникла в проекте Rust-GPU, который требует множества проходов легализации, чтобы превратить код общего назначения (Rust 1 ), работающий в нетипизированной памяти, в прямой поток данных, дружественный к GPU.
Наша цель — заменить существующие пропуска легализации Rust-GPU SPIR-V на SPIR-? эквиваленты, но, что еще важнее, СПИР-? должен позволить писать гораздо более мощные проходы легализации/оптимизации, что было бы непостижимо 2 для прямого манипулирования SPIR-V.
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
(«OpenCL») SPIR-V.Kernel
SPIR-V гораздо ближе к LLVM IR, чем Shader
SPIR-V, и поэтому инструменты, ориентированные на LLVM, скорее всего, подойдут лучше.Типы ИК-данных :
| Утилиты фреймворка :
Проходит (в/из/на СПИР-?) :
|
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)
} | СПИР-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 |
(и видение того, как СПИР-? в него вписывается)
Здесь проводится различие между:
Мы приветствуем вклад сообщества в этот проект.
Пожалуйста, прочтите наше Руководство для участников, чтобы получить дополнительную информацию о том, как начать работу. Пожалуйста, также прочтите наши Условия для авторов, прежде чем делать какой-либо вклад.
Любой вклад, намеренно представленный для включения в проект Embark Studios, должен соответствовать стандартной модели лицензирования Rust (MIT ИЛИ Apache 2.0) и, следовательно, иметь двойную лицензию, как описано ниже, без каких-либо дополнительных положений и условий:
Этот вклад имеет двойную лицензию под ЛЮБЫМ ИЗ
по вашему выбору.
Для ясности, «ваш» относится к Embark или любому другому лицензиату/пользователю данного материала.