GPU.js : exécuter du JavaScript sur le GPU de votre machine

Par:
fredericmazue

mer, 13/03/2019 - 10:00

A découvrir absolument par les geeks, les amateurs de performances, ou les esprits curieux : GPU.js

GPU.js est une bibliothèque d'accélération JavaScript pour GPGPU (General Purpose computing on GPU). Cette bibliothèque compile votre code JavaScript en un langage de shader pour l'exécuter sur le GPU de votre machine et profiter ainsi de son accélération. S'il n'y a pas de GPU présent sur la machine, le code JavaScript est exécuté normalement.

Plus exactement ce sont chacune des fonctions de votre code JavaScript qui sont compilées en langage de shader. Chaque fonction devient un kernel (ou compute kernel) c'est-à-dire une routine compilée pour être exécutée sur un accélérateur.

Selon votre matériel, l'exécution de votre code peut être jusqu'à 15 fois plus rapide avec GPU.js que sans.

Soit un exemple de code dont le but est de multiplier 2 matrices de taille 512*512.

const gpu = new GPU();

const matMult = gpu.createKernel(function(a, b) {
    var sum = 0;
    for (var i = 0; i < 512; i++) {
        sum += a[this.thread.y][i] * b[i][this.thread.x];
    }
    return sum;
}).setOutput([512, 512]);

Ce code définit un kernel qui calcule un simple élément de la matrice. Ce code va être parallélisé sur le GPU pour calculer tous les éléments de la matrice... en parallèle.

On invoque alors le kernel ainsi :

const c = matMult(a, b);

a et b étant bien sûr les deux matrices à multiplier.

Il est possible de combiner les kernels. L'exemple ci-dessous définit des opérations mathématiques simple, addition et multiplication, puis les combine en un 'superkernel' qui effectue une multiplication sur le résultat d'une addition

const add = gpu.createKernel(function(a, b) {
           return a + b;
}).setOutput([20]);
 
const multiply = gpu.createKernel(function(a, b) {
           return a * b;
}).setOutput([20]);

const superKernel = gpu.combineKernels(add, multiply, function(a, b, c) {
           return multiply(add(a[this.thread.x], b[this.thread.x]), c[this.thread.x]);
});

superKernel(a, b, c);

La bibliothèque GPU.js est très riche en fonctionnalités et elle mérite vraiment d'être découverte, même si sa documentation n'est pas parfaitement à jour au moment où nous écrivons ces lignes. Les auteurs sont en train d'y remédier.

GPU.js est un logiciel libre sous licence MIT, disponible sur GitHub et qui dispose d'un site dédié.