Prise en charge des fonctions intégrées DP4a dans WGSL
DP4a (produit scalaire de quatre éléments et accumulation) fait référence à un ensemble d'instructions GPU couramment utilisées dans l'inférence de deep learning pour la quantification. Il effectue efficacement des produits scalaires entiers de 8 bits pour accélérer le calcul de ces modèles quantifiés en int8. Il peut économiser (jusqu'à 75%) de la mémoire et de la bande passante réseau, et améliorer les performances de tous les modèles de machine learning en inférence par rapport à leur version f32. Par conséquent, il est désormais largement utilisé 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 empaquetant des vecteurs à quatre composantes d'entiers 8 bits comme entrées des instructions de produit scalaire dans votre code de nuanceur WGSL avec les fonctions intégrées dot4U8Packed
et dot4I8Packed
. Vous pouvez également utiliser des instructions d'empaquetage et de désempaquetage avec des vecteurs à quatre composants empaquetés d'entiers 8 bits avec les fonctions intégrées WGSL pack4xI8
, pack4xU8
, pack4xI8Clamp
, pack4xU8Clamp
, unpack4xI8
et unpack4xU8
.
Il est recommandé d'utiliser une directive requires 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 issue 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 merci tout particulier à l'équipe Web Graphics d'Intel à Shanghai, qui a mené à bien cette spécification et cette implémentation.
Paramètres de pointeur non restreints dans WGSL
L'extension de langage WGSL "unrestricted_pointer_parameters"
assouplit les restrictions concernant les pointeurs pouvant être transmis aux fonctions WGSL:
Les pointeurs de paramètre des espaces d'adresses
storage
,uniform
etworkgroup
pointent vers des fonctions déclarées par l'utilisateur.Transmettre des pointeurs vers des membres de structure et des éléments de tableau à des fonctions déclarées par l'utilisateur.
Pour en savoir plus, consultez Pointeurs en tant que paramètres de fonction | Visite guidée de WGSL.
Cette fonctionnalité peut être détectée à l'aide de navigator.gpu.wgslLanguageFeatures
. Il est recommandé d'utiliser toujours une directive requires 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 l'issue tint: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);
}`
});
Sucre syntaxique pour le déréférencement des composites en 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 à l'aide de la même syntaxe de 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 ("*
") était normalement nécessaire pour transformer le pointeur en "référence" pouvant être désécrétée, mais les pointeurs et les références sont désormais 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ébut d'un tableau, l'utilisation de pa[i]
vous permet d'accéder directement à l'emplacement de mémoire où est stocké le 'i
e élément de ce tableau.
Il est recommandé d'utiliser une directive requires 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 issue 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 du pochoir et de la profondeur
Auparavant, les attaches de tampon de profondeur en lecture seule dans les passes de rendu nécessitaient que les deux aspects (profondeur et tampon) soient en lecture seule. Cette limitation a été levée. Vous pouvez désormais utiliser l'aspect profondeur en lecture seule, par exemple pour le traçage d'ombres de contact, tandis que le tampon de modèle est écrit pour identifier les pixels à traiter ultérieurement. Voir le problème dawn:2146.
Informations Dawn
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 change dawn:173620.
La méthode wgpuSurfaceGetPreferredFormat()
de l'API webgpu.h a été implémentée. Consultez le problème dawn:1362.
Il ne s'agit là que de quelques-uns des points clés. Consultez la liste exhaustive des commits.
Nouveautés de WebGPU
Liste de tous les éléments abordés dans la série Nouveautés de WebGPU.
Chrome 131
- Couper les distances en WGSL
- GPUCanvasContext getConfiguration()
- Les primitives de point et de ligne ne doivent pas comporter de biais de profondeur.
- Fonctions intégrées d'analyse inclusive pour les sous-groupes
- Compatibilité expérimentale avec le multi-dessin indirect
- Option de compilation du module de nuanceur "math strict"
- Suppression de la méthode requestAdapterInfo() de GPUAdapter
- Informations sur Dawn
Chrome 130
- Mélange de deux sources
- Améliorations du temps de compilation des nuanceurs sur Metal
- Obsolete de la méthode requestAdapterInfo() de GPUAdapter
- Informations sur Dawn
Chrome 129
- Compatibilité HDR avec le mode de mappage des tons du canevas
- Prise en charge des sous-groupes étendus
- Informations sur Dawn
Chrome 128
- Tester les sous-groupes
- Abandon du paramètre de biais de profondeur pour les lignes et les points
- Masquer l'avertissement DevTools d'erreur non capturée si preventDefault
- WGSL effectue d'abord l'interpolation de l'échantillonnage, puis
- Informations sur Dawn
Chrome 127
- Compatibilité expérimentale d'OpenGL ES sur Android
- Attribut info de GPUAdapter
- Améliorations de l'interopérabilité WebAssembly
- Amélioration des erreurs de l'encodeur de commandes
- Informations sur Dawn
Chrome 126
- Augmentation de la limite maxTextureArrayLayers
- Optimisation de l'importation de tampons pour le backend Vulkan
- Améliorations du temps de compilation des nuanceurs
- Les tampons de commande envoyés doivent être uniques
- Informations sur Dawn
Chrome 125
- Sous-groupes (fonctionnalité en cours de développement)
- Affichage d'une tranche de texture 3D
- Informations sur Dawn
Chrome 124
- Textures de stockage en lecture seule et en lecture/écriture
- Compatibilité avec les service workers et les workers partagés
- Nouveaux attributs d'informations sur l'adaptateur
- Corrections de bugs
- Informations sur Dawn
Chrome 123
- Compatibilité des fonctions intégrées DP4a avec WGSL
- Paramètres de pointeur non restreints dans WGSL
- Syntaxe simplifiée pour le déréférencement des composites en WGSL
- État en lecture seule distinct pour les aspects du pochoir et de la profondeur
- Informations sur Dawn
Chrome 122
- Élargir la couverture avec le mode de compatibilité (fonctionnalité en cours de développement)
- Augmentation de la limite maxVertexAttributes
- Informations sur Dawn
Chrome 121
- Compatibilité avec WebGPU sur Android
- Utiliser DXC au lieu de FXC pour la compilation de nuanceurs sous Windows
- Requêtes de code temporel dans les passes de calcul et de rendu
- Points d'entrée par défaut vers les modules de nuanceurs
- Compatibilité avec display-p3 en tant qu'espace de couleurs GPUExternalTexture
- Informations sur les tas de mémoire
- Informations sur Dawn
Chrome 120
- Compatibilité avec les valeurs à virgule flottante 16 bits dans WGSL
- Repousser les limites
- Modifications apportées à l'état du tampon de profondeur
- Modifications des informations sur les adaptateurs
- Quantification des requêtes d'horodatage
- Fonctionnalités de nettoyage de printemps
Chrome 119
- Textures à virgule flottante 32 bits filtrables
- Format de sommet unorm10-10-10-2
- Format de texture rgb10a2uint
- Informations sur Dawn
Chrome 118
- Compatibilité avec HTMLImageElement et ImageData dans
copyExternalImageToTexture()
- Compatibilité expérimentale avec la texture de stockage en lecture-écriture et en lecture seule
- Informations sur Dawn
Chrome 117
- Désactiver le tampon de sommets
- Désactiver le groupe de liaisons
- Ignorer les erreurs de création de pipeline asynchrone en cas de perte de l'appareil
- Mise à jour de la création de modules de nuanceurs SPIR-V
- Améliorer l'expérience des développeurs
- Mise en cache des pipelines avec une mise en page générée automatiquement
- Informations sur Dawn
Chrome 116
- Intégration de WebCodecs
- Appareil égaré renvoyé par GPUAdapter
requestDevice()
- Maintenir la fluidité de la lecture vidéo si
importExternalTexture()
est appelé - Conformité aux spécifications
- Améliorer l'expérience des développeurs
- Informations sur Dawn
Chrome 115
- Extensions de langage WGSL acceptées
- Compatibilité expérimentale avec Direct3D 11
- Obtenir un GPU distinct par défaut sur l'alimentation secteur
- Améliorer l'expérience des développeurs
- Informations sur Dawn
Chrome 114
- Optimiser JavaScript
- getCurrentTexture() sur un canevas non configuré génère une erreur InvalidStateError
- Mises à jour de WGSL
- Informations sur Dawn