Nodejs GPU.js медленнее при использовании GPU, чем при использовании CPU

Я провел тест, чтобы сравнить использование 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 имеет большой выигрыш, когда вычисления ведутся параллельно. sum += нет, поэтому одна идея состоит в том, чтобы использовать другой массив для хранения вызовов цикла и вычислять сумму из этого массива.

Keith 19.12.2020 14:47

Ух ты! Я взял этот пример с сайта GPU.js, gpu.rocks. Я думал, что это будет работать параллельно для каждой пары (i, j)

Eduardo Poço 19.12.2020 15:06

У вас медленный графический процессор или быстрый процессор, или и то, и другое. У меня 1070, и я получаю ~ 80 мс против 350 мс на процессоре.

Sergiu Paraschiv 19.12.2020 15:17

Не уверен, если он на gpu.js, то я ожидаю, что он умеет оптимизировать += & **. Запустив ваш код на моей машине, я получаю 44 мс и 239 мс. Таким образом, GPU работает примерно в 6 раз быстрее.

Keith 19.12.2020 15:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
4
2 429
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

это не способ сравнить CPU и GPU

  1. у графического процессора есть время прогрева, поэтому, если вы действительно хотите сравнить их оба при выполнении 1000, а не при одном выполнении

  2. Графический процессор не всегда будет быстрее, это зависит от задачи и размера ОЗУ графического процессора.

  3. и, наконец, как упоминает Кит в комментарии, GPU работает лучше, чем CPU в параллельных небольших задачах и больших пакетах.

Да, я думаю, твое место здесь. Я только что переделал пример Op, но сделал 100 итераций, а также GPU 719 мс и CPU 26555. Таким образом, для GPU в 37 раз быстрее. Возможно, время прогрева ОП сильно влияет на настройку его оборудования.

Keith 19.12.2020 16:03

ОК, получилось 1000 прогонов и GPU стал быстрее. Но я до сих пор не могу понять, как заставить мою функцию ядра работать параллельно. Или уже параллельно? Как это проверить?

Eduardo Poço 19.12.2020 16:04

загрузите nvidia-smi, он предоставляет инструмент командной строки, который может показать вам, сколько ядер используется в каждом процессе.

Naor Tedgi 19.12.2020 16:08

Большой! Теперь все имеет смысл. Спасибо!

Eduardo Poço 19.12.2020 16:11

Начиная с размерности матрицы 1024, GPU работает лучше, поэтому параллельное усиление компенсирует прогрев.

Eduardo Poço 19.12.2020 23:05

Другие вопросы по теме