Compatibilité des fonctions intégrées DP4a avec WGSL
DP4a (produit Dot de 4 éléments et Accumulate) 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 de 8 bits pour accélérer le calcul de ces modèles quantifiés "int8". Par rapport à la version f32, elle permet d'économiser (jusqu'à 75%) de la mémoire et de la bande passante réseau, et d'améliorer les performances de n'importe quel modèle de machine learning en inférence. Par conséquent, il est désormais largement utilisé dans de nombreux frameworks d'IA courants.
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 de 32 bits contenant des vecteurs à 4 composants d'entiers de 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 les instructions d'empaquetage et de décompression avec des vecteurs empaquetés à quatre composants d'entiers de 8 bits avec les fonctions WGSL intégrées pack4xI8
, pack4xU8
, pack4xI8Clamp
, pack4xU8Clamp
, unpack4xI8
et unpack4xU8
.
Il est recommandé d'utiliser une instruction required-directive pour signaler la non-portabilité potentielle en ajoutant requires packed_4x8_integer_dot_product;
en haut du code de votre nuanceur WGSL. Consultez l'exemple suivant et le problème de teinte: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
}`,
});
Nous remercions l'équipe Web Graphics d'Intel à Shanghai pour avoir contribué à l'achèvement de cette spécification et de cette implémentation.
Paramètres de pointeur sans restriction dans WGSL
L'extension de langage WGSL "unrestricted_pointer_parameters"
allège les restrictions concernant 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.Transmettre des pointeurs vers des membres de la structure et des éléments de tableau à des fonctions déclarées par l'utilisateur.
Pour en savoir plus, consultez Pointers As Function Parameters | Tour of WGSL.
Cette fonctionnalité peut être détectée à l'aide de navigator.gpu.wgslLanguageFeatures
. Il est recommandé de toujours utiliser une instruction required-directive pour signaler la non-portabilité potentielle avec requires unrestricted_pointer_parameters;
en haut du code de votre nuanceur WGSL. Consultez l'exemple suivant, où les spécifications WGSL ont été modifiées et 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 déréférencer 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 utilisant la même syntaxe à points (.
), 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 une "référence" qui peut être déréférencé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épart d'un tableau, l'utilisation de pa[i]
vous permet d'accéder directement à l'emplacement de la mémoire où est stocké l'élément 'i
du tableau.
Il est recommandé d'utiliser une instruction required-directive pour signaler la non-portabilité potentielle en ajoutant requires pointer_composite_access;
en haut du code de votre 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 du pochoir et de la profondeur
Auparavant, les rattachements de profondeur et de pochoir 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 maintenant utiliser l'aspect de profondeur en lecture seule, par exemple pour le traçage des ombres de contact, tandis que le tampon de pochoir est écrit pour identifier les pixels en vue d'un traitement ultérieur. Voir issue dawn:2146.
Mises à jour 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 change dawn:173620.
La méthode wgpuSurfaceGetPreferredFormat()
de l'API webgpu.h a été implémentée. Voir issue dawn:1362.
Nous n'aborderons ici que certains des points clés. Consultez la liste exhaustive des commits.
Nouveautés de WebGPU
Liste des points abordés dans la série Nouveautés de WebGPU.
Chrome 125
- Sous-groupes (fonctionnalité en cours de développement)
- Effectuer le rendu sur une tranche de texture 3D
- Informations dès 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 dès l'aube
Chrome 123
- Compatibilité des fonctions intégrées DP4a en WGSL
- Paramètres de pointeur non restreints dans WGSL
- Sucre syntaxique pour déréférencer des composites en WGSL
- État en lecture seule distinct pour les aspects du pochoir et de la profondeur
- Informations dès l'aube
Chrome 122
- Élargir la couverture grâce au mode de compatibilité (fonctionnalité en développement)
- Augmenter la limite maxVertexAttributes
- Informations dès l'aube
Chrome 121
- Prendre en charge WebGPU sur Android
- Utiliser DXC au lieu de FXC pour la compilation de nuanceurs sous Windows
- Horodatage des requêtes dans les passes de calcul et de rendu
- Points d'entrée par défaut des modules de nuanceurs
- Prendre en charge display-p3 en tant qu'espace colorimétrique GPUExternalTexture
- Informations sur les segments de mémoire
- Informations dès l'aube
Chrome 120
- Compatibilité avec les valeurs à virgule flottante 16 bits dans WGSL
- Repoussez les limites
- Modifications de l'état du pochoir de profondeur
- Mises à jour des informations concernant l'adaptateur
- Quantification des requêtes d'horodatage
- Fonctionnalités de nettoyage de printemps
Chrome 119
- Textures flottantes 32 bits filtrables
- Format des sommets unorm10-10-10-2
- format de texture rgb10a2uint
- Informations dès l'aube
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 dès l'aube
Chrome 117
- Tampon des sommets non défini
- Groupe de liaisons non défini
- Couper le son des erreurs lors de la création asynchrone d'un pipeline en cas de perte d'un appareil
- Mises à jour 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 dès l'aube
Chrome 116
- Intégration de WebCodecs
- Appareil perdu renvoyé par GPUAdapter
requestDevice()
- Assurer une lecture vidéo fluide si
importExternalTexture()
est appelé - Conformité aux spécifications
- Améliorer l'expérience des développeurs
- Informations dès 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 dès l'aube
Chrome 114
- Optimiser JavaScript
- getCurrentTexture() sur un canevas non configuré génère une erreur InvalidStateError
- Mises à jour WGSL
- Informations dès l'aube