使用 gpu.js 用于元胞自动机



我正在尝试使用 gpu.js 运行 1D 元胞自动机,但看起来我没有 GPU 的代码.js快了 20 倍。我不明白问题出在哪里。

下面的代码从单个ON单元开始运行规则30的元胞自动机。自动机的长度是 2001 个单元格。该代码使用 CPU 和 GPU 计算前 10000 代,对于 CPU,它需要 0.16 秒,而 GPU 需要 3.2 秒。

gen = [];
for (var i = 0; i<1000; i++) gen.push(0);
gen.push(1);	
for (var i = 0; i<1000; i++) gen.push(0);
const gpu = new GPU();
const kernel = gpu.createKernel(function(x) {
  const x1 = x[this.thread.x-1];
  const x2 = x[this.thread.x];
  const x3 = x[this.thread.x+1];
  return x1+x2+x3-2*x1*x2-x2*x3-2*x1*x3+2*x1*x2*x3;
}).setOutput([gen.length]);
kernelCPU = function(x){
  var res = [];
  x.unshift(0);
  x.push(0);
  for (var i = 1; i < x.length-1; i++) {
    x1 = x[i-1];
    x2 = x[i];
    x3 = x[i+1];
    res.push(x1+x2+x3-2*x1*x2-x2*x3-2*x1*x3+2*x1*x2*x3);
  }
  return res;
}
var t0 = performance.now();
for (var i = 0; i< 10000; i++) {
  gen = kernelCPU(gen);
}
var t1 = performance.now();
console.log("Took " + (t1 - t0)/1000 + " seconds for CPU")
var t0 = performance.now();
for (var i = 0; i< 10000; i++) {
  gen = kernel(gen);
}
var t1 = performance.now();
console.log("Took " + (t1 - t0)/1000 + " seconds for GPU.")
<script src="https://cdnjs.cloudflare.com/ajax/libs/gpu.js/1.10.4/gpu.min.js"></script>

你的问题出在循环上

for (var i = 0; i< 10000; i++) {
    gen = kernel(gen);
}

调用 GPU 内核函数会产生一些非零开销。您只有 2001 个可以并行计算的单元 - 在调用 GPU 内核函数的初始开销之后,这些单元的计算速度应该比在 CPU 上快得多。但是,由于您遇到 GPU 调用开销 10,000 次,因此您不会失去实现的任何性能提升。

相关内容

  • 没有找到相关文章

最新更新