当前位置:网站首页>Spir - V premier aperçu

Spir - V premier aperçu

2022-07-06 01:15:00 Zenny Chen!

SPIR-VAperçu général

SPIR-VLes ombres sont intégrées dans Module Au milieu..Chaque module peut contenir un ou plusieurs shaders.Chaque Shader a un point d'entrée,Ce point d'entrée a un nom et un type d'ombre,Le type d'ombrage est utilisé pour définir l'ombrage dans lequel l'ombrage courant fonctionne Phase .Le point d'entrée est l'endroit où l'ombrage actuel commence à fonctionner.UnSPIR-VLe module est transmis avec les informations de création àVulkan,Et puisVulkanRenvoie un objet représentant le module.L'objet module peut ensuite être utilisé pour construire un Pipeline.C'est la version entièrement compilée d'un seul Shader,Avec les informations nécessaires pour le faire fonctionner sur l'appareil actuel.


SPIR-VReprésentation

SPIR-VPourVulkanC'est le seul langage de coloration officiellement supporté.Il est là.APILes couches sont acceptées et finalement utilisées pour la construction de pipelines,Ces pipelines sont configurés avec unVulkanObjet de l'appareil,Terminer le travail pour votre application.

SPIR-VUne représentation conçue pour être très facile à manipuler pour certains outils et entraînements.Cela améliore la portabilité grâce à la diversité entre les différentes implémentations.UnSPIR-VLa représentation interne du module est une32Flux de bitword,Stockage en mémoire.À moins que vous ne soyez un auteur d'outils ou que vous n'ayez l'intention de construire vous - mêmeSPIR-V,Sinon, vous n'avez pas besoin d'un traitement directSPIR-VCodage binaire pour.C'est juste que...,Soit tu peux regarderSPIR-VLe texte lisible de,Ou en utilisant des choses comme glslangvalidator C'est officiel.Khronos GLSL Compiler des outils pour générer SPIR-V.

Ensuite, nous pouvons écrire un fichier source d'ombres de calcul ,Nommé simpleKernel.comp,Et le donner à glslangvalidator Pour compiler.Parmi eux .comp Le nom du suffixe indique glslangvalidator L'ombrage sera compilé comme un ombrage calculé .

#version 460 core

void main(void)
{
    
    // Do Nothing...
}

Ensuite, nous utilisons la ligne de commande suivante (L'auteur utiliseWindowsEnvironnement):

%VK_SDK_PATH%/Bin/glslangValidator  -o simpleKernel.spv  -V100  simpleKernel.comp

Ensuite, nous pouvons voir qu'un simpleKernel.spv DeSPIR-VBinaires.On peut utiliserSPIR-V Le désassemblage démonte le binaire .Nous utilisons spirv-dis Cet outil officiel de désassemblage .

%VK_SDK_PATH%/Bin/spirv-dis  -o simpleKernel.spvasm  simpleKernel.spv

La commande ci - dessus produira un fichier d'assemblage lisible par l'homme simpleKernel.spvasm.Il se lit comme suit::

; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 10
; Bound: 6
; Schema: 0
               OpCapability Shader
          %1 = OpExtInstImport "GLSL.std.450"
               OpMemoryModel Logical GLSL450
               OpEntryPoint GLCompute %main "main"
               OpExecutionMode %main LocalSize 1 1 1
               OpSource GLSL 460
               OpName %main "main"
       %void = OpTypeVoid
          %3 = OpTypeFunction %void
       %main = OpFunction %void None %3
          %5 = OpLabel
               OpReturn
               OpFunctionEnd

Nous pouvons voirSPIR-V Le texte ressemble à une variante d'un langage d'assemblage bizarre . Nous pouvons passer par le contenu de désassemblage ci - dessus ligne par ligne , Et voir comment cela fonctionne avec l'original GLSL Entrez le . Chaque ligne de l'assemblage de sortie ci - dessus représente un seul SPIR-VDirectives, Une instruction peut être signée par plusieurs symboles (token)Composition.En outre,Point - virgule(;) L'énoncé au début est un commentaire .

La première instruction du flux est OpCapability Shader, Il demande que la capacité d'ombrage soit activée .SPIR-V La fonction est divisée en Directives Et Caractéristiques. Avant que votre Shader puisse utiliser l'une de ces caractéristiques , Vous devez déclarer quelles caractéristiques il utilisera en tant que partie . L'ombrage dans le code ci - dessus est un ombrage graphique et est donc utilisé Shader Cette capacité . Au fur et à mesure que nous en présentons plus SPIR-VEtVulkanFonction, Nous présenterons les différentes capacités dont chaque caractéristique dépend .

Et voilà.,Nous avons vu %1 = OpExtInstImport "GLSL.std.450". Il s'agit essentiellement d'importer un ensemble supplémentaire correspondant à GLSLVersion450Fonctions incluses, Et c'est souvent ce que l'ombre originale écrit .Attention!, Cette directive est précédée par %1 = . C'est le résultat de la directive actuelle ID.OpExtInstImport Le résultat est une bibliothèque . Quand on veut appeler les fonctions de cette bibliothèque ,On va utiliser OpExtInst Cette directive met en œuvre . Il a deux opérandes , C'est une bibliothèque (OpExtInstImport Résultats de la directive) Et un index des instructions .Ça permetSPIR-V L'ensemble d'instructions peut être étendu arbitrairement .

Et voilà., Nous avons vu des déclarations supplémentaires .OpMemoryModel Un modèle de mémoire de travail a été spécifié pour ce module , Dans l'exemple de code ci - dessus correspond à GLSLVersion450 Modèle de mémoire logique pour . Cela signifie que tous les accès au stockage tous les accès au stockage sont effectués par des ressources plutôt que par un modèle de stockage physique . Et le modèle de mémoire physique accède à la mémoire directement par un pointeur .

Puis vient la Déclaration du point d'entrée du module actuel .OpEntryPoint GLCompute %main "main" La directive signifie qu'il existe un point d'entrée correspondant à OpenGLCalculer les ombres, La fonction exportée s'appelle main, Et ce qui est spécifié ici IDPour %main, Le symbole sera spirv-as L'assembleur assigne un IDNo.. D'après le code ci - dessus, nous voyons que %1%3 Et %5, Et seulement sans %2 Et %4.Et ces deux - làID Il y a de fortes chances que le signe soit finalement compilé %main Et Le symbole suivant %void Répartition.Le nom de la fonction ici "main" Pour faire référence au point d'entrée , Lorsque nous retournons le module Shader qui en résulte à Vulkan Le point d'entrée de ce module est requis .

Ensuite, nous utiliserons ce qui précède dans cette dernière directive %main Ce symbole—— OpExecutionMode %main LocalSize 1 1 1 La taille du Groupe d'exécution qui définit cet ombrage est 1×1×1 Éléments de travail. Si la taille locale layout Modificateur par défaut ,AlorsGLSL Spécifie implicitement local sizePour 1×1×1.

Les deux directives suivantes ne font que fournir quelques informations .OpSource GLSL 460 Indique que le module actuel est utilisé avec GLSLVersion460Compilé,Et OpName %main "main" Pour avoirIDPour %main Le symbole de l'offre un nom .

Maintenant, on peut voir ça. main La partie de la fonction qui a vraiment du matériel .Tout d'abord,,%void = OpTypeVoid Il est déclaré que nous voulons utiliser %void Ce symbole en tant que type void.Comme indiqué précédemment, Il pourrait éventuellement être assigné IDPour2.InSPIR-V Tout a un ID, Même la définition de type . Les grands types d'agrégats peuvent être référencés séquentiellement par des 、 Des types plus simples à construire .Et pourtant, On doit commencer quelque part. , Et ici vous attribuez un type à void C'est là qu'on a commencé .

%3 = OpTypeFunction %void Cela signifie que nous définissons un 3DeID En tant que type de fonction , Le type de fonction prend void Comme son type de retour ( Précédemment déclaré comme void) Et il n'y a pas de paramètres . Nous avons utilisé ce type dans la ligne suivante .%main = OpFunction %void None %3 Cela signifie que nous avons déclaré un symbole %main( Qui a finalement été assigné IDProbablement4, Et nous l'avons déjà nommé "main")En fonction3( La phrase ci - dessus )Un exemple de, Il renvoie le type void, Et aucune autre déclaration spéciale . C'est grâce à la directive None Donner des instructions , D'autres paramètres disponibles à cet endroit incluent s'il y a incrustation 、 Ou si la variable est constante, etc. .

Enfin, On voit une étiquette (L'étiquette n'a pas été utilisée, Et seulement les effets secondaires des opérations du compilateur )、 Déclaration de retour implicite 、 Et la Déclaration finale de fin de fonction .C'est nous.SPIR-VFin de.


Principes de conception

  • Régularité: Toutes les instructions commencent par un nombre de mots indiquant combien de temps l'instruction courante a .Ça permetSPIR-V Le module n'a pas besoin de décoder chaque opcode . Toutes les instructions ont un code d'opération qui contrôle tous les opérandes , Déterminer à quel opérande ils appartiennent . Pour une instruction avec un nombre variable d'opérandes , Le nombre d'opérandes variables est obtenu en soustrayant le nombre total de mots de l'instruction du nombre de mots non variables .
  • Non combinatoire : Aucun type combiné n'est exposé , Il n'est pas non plus nécessaire de coder à grande échelle les types / Table de décodage .Au lieu de ça, Le type est paramétré . Les types d'images déclarent leurs dimensions 、 Array, etc . Tout est Orthogonal , Cela simplifie considérablement le Code . Ceci est similaire pour d'autres types . Ceci s'applique également aux opcodes . Opération pour scalaire / La taille du vecteur est orthogonale , Mais la différence entre un entier et un point flottant n'est pas orthogonale .
  • Aucun modèle: Lorsqu'un modèle d'exécution donné est spécifié ( Par exemple, les étapes du pipeline )Après, Les opérations internes sont essentiellement sans modèle :En général, Il suit cette règle :“ La même orthographe a la même sémantique ”, De sorte qu'il n'y ait pas de bits de schéma qui modifient la sémantique .Si ouiSPIR-V Les changements apportés à la sémantique , Alors ça devrait être une orthographe différente .Ce qui rendSPIR-V Les consommateurs sont plus robustes . Le mode d'exécution déclaré existe , Mais ceux - ci affectent souvent la façon dont les modules interagissent avec leur environnement d'exécution , Au lieu de sa sémantique interne . Peut également être déclaré , Mais il s'agit de déclarer un sous - ensemble de fonctions à utiliser , Au lieu de changer la sémantique à utiliser .
  • Déclaratif:SPIR-V Mode externe visible déclaré ,Comme“Profondeur d'écriture”, Au lieu d'avoir des règles qui exigent une déduction de l'observation complète de l'ombre . Il indique également explicitement quel mode d'adressage sera utilisé 、Modèle d'exécution、 Extensions des ensembles d'instructions, etc .
  • SSA: Tous les résultats des opérations intermédiaires sont rigoureux SSA.Et pourtant, Variables déclarées qui résident en mémoire 、 Et le chargement pour l'accès /Stockage, Et ces variables peuvent être stockées plusieurs fois .
  • IO: Certaines classes de stockage sont utilisées pour l'entrée /Produits(IO)De, Et fondamentalement ,IO Est par le chargement des variables déclarées dans ces classes de stockage / Stockage pour compléter .

Une seule affectation statique(SSA)

SPIR-V Contient un phi .Instructions permettant de combiner les résultats intermédiaires des flux de contrôle fractionnés . Cela permet au flux de contrôle de ne pas avoir besoin d'être chargé / Stockage en mémoire .SPIR-VChargement/ L'utilisation du stockage est flexible ;Non, non.phi Il est également possible d'utiliser des instructions pour contrôler le flux , Et en utilisant le chargement de la mémoire / Le stockage suit toujours SSAForme.

Certaines classes de stockage sont utilisées pour IODe, Et fondamentalement IO C'est par stockage / Charger l'implémentation , Et le chargement initial et le stockage final ne seront pas éliminés . Les autres classes de stockage sont locales à l'ombre , Cela peut les charger / Stockage pour élimination . Nous pouvons penser que ce chargement / Stockage en les déplaçant vers SSA L'élimination massive des résultats intermédiaires de la forme est une optimisation .


Variables intégrées

SPIR-V Décorer avec une valeur d'énumération pour identifier les variables en place à partir d'une langue de haut niveau . Ceci assigne toute sémantique inhabituelle à la variable . En plus des variables intégrées, elles sont correctes SPIR-VType de déclaration, Et traiter comme les autres variables .


Spécialisation

La spécialisation permet une portabilité basée sur des valeurs constantes SPIR-V Module pour la création hors ligne , Et cette constante est inconnue au début , Jusqu'à un moment ultérieur .Par exemple,, Lors de la création d'un module , Avec un tableau de taille constante , Sa valeur constante est inconnue , La taille exacte du tableau est donc inconnue . Mais quand le module est abaissé au schéma cible , Cette constante est connue .


Terminologie


Directives


UnSPIR-V Disposition physique des modules et des instructions

UnSPIR-V Le module est une chaîne de mots linéaires (word)Flow. Les premiers mots sont les suivants: :

Tableau1: Le mot de départ de la disposition physique

Numéro de série du mot Contenu
0 Nombre magique ——0x07230203
1Numéro de version. Ces octets vont de haut en bas :
0 | Numéro de version principal | Petit numéro de version | 0
Et donc,Version 1.3 La valeur de est:0x00'01'03'00
2 Le nombre magique du générateur . Il est associé à l'outil qui a généré le module . Sa valeur n'affecte aucune sémantique , Et la permission est 0. Utilisez un non 0 La valeur est à encourager ,Et peut êtreKhronosInscription.
3Frontière; Voici tous les <id> Assurez - vous que:
0 < id < Bound
Les frontières devraient être aussi petites que possible ,Plus petit, mieux c'est.. Tout dans un module <id> Doit être emballé intensivement et ainsi rapproché 0.
40( Réservé au mode instruction ,Si nécessaire)
5 Le premier mot du flux d'instructions ,Voir le tableau ci - dessous

Tous les mots restants sont une séquence linéaire d'instructions . Le flux de mots pour chaque instruction est le suivant :

Tableau2: Instructions disposition physique

Mot d'instruction numéro de série Contenu
0Opcode:Élevé16 Bit est le nombre de mots pour l'instruction courante .Faible16 Bit est la valeur d'énumération opcode .
1 Type d'instruction optionnel type <id> ( L'existence est déterminée par le Code d'opération )
- Résultats facultatifs de la directive Result <id> ( L'existence est déterminée par le Code d'opération )
-Opérande1(Si nécessaire)
-Opérande2(Si nécessaire)
Nombre de mots - 1Opérande NN Soustrayez par le nombre de mots 1À3 Un mot pour confirmer ,Voilà.1À3 Mots pour opcode 、Type de directive type <id>、 Et les résultats de la directive Result <id> ).

La directive est de longueur variable , En raison du type d'instruction optionnel type <id> Et Result <id>Mots, Et un opérande avec un nombre variable .

原网站

版权声明
本文为[Zenny Chen!]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/187/202207060113440173.html