Я провел тест, чтобы сравнить использование CPU и GPU в nodejs с GPU.js. Значок NVidia показывает использование GPU в первом таймере консоли, но оно медленнее, чем CPU (второй таймер).
const {GPU} = require('gpu.js');
const gpu = new GPU();
const multiplyMatrix = gpu.createKernel(function(a, b) {
let sum = 0;
for (let i = 0; i < 512; i++) {
sum += a[this.thread.y][i] * b[i][this.thread.x];
}
return sum;
}).setOutput([512, 512]);
var a = [];
var b = [];
for (var i = 0; i < 512; i++) {
a.push([]);
b.push([]);
for (var j = 0; j < 512; j++) {
a[i].push(1);
b[i].push(-1);
}
}
console.time("gpu");
const c = multiplyMatrix(a, b);
console.timeEnd("gpu"); //2148ms
console.time("cpu");
var d = [];
for (var i = 0; i < 512; i++) {
d.push([]);
for (var j = 0; j < 512; j++) {
let sum = 0;
for (let k = 0; k < 512; k++) {
sum += a[i][k] * b[k][j];
}
d[i].push(sum);
}
}
console.timeEnd("cpu"); //710ms
Я делаю что-то явно не так?
Ух ты! Я взял этот пример с сайта GPU.js, gpu.rocks. Я думал, что это будет работать параллельно для каждой пары (i, j)
У вас медленный графический процессор или быстрый процессор, или и то, и другое. У меня 1070, и я получаю ~ 80 мс против 350 мс на процессоре.
Не уверен, если он на gpu.js, то я ожидаю, что он умеет оптимизировать += & **. Запустив ваш код на моей машине, я получаю 44 мс и 239 мс. Таким образом, GPU работает примерно в 6 раз быстрее.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


это не способ сравнить CPU и GPU
у графического процессора есть время прогрева, поэтому, если вы действительно хотите сравнить их оба при выполнении 1000, а не при одном выполнении
Графический процессор не всегда будет быстрее, это зависит от задачи и размера ОЗУ графического процессора.
и, наконец, как упоминает Кит в комментарии, GPU работает лучше, чем CPU в параллельных небольших задачах и больших пакетах.
Да, я думаю, твое место здесь. Я только что переделал пример Op, но сделал 100 итераций, а также GPU 719 мс и CPU 26555. Таким образом, для GPU в 37 раз быстрее. Возможно, время прогрева ОП сильно влияет на настройку его оборудования.
ОК, получилось 1000 прогонов и GPU стал быстрее. Но я до сих пор не могу понять, как заставить мою функцию ядра работать параллельно. Или уже параллельно? Как это проверить?
загрузите nvidia-smi, он предоставляет инструмент командной строки, который может показать вам, сколько ядер используется в каждом процессе.
Большой! Теперь все имеет смысл. Спасибо!
Начиная с размерности матрицы 1024, GPU работает лучше, поэтому параллельное усиление компенсирует прогрев.
Здесь нет эксперта, но, насколько я понимаю, GPU имеет большой выигрыш, когда вычисления ведутся параллельно.
sum +=нет, поэтому одна идея состоит в том, чтобы использовать другой массив для хранения вызовов цикла и вычислять сумму из этого массива.