Le pilote AMD Open Source pour Vulkan® est un pilote Vulkan open source pour les cartes graphiques Radeon™ sous Linux®. Il est construit sur la bibliothèque d'abstraction de plate-forme (PAL) d'AMD, un composant partagé conçu pour encapsuler certains détails de programmation spécifiques au matériel et au système d'exploitation pour de nombreux pilotes 3D et de calcul d'AMD. L'exploitation de PAL peut contribuer à offrir une expérience cohérente sur toutes les plates-formes, notamment la prise en charge des GPU récemment publiés et la compatibilité avec les outils de développement AMD.
Les shaders qui composent un objet VkPipeline
particulier sont compilés en tant qu'entité unique à l'aide de la bibliothèque LLVM-Based Pipeline Compiler (LLPC). LLCC s'appuie sur l'infrastructure de compilation de shaders existante de LLVM pour les GPU AMD afin de générer des objets de code compatibles avec le pipeline ABI de PAL. Notamment, le pilote Vulkan à source fermée d'AMD utilise actuellement un compilateur de pipeline différent, ce qui constitue la différence majeure entre les pilotes Vulkan open source et à source fermée d'AMD.
Le pilote AMD Open Source pour Vulkan est conçu pour prendre en charge les GPU AMD suivants :
Remarque Pour les GPU pré-GFX10, veuillez utiliser la version v-2023.Q3.3 ou une version antérieure.
Le pilote AMD Open Source pour Vulkan est conçu pour prendre en charge les distributions et versions suivantes sur la pile de pilotes AMDGPU en amont et la pile de pilotes AMDGPU Pro :
Le pilote n'a pas été bien testé sur d'autres distributions et versions. Vous pouvez l'essayer sur d'autres distributions et versions de votre choix.
Remarque Pour exécuter le pilote Vulkan avec la pile de pilotes en amont AMDGPU sur les GPU de génération SI et CI, amdgpu.si_support et amdgpu.cik_support doivent être activés dans le noyau.
Le pilote AMD Open Source pour Vulkan est conçu pour prendre en charge les fonctionnalités suivantes :
Les fonctionnalités et améliorations suivantes sont prévues dans les prochaines versions (veuillez vous référer aux notes de version pour la mise à jour de chaque version) :
uname -r
uname -r
ou sudo mkinitcpio --generate /boot/initrd .img- uname -r
uname -r
)Vous êtes invités à soumettre des contributions de code au pilote AMD Open Source pour Vulkan.
Le pilote est construit à partir du code source dans cinq référentiels : LLVM, XGL, LLCC, GPURT et PAL.
Pour les modifications apportées à LLVM, vous devez soumettre votre contribution au tronc LLVM. Les commits y seront évalués pour être fusionnés périodiquement dans la branche amd-gfx-gpuopen-master.
Pour les modifications apportées à XGL, LLCC, GPURT et PAL, veuillez créer une pull request contre la branche dev . Une fois votre modification examinée et si elle est acceptée, elle sera évaluée pour fusionner dans la branche principale lors d'une promotion régulière ultérieure.
IMPORTANT : En créant une pull request, vous acceptez que votre contribution soit sous licence par les propriétaires du projet selon les termes de la licence MIT.
Lorsque vous contribuez à XGL, LLCC, GPURT et PAL, votre code doit :
Veuillez faire en sorte que chaque contribution soit raisonnablement petite. Si vous souhaitez apporter une contribution importante, comme une nouvelle fonctionnalité ou une extension, veuillez d'abord soulever un problème pour permettre à la planification d'évaluer et de réviser votre travail.
Remarque Étant donné que PAL est un composant partagé qui doit prendre en charge d'autres API, d'autres systèmes d'exploitation et du matériel de pré-production, il peut vous être demandé de réviser votre modification PAL pour des raisons qui peuvent ne pas être évidentes du point de vue pur du pilote Linux Vulkan.
Il est recommandé d'installer au moins 16 Go de RAM dans votre système de build.
sudo apt-get install build-essential cmake curl g++-multilib gcc-multilib git ninja-build pkg-config python3 python3-jinja2 python3-ruamel.yaml
sudo apt-get install libssl-dev libx11-dev libxcb1-dev x11proto-dri2-dev libxcb-dri3-dev libxcb-dri2-0-dev libxcb-present-dev libxshmfence-dev libxrandr-dev libwayland-dev
dpkg --add-architecture i386
sudo apt-get install libssl-dev:i386 libx11-dev:i386 libxcb1-dev:i386 libxcb-dri3-dev:i386 libxcb-dri2-0-dev:i386 libxcb-present-dev:i386 libxshmfence-dev:i386 libwayland-dev libwayland-dev:i386 libxrandr-dev:i386
sudo yum -y install openssl-devel gcc-c++ python3 python3-pip curl glibc-devel libstdc++-devel libxcb-devel libX11-devel libxshmfence-devel libXrandr-devel wayland-devel
pip3 install jinja2 ruamel.yaml
sudo yum -y install openssl-devel.i686 gcc-c++ python3 python3-pip curl glibc-devel.i686 libstdc++-devel.i686 libxcb-devel.i686 libX11-devel.i686 libxshmfence-devel.i686 libXrandr-devel.i686 wayland-devel.i686
pip3 install jinja2 ruamel.yaml
Les outils de compilation de shaders tels que DirectXShaderCompiler et glslang doivent être installés pour créer la prise en charge du lancer de rayons.
Il est recommandé de les installer à partir de VulkanSDK 1.3.290 ou supérieur.
Ubuntu 22.04 (Jammy)
wget -qO- https://packages.lunarg.com/lunarg-signing-key-pub.asc | sudo tee /etc/apt/trusted.gpg.d/lunarg.asc
sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-1.3.290-jammy.list https://packages.lunarg.com/vulkan/1.3.290/lunarg-vulkan-1.3.290-jammy.list
sudo apt update
sudo apt install vulkan-sdk
Obtenez DirectXShaderCompiler et le code source de glslang et créez des outils en local.
#!/bin/bash
if [ ! -d DirectXShaderCompiler ]; then
git clone --depth=1 -b release-1.8.2403 https://github.com/microsoft/DirectXShaderCompiler.git
fi
if [ ! -d glslang ]; then
git clone --depth=1 -b vulkan-sdk-1.3.290.0 https://github.com/KhronosGroup/glslang.git
fi
cd DirectXShaderCompiler
git submodule init
git submodule update
cmake -H. -Bbuilds -GNinja -DCMAKE_BUILD_TYPE=Release -C ./cmake/caches/PredefinedParams.cmake
cmake --build builds
cd ..
cd glslang
cmake -H. -Bbuilds -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX='builds/install'
cd builds
make -j8 install
cd ../../
Définissez env PATH et LD_LIBRARY_PATH avant la construction du pilote amdvlk.
export PATH=/builds/bin:/install/bin:$PATH
export LD_LIBRARY_PATH=/builds/lib:$LD_LIBRARY_PATH
mkdir ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:"$PATH"
mkdir vulkandriver
cd vulkandriver
repo init -u https://github.com/GPUOpen-Drivers/AMDVLK.git -b master
repo sync
Remarque Le code source de la branche dev peut être obtenu en utilisant « -b dev » dans la commande « repo init ».
cmake -G Ninja -S xgl -B builds/Release64
cmake --build builds/Release64
cmake -G Ninja -S xgl -B builds/Release32 -DCMAKE_C_FLAGS=-m32 -DCMAKE_CXX_FLAGS=-m32
cmake --build builds/Release32
Note
- Pour la version de débogage, utilisez
-DCMAKE_BUILD_TYPE=Debug -DLLVM_PARALLEL_LINK_JOBS=2
(lier une version de débogage de llvm est très gourmand en mémoire, nous n'utilisons donc que deux tâches parallèles).- Si vous souhaitez créer des outils (tels que amdllpc) avec le pilote, ajoutez
-m build_with_tools.xml
dans repo init et ajoutez l'option de construction-DXGL_BUILD_TOOLS=ON
.
Vous pouvez télécharger et installer le package SDK ici.
sudo apt install libssl3
sudo yum install openssl-libs
sudo cmake --install builds/Release64 --component icd
sudo cmake --install builds/Release32 --component icd
Si vous souhaitez installer le pilote dans un répertoire personnalisé, vous pouvez ajouter "-DCMAKE_INSTALL_PREFIX={répertoire d'installation}" dans la commande cmake build. Les fichiers JSON seront installés dans /etc/vulkan/icd.d tandis que les autres fichiers seront installés dans le répertoire d'installation que vous avez spécifié.
Si RADV est également installé sur le système, le pilote AMDVLK sera activé par défaut après l'installation. Vous pouvez basculer le pilote entre AMDVLK et RADV par la variable d'environnement AMD_VULKAN_ICD = AMDVLK ou RADV.
Remarque : Les étapes restantes ne sont requises que lors de l'exécution de la pile de pilotes en amont AMDGPU.
Ajoutez les lignes suivantes dans /usr/share/X11/xorg.conf.d/10-amdgpu.conf :
Section "Device"
Identifier "AMDgpu"
Option "DRI" "3"
EndSection
Et assurez-vous que la ligne suivante n'est PAS incluse dans la section :
Driver "modesetting"
Sur la pile de pilotes en amont AMDGPU avec une version de libdrm inférieure à 2.4.92, le nombre maximum d'IB par soumission DOIT être limité à 4 (le paramètre par défaut dans le pilote AMD Open Source pour Vulkan est 16). Cela peut être accompli via le mécanisme des paramètres d'exécution en ajoutant la ligne suivante à amdPalSettings.cfg :
MaxNumCmdStreamsPerSubmit,4
CommandBufferCombineDePreambles,1
Vous pouvez générer le package d'installation avec la commande ci-dessous lors de la création du pilote :
cmake -G Ninja -S xgl -B builds/Release64 [-DPACKAGE_VERSION=package version]
cmake --build builds/Release64 --target makePackage
cmake -G Ninja -S xgl -B builds/Release64 [-DPACKAGE_VERSION=package version]
cmake --build builds/Release64 --target makePackage
Vous pouvez également télécharger un package prédéfini à partir de https://github.com/GPUOpen-Drivers/AMDVLK/releases pour chaque promotion de code dans la branche principale.
Ci-dessous les instructions d'installation :
sudo dpkg -r amdvlk # If old version is installed on the machine, remove it first
sudo dpkg -i amdvlk_x.x.x_amd64.deb
sudo apt-get -f install
sudo rpm -e amdvlk # If old version is installed on the machine, remove it first
sudo rpm -i amdvlk-x.x.x.x86_64.rpm
Pour Ubuntu, vous pouvez également installer la dernière version du pilote depuis https://repo.radeon.com :
sudo wget -qO - http://repo.radeon.com/amdvlk/apt/debian/amdvlk.gpg.key | sudo apt-key add -
sudo sh -c 'echo deb [arch=amd64,i386] http://repo.radeon.com/amdvlk/apt/debian/ bionic main > /etc/apt/sources.list.d/amdvlk.list'
sudo apt-get remove amdvlk # If old version is installed on the machine, remove it first
sudo apt update
sudo apt-get install amdvlk
Le pilote expose de nombreux paramètres permettant de personnaliser son comportement et de faciliter le débogage. Vous pouvez ajouter/modifier des paramètres dans le fichier amdVulkanSettings.cfg ou amdPalSettings.cfg sous l'un des chemins ci-dessous, formatés avec un name,value
par ligne :
Quelques exemples de paramètres sont répertoriés ci-dessous :
Nom du paramètre | Valeurs valides | Commentaire |
---|---|---|
AllowVkPipelineCachingToDisk | 0 : interdire 1 : par défaut | 1 est la valeur par défaut qui active la mise en cache basée sur les fichiers d'archives de Pal. Le fichier d'archive est stocké sous ~/.cache/AMD/VkCache. |
ShaderCacheMode | 0 : désactiver le cache 1 : cache d’exécution 2 : cache sur le disque | Le cache d'exécution est le mode par défaut. Pour "cache sur disque", le fichier cache est généré sous $AMD_SHADER_DISK_CACHE_PATH/AMD/LlpcCache ou $XDG_CACHE_HOME/AMD/LlpcCache ou $HOME/.cache/AMD/LlpcCache |
IFH | 0 : par défaut 1 : abandonner toutes les soumissions | Matériel infiniment rapide. Les appels de soumission sont abandonnés avant d'être envoyés au matériel. Utile pour mesurer les performances limitées du processeur. |
EnableVmAlwaysValid | 0 : désactiver 1 : par défaut 2 : forcer l'activation | 1 est le paramètre par défaut qui active la fonctionnalité VM-always-valid pour le noyau 4.16 et supérieur. Cette fonctionnalité peut réduire la surcharge de soumission du tampon de commandes liée à la gestion de la mémoire virtuelle. |
IdleAfterSubmitGpuMask | Masque de bits des GPU (c'est-à-dire que le bit 0 est GPU0, etc.) | Force le processeur à attendre immédiatement la fin de chaque soumission de GPU sur l'ensemble de GPU spécifié. |
Tous les paramètres disponibles peuvent être déterminés en examinant les fichiers sources ci-dessous qui les définissent.
Les paramètres d'exécution ne sont lus qu'à l'initialisation de l'appareil et ne peuvent pas être modifiés sans redémarrer l'application. Si vous utilisez un système doté de plusieurs GPU, les mêmes paramètres s'appliqueront à tous. Lignes du fichier de paramètres commençant par ;
seront traités comme des commentaires.
Les extensions en cours de développement ne sont pas activées par défaut dans le pilote. Vous pouvez les activer via la variable d'environnement :
export AMDVLK_ENABLE_DEVELOPING_EXT=" [...]"
ou
export AMDVLK_ENABLE_DEVELOPING_EXT="all"
Le nom de l'extension n'est pas sensible à la casse.
Le GpuProfiler est une couche facultative conçue pour intercepter l'interface PAL afin de fournir une prise en charge de base du profilage GPU. Actuellement, cette couche est contrôlée exclusivement via les paramètres d'exécution et génère ses résultats dans un fichier.
Vous pouvez utiliser les paramètres d'exécution suivants pour générer des fichiers .csv avec les timings GPU du travail effectué pendant les images désignées d'une application (un fichier pour chaque image) :
Nom du paramètre | Valeur | Commentaire |
---|---|---|
GpuProfilerMode | 0 : désactiver 1 : activer avec sqtt désactivé 2 : activer avec sqtt pour la trace des threads 3 : activer avec sqtt pour RGP | Active et définit le mode SQTT pour la couche du profileur de performances GPU. La capture réelle des données de performances doit être spécifiée via le numéro de trame avec GpuProfilerConfig_StartFrame ou en appuyant sur Shift-F11. |
GpuProfilerConfig.LogDirectory | | Le chemin du répertoire est relatif à $AMD_DEBUG_DIR ou $TMPDIR ou /var/tmp/, la valeur par défaut est "amdpal/". Votre application doit disposer d'autorisations d'écriture sur le répertoire. Les journaux de profilage sont générés dans un sous-répertoire nommé au format |
GpuProfilerConfig.Granularity | 0 : par tirage 1 : par-cmdbuf | Définit ce qui est mesuré/profilé. Par tirage multiplie les commandes individuelles (telles que dessiner, répartir, etc.) dans les tampons de commandes, tandis que per-cmdbuf ne profile que l'ensemble des tampons de commandes dans leur ensemble. |
GpuProfilerConfig.StartFrame | Entier positif | Première image pour laquelle capturer les données. Si StartFrame et FrameCount ne sont pas définis, toutes les images seront profilées. |
GpuProfilerConfig.FrameCount | Entier positif | Nombre d'images pour lesquelles capturer des données. |
GpuProfilerConfig.RecordPipelineStats | 0, 1 | Rassemble les données de requête statistiques du pipeline par entrée si cette option est activée. |
Vous pouvez utiliser le script timingReport.py pour analyser le journal de profilage :
python timingReport.py
La sortie de timeReport.py inclut les informations des principaux pipelines comme ci-dessous :
Top Pipelines (>= 1%)
Compiler Hash | Type | Avg. Call Count | Avg. GPU Time [us] | Avg. Frame %
1. 0xd91d15e42d62dcbb | VsPs | 43 | 11,203.15 | 10.20 %
2. 0x724e9af55f2adf1b | Cs | 1 | 9,347.50 | 8.51 %
3. 0x396e5ad6f7a789f7 | VsHsDsPs | 468 | 8,401.35 | 7.65 %
Vous pouvez ajouter les paramètres suivants à amdPalSettings.cfg pour vider les informations de chaque pipeline :
EnablePipelineDump,1
PipelineDumpDir,
PipelineDumpDir est un sous-chemin relatif à $AMD_DEBUG_DIR ou $TMPDIR ou /var/tmp/, la valeur par défaut est "spvPipeline/". Le fichier de vidage du pipeline est nommé au format Pipeline
La superposition de débogage de PAL peut être activée pour afficher des statistiques et des informations en temps réel au-dessus d'une application en cours d'exécution. Cela inclut une moyenne glissante des FPS, des durées d'images du CPU et du GPU, ainsi qu'un registre qui suit la quantité de mémoire vidéo allouée à chaque tas disponible. L'analyse comparative (c'est-à-dire « Benchmark (F11) ») n'est actuellement pas prise en charge.
Nom du paramètre | Valeur | Commentaire |
---|---|---|
DebugOverlayEnabled | 0, 1 | Active la superposition de débogage. |
DebugOverlayConfig.DebugOverlayLocation | 0 : en haut à gauche 1 : en haut à droite 2 : en bas à gauche 3 : en bas à droite | Détermine où le texte superposé doit être affiché. Peut être utilisé pour éviter une collision avec un rendu important par l'application. |
DebugOverlayConfig.PrintFrameNumber | 0, 1 | Indique le numéro de trame actuel. Utile pour déterminer une bonne plage d'images pour le profilage avec la couche GpuProfiler. |
DebugOverlayConfig.TimeGraphEnable | 0, 1 | Permet le rendu d'un graphique des temps d'image récents du CPU et du GPU. |
Le pilote AMD Open Source pour Vulkan contient du code écrit par des tiers.
Les informations contenues dans ce document sont fournies à titre informatif uniquement et sont susceptibles d'être modifiées sans préavis. Ce document peut contenir des inexactitudes techniques, des omissions et des erreurs typographiques, et AMD n'a aucune obligation de mettre à jour ou de corriger ces informations. Advanced Micro Devices, Inc. ne fait aucune déclaration ou garantie quant à l'exactitude ou à l'exhaustivité du contenu de ce document, et n'assume aucune responsabilité de quelque nature que ce soit, y compris les garanties implicites de non-contrefaçon, de qualité marchande ou d'adéquation à des fins particulières, en ce qui concerne le fonctionnement ou l'utilisation du matériel, des logiciels ou d'autres produits AMD décrits dans le présent document. Aucune licence, y compris implicite ou découlant d'une préclusion, sur des droits de propriété intellectuelle n'est accordée par ce document. Les conditions et limitations applicables à l'achat ou à l'utilisation des produits AMD sont telles qu'énoncées dans un accord signé entre les parties ou dans les conditions générales de vente standard d'AMD.
AMD, le logo AMD Arrow, Radeon, FirePro et leurs combinaisons sont des marques commerciales d'Advanced Micro Devices, Inc. Les autres noms de produits utilisés dans cette publication sont uniquement à des fins d'identification et peuvent être des marques commerciales de leurs sociétés respectives.
Vega est un nom de code pour l'architecture AMD et n'est pas un nom de produit.
Linux est une marque déposée de Linus Torvalds aux États-Unis et dans d'autres pays.
Vulkan et le logo Vulkan sont des marques déposées de Khronos Group, Inc.