Я пытаюсь запустить 1D сотовые автоматы, используя gpu.js, но похоже, что мой код без gpu.js в 20 раз быстрее. Я не могу понять, где проблема ...
Приведенный ниже код запускает клеточные автоматы для правила 30, начиная с одной включенной ячейки. Длина автоматов составляет 2001 клеток. Код вычисляет первые 10000 поколений, используя как CPU, так и GPU, и для CPU это занимает 0,16 секунды, а для GPU 3,2 секунды.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Title Goes Here</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gpu.js/1.10.4/gpu.min.js"></script>
</head>
<body>
<script>
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>
</body>
</html>