当前位置:网站首页>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 |
1 | Numé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. |
3 | Frontiè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. |
4 | 0( 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 |
---|---|
0 | Opcode:É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 - 1 | Opérande N(N 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 .
边栏推荐
- 基於DVWA的文件上傳漏洞測試
- 程序员成长第九篇:真实项目中的注意事项
- Tcpdump: monitor network traffic
- SCM Chinese data distribution
- Five challenges of ads-npu chip architecture design
- Daily practice - February 13, 2022
- 毕设-基于SSM高校学生社团管理系统
- Distributed base theory
- 95后CV工程师晒出工资单,狠补了这个,真香...
- The third season of ape table school is about to launch, opening a new vision for developers under the wave of going to sea
猜你喜欢
The growth path of test / development programmers, the problem of thinking about the overall situation
3D模型格式汇总
esxi的安装和使用
基於DVWA的文件上傳漏洞測試
Unity | two ways to realize facial drive
VMware Tools安装报错:无法自动安装VSock驱动程序
Finding the nearest common ancestor of binary search tree by recursion
False breakthroughs in the trend of London Silver
MCU通过UART实现OTA在线升级流程
File upload vulnerability test based on DVWA
随机推荐
Mobilenet series (5): use pytorch to build mobilenetv3 and learn and train based on migration
朝招金安全吗 会不会亏损本金
Gartner released the prediction of eight major network security trends from 2022 to 2023. Zero trust is the starting point and regulations cover a wider range
cf:C. The Third Problem【关于排列这件事】
基于DVWA的文件上传漏洞测试
Cf:d. insert a progression [about the insert in the array + the nature of absolute value + greedy top-down]
Questions about database: (5) query the barcode, location and reader number of each book in the inventory table
Dedecms plug-in free SEO plug-in summary
WordPress collection plug-in automatically collects fake original free plug-ins
Modify the ssh server access port number
Who knows how to modify the data type accuracy of the columns in the database table of Damon
95后CV工程师晒出工资单,狠补了这个,真香...
Five challenges of ads-npu chip architecture design
VMware Tools installation error: unable to automatically install vsock driver
Gartner发布2022-2023年八大网络安全趋势预测,零信任是起点,法规覆盖更广
The population logic of the request to read product data on the sap Spartacus home page
Is chaozhaojin safe? Will it lose its principal
A preliminary study of geojson
IP storage and query in MySQL
[day 30] given an integer n, find the sum of its factors