【发布时间】: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