【问题标题】:Nodejs GPU.js slower using GPU than using CPUNodejs GPU.js 使用 GPU 比使用 CPU 慢
【发布时间】:2020-12-19 13:38:47
【问题描述】:

我已经运行了一个基准测试来比较 nodejs 和 GPU.js 中 CPU 和 GPU 的使用情况。 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 += 不是,所以一个想法是使用另一个数组来存储循环调用,并从这个数组中计算总和。
  • 哇!我从 GPU.js 站点 gpu.rocks 中获取了这个示例。我认为它会为每一对 (i, j) 并行运行
  • 您的 GPU 速度较慢或 CPU 速度较快,或两者兼而有之。我有一个 1070,在 CPU 上得到约 80 毫秒与 350 毫秒。
  • 不确定,如果它在 gpu.js 上,那么我希望它知道如何优化 += & **。在我的机器上运行你的代码我得到 44 毫秒和 239 毫秒。所以 GPU 的运行速度快了大约 6 倍。

标签: javascript node.js gpgpu


【解决方案1】:

这不是对 CPU 和 GPU 进行基准测试的方法

  1. GPU 有预热时间,所以如果你真的想在 1000 次执行而不是单次执行上对它们进行基准测试

  2. GPU 并不总是更快,这取决于任务和 GPU RAM 大小

  3. 最后正如 Keith 在评论中提到的那样,gpu 在并行小任务和大批量中的效果比 cpu 更好

【讨论】:

  • 是的,我想你的位置在这里。我刚刚重做了 Op 的例子,但是做了 100 次迭代,GPU 719ms & CPU 26555。所以 GPU 快了 37 倍。也许 OP 的预热时间对他的硬件设置有很大的影响。
  • OK,运行了 1000 次,GPU 变得更快了。但我仍然无法理解如何让我的内核函数并行运行。还是已经平行了?如何检查?
  • 下载 nvidia-smi 它提供了一个命令行工具,可以显示每个进程中使用了多少内核
  • 太棒了!现在一切都说得通了。谢谢!
  • 从矩阵维度上的 1024 开始,GPU 性能更好,因此并行增益正在补偿预热。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
  • 2012-10-31
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 2015-12-27
相关资源
最近更新 更多