簡體   English   中英

將 gpu.js 用於元胞自動機

[英]Using gpu.js for cellular automata

我正在嘗試使用 gpu.js 運行一維元胞自動機,但看起來我的代碼沒有 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 上快得多。 但是,因為您遇到10,000次 GPU 調用開銷,您所獲得的任何性能提升都不會丟失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM