A especificação SPIR-V define uma opção de Formato de Vetor Empacotado para as operações OpSDot
, OpUDot
e OpSUDot
. Quando utilizadas, as outras duas entradas da operação devem ser números inteiros de 32 bits, que são então interpretados como vetores quadridimensionais compactados de números inteiros de 8 bits.
Minha pergunta
No caso do "Formato de Vetor Empacotado", a sinalização desses argumentos inteiros escalares de 32 bits precisa corresponder à sinalização (lógica) de seus componentes de 8 bits, ou os escalares compactados de 32 bits precisam ser sem sinal de qualquer maneira (como, por exemplo, é o caso no WGSL )?
Por que estou confuso sobre isso
A especificação paraOpSDot
e OpUDot
somente afirma que "Vetor 1 e Vetor 2 devem ter o mesmo tipo" e que "devem ser inteiros de 32 bits [...] ou vetores", mas não especifica se devem ou não ter sinal. Se forem vetores (desempacotados), parece-me óbvio que OpSDot
espera vetores com sinal e OpUDot
espera vetores sem sinal. Mas ao empacotar quatro inteiros de 8 bits com sinal em um único escalar de 32 bits, parece-me mais natural tratar o resultado como um inteiro sem sinal ( como em WGSL ) porque, neste ponto, é apenas uma "aglomeração de bits" para a qual as operações aritméticas padrão não são significativas de qualquer maneira.
A validação com spirv-val
parece aceitar de qualquer forma, mas aceita até entradas inteiras de 32 bits com sinal para produtos escalares empacotados sem sinalOpUDot
com , o que me parece estranho, então não confio no validador aqui. Para aumentar minha confusão, a especificação deOpSUDot
(que realiza um produto escalar inteiro com/sem sinal misto) afirma explicitamente que o segundo argumento deve ser sem sinal, mas qualifica que isso se aplica somente se ambos os argumentos forem vetores (desempacotados):
[...] Quando o Vetor 1 e o Vetor 2 são vetores , os componentes do Vetor 2 devem ter um Sinal de 0. [← Sinal definido se as entradas forem vetores (desempacotados)]
Quando o Vetor 1 e o Vetor 2 são tipos inteiros escalares, o Formato de Vetor Empacotado deve ser especificado para selecionar como os inteiros devem ser interpretados como vetores. [← caso em que os argumentos são "tipos inteiros escalares" (ou seja, empacotados) discutidos separadamente, sem especificar a sinalização]
(Ênfase e anotações em [...] minhas.)