Compatibilité des fonctions intégrées DP4a avec WGSL
DP4a (produit scalaire sur quatre éléments et accumulation) fait référence à un ensemble d'instructions GPU couramment utilisées dans l'inférence de deep learning à des fins de quantification. Elle exécute efficacement des produits scalaires entiers 8 bits pour accélérer le calcul de ces modèles quantifiés int8. Cette solution permet d'économiser (jusqu'à 75%) de la mémoire et de la bande passante réseau, et d'améliorer les performances de tous les modèles de machine learning en matière d'inférence par rapport à leur version f32. Par conséquent, elle est désormais largement utilisée dans de nombreux frameworks d'IA populaires.
Lorsque l'extension de langage WGSL "packed_4x8_integer_dot_product"
est présente dans navigator.gpu.wgslLanguageFeatures
, vous pouvez désormais utiliser des scalaires entiers 32 bits contenant des vecteurs d'entiers à 4 composants d'entiers 8 bits en tant qu'entrées des instructions de produit scalaire dans le code du nuanceur WGSL avec les fonctions intégrées dot4U8Packed
et dot4I8Packed
. Vous pouvez également utiliser des instructions de compression et de décompression avec des vecteurs empaquetés d'entiers 8 bits à quatre composants avec les fonctions WGSL intégrées pack4xI8
, pack4xU8
, pack4xI8Clamp
, pack4xU8Clamp
, unpack4xI8
et unpack4xU8
.
Nous vous recommandons d'utiliser une directive obligatoire pour signaler le risque de non-portabilité avec requires packed_4x8_integer_dot_product;
en haut de votre code de nuanceur WGSL. Consultez l'exemple suivant et le problème tint:1497.
if (!navigator.gpu.wgslLanguageFeatures.has("packed_4x8_integer_dot_product")) {
throw new Error(`DP4a built-in functions are not available`);
}
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const shaderModule = device.createShaderModule({ code: `
requires packed_4x8_integer_dot_product;
fn main() {
const result: u32 = dot4U8Packed(0x01020304u, 0x02040405u); // 42
}`,
});
Un grand merci à l'équipe Intel Web Graphics à Shanghai pour la réalisation de cette spécification et son implémentation !
Paramètres de pointeur sans restriction dans WGSL
L'extension de langage WGSL "unrestricted_pointer_parameters"
assouplit les restrictions sur les pointeurs pouvant être transmis aux fonctions WGSL:
Pointeurs de paramètres des espaces d'adressage
storage
,uniform
etworkgroup
vers les fonctions déclarées par l'utilisateur.Transmission de pointeurs aux membres de structure et d'éléments de tableau aux fonctions déclarées par l'utilisateur.
Découvrez les pointeurs en tant que paramètres de fonction | Visite guidée de WGSL pour en savoir plus
Cette fonctionnalité peut être détectée à l'aide de navigator.gpu.wgslLanguageFeatures
. Il est recommandé de toujours utiliser une directive obligatoire pour signaler le risque de non-portabilité avec requires unrestricted_pointer_parameters;
en haut de votre code de nuanceur WGSL. Consultez l'exemple suivant, les modifications de la spécification WGSL et la teinte du problème:2053.
if (!navigator.gpu.wgslLanguageFeatures.has("unrestricted_pointer_parameters")) {
throw new Error(`Unrestricted pointer parameters are not available`);
}
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const shaderModule = device.createShaderModule({ code: `
requires unrestricted_pointer_parameters;
@group(0) @binding(0) var<storage, read_write> S : i32;
fn func(pointer : ptr<storage, i32, read_write>) {
*pointer = 42;
}
@compute @workgroup_size(1)
fn main() {
func(&S);
}`
});
Syntaxe sucré pour déréférencer les composites dans WGSL
Lorsque l'extension de langage WGSL "pointer_composite_access"
est présente dans navigator.gpu.wgslLanguageFeatures
, votre code de nuanceur WGSL prend désormais en charge l'accès aux composants de types de données complexes utilisant la même syntaxe à point (.
), que vous travailliez directement avec les données ou avec un pointeur vers celles-ci. Le principe est le suivant :
Si
foo
est un pointeur:foo.bar
est un moyen plus pratique d'écrire(*foo).bar
. L'astérisque (*
) est normalement nécessaire pour transformer le pointeur en "référence" qui peuvent être déréférencés, mais maintenant les pointeurs et les références sont beaucoup plus similaires et presque interchangeables.Si
foo
n'est pas un pointeur: l'opérateur point (.
) fonctionne exactement comme vous en avez l'habitude pour accéder directement aux membres.
De même, si pa
est un pointeur qui stocke l'adresse de départ d'un tableau, l'utilisation de pa[i]
vous donne un accès direct à l'emplacement de la mémoire où est stocké le 'i
ième élément de ce tableau.
Nous vous recommandons d'utiliser une directive obligatoire pour signaler le risque de non-portabilité avec requires pointer_composite_access;
en haut de votre code de nuanceur WGSL. Consultez l'exemple suivant et le problème tint:2113.
if (!navigator.gpu.wgslLanguageFeatures.has("pointer_composite_access")) {
throw new Error(`Pointer composite access is not available`);
}
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const shaderModule = device.createShaderModule({ code: `
requires pointer_composite_access;
fn main() {
var a = vec3f();
let p : ptr<function, vec3f> = &a;
let r1 = (*p).x; // always valid.
let r2 = p.x; // requires pointer composite access.
}`
});
État en lecture seule distinct pour les aspects de pochoir et de profondeur
Auparavant, les pièces jointes de profondeur et de stencil en lecture seule dans les passes de rendu nécessitaient que les deux aspects (profondeur et pochoir) soient en lecture seule. Cette limite a été levée. Vous pouvez désormais utiliser l'aspect de profondeur en lecture seule, par exemple pour le traçage de l'ombre de contact, tandis que le tampon du pochoir est écrit pour identifier les pixels à traiter. Voir issue dawn:2146.
Actualités de l'aube
Le rappel d'erreur non capturé défini avec wgpuDeviceSetUncapturedErrorCallback()
est désormais appelé immédiatement lorsque l'erreur se produit. C'est ce que les développeurs attendent et veulent systématiquement pour le débogage. Voir Modifier dawn:173620.
La méthode wgpuSurfaceGetPreferredFormat()
de l'API webgpu.h a été implémentée. Voir issue dawn:1362.
Cette présentation ne porte que sur certains points clés. Consultez la liste exhaustive des commits.
Nouveautés de WebGPU
Liste de tous les sujets abordés dans la série Nouveautés de WebGPU
Chrome 128
- Tester avec des sous-groupes
- Abandon de la définition du biais de profondeur pour les lignes et les points
- Masquer l'avertissement d'erreur non capturée dans les outils de développement si preventDefault
- WGSL interpole d'abord l'échantillonnage, puis
- Informations sur l'aube
Chrome 127
- Compatibilité expérimentale avec OpenGL ES sur Android
- Attribut d'informations GPUAdapter
- Améliorations de l'interopérabilité de WebAssembly
- Amélioration des erreurs liées à l'encodeur de commande
- Informations sur l'aube
Chrome 126
- Augmentation de la limite maxTextureArrayLayers
- Optimisation de l'importation de tampon pour le backend Vulkan
- Amélioration du temps de compilation des nuanceurs
- Les tampons de commande envoyés doivent être uniques
- Informations sur l'aube
Chrome 125
- Sous-groupes (fonctionnalité en cours de développement)
- Effectuer le rendu d'une tranche de texture 3D
- Informations sur l'aube
Chrome 124
- Textures de stockage en lecture seule et en lecture/écriture
- Assistance pour les service workers et les workers partagés
- Nouveaux attributs d'informations sur l'adaptateur
- Corrections de bugs
- Informations sur l'aube
Chrome 123
- Fonctions intégrées DP4a dans WGSL
- Paramètres de pointeur sans restriction dans WGSL
- Syntaxe sucré pour déréférencer les composites dans WGSL
- État de lecture seule distinct pour les aspects de pochoir et de profondeur
- Informations sur l'aube
Chrome 122
- Élargir la couverture avec le mode de compatibilité (fonctionnalité en développement)
- Augmenter la limite maximale de VertexAttributes
- Informations sur l'aube
Chrome 121
- Compatibilité avec WebGPU sur Android
- Utiliser DXC au lieu de FXC pour la compilation du nuanceur sous Windows
- Requêtes d'horodatage dans les passes de calcul et de rendu
- Points d'entrée par défaut des modules de nuanceurs
- Prise en charge de display-p3 en tant qu'espace colorimétrique GPUExternalTexture
- Informations sur les tas de mémoire
- Informations sur l'aube
Chrome 120
- Compatibilité avec les valeurs à virgule flottante 16 bits dans WGSL
- Repoussez les limites
- Modifications apportées à l'état de profondeur au stencil
- Mises à jour des informations sur l'adaptateur
- Quantification des requêtes d'horodatage
- Fonctionnalités de nettoyage de printemps
Chrome 119
- Textures de float 32 bits filtrables
- Format de sommet unorm10-10-10-2
- rgb10a2uint format de texture
- Informations sur l'aube
Chrome 118
- Compatibilité avec HTMLImageElement et ImageData dans
copyExternalImageToTexture()
- Compatibilité expérimentale avec les textures de stockage en lecture/écriture et en lecture seule
- Informations sur l'aube
Chrome 117
- Tampon de sommets non défini
- Désactiver le groupe de liaisons
- Couper le son des erreurs liées à la création d'un pipeline asynchrone en cas de perte de l'appareil
- Modifications apportées à la création du module de nuanceur SPIR-V
- Améliorer l'expérience des développeurs
- Mettre en cache des pipelines avec une mise en page générée automatiquement
- Informations sur l'aube
Chrome 116
- Intégration de WebCodecs
- Appareil perdu renvoyé par GPUAdapter
requestDevice()
- Maintenir la lecture vidéo fluide si
importExternalTexture()
est appelé - Conformité des spécifications
- Améliorer l'expérience des développeurs
- Informations sur l'aube
Chrome 115
- Extensions de langage WGSL compatibles
- Compatibilité expérimentale avec Direct3D 11
- Utiliser un GPU distinct par défaut sur secteur
- Améliorer l'expérience des développeurs
- Informations sur l'aube
Chrome 114
- Optimiser JavaScript
- getCurrentTexture() sur un canevas non configuré génère InvalidStateError
- Informations concernant WGSL
- Informations sur l'aube