{
console.clear()
const n = 1000000
const x = new Float32Array(n)
const y = new Float32Array(n)
const z = new Float32Array(n)
for(let i = 0; i < n; i++){
x[i] = i
y[i] = i
}
const xBuffer = device.createBuffer({
mappedAtCreation: true,
size: x.byteLength,
usage: GPUBufferUsage.STORAGE
})
new Float32Array(xBuffer.getMappedRange()).set(x)
xBuffer.unmap()
const yBuffer = device.createBuffer({
mappedAtCreation: true,
size: y.byteLength,
usage: GPUBufferUsage.STORAGE
})
new Float32Array(yBuffer.getMappedRange()).set(y)
yBuffer.unmap()
const resultBuffer = device.createBuffer({
size: y.byteLength,
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC
})
const computePipeline = device.createComputePipeline({
layout: 'auto',
compute: {
module: shaderModule,
entryPoint: "main"
}
});
const bindGroup = device.createBindGroup({
layout: computePipeline.getBindGroupLayout(0),
entries: [
{
binding: 0,
resource: {
buffer: xBuffer
}
},
{
binding: 1,
resource: {
buffer: yBuffer
}
},
{
binding: 2,
resource: {
buffer: resultBuffer
}
}
]
});
const commandEncoder = device.createCommandEncoder();
const passEncoder = commandEncoder.beginComputePass();
passEncoder.setPipeline(computePipeline);
passEncoder.setBindGroup(0, bindGroup);
passEncoder.dispatchWorkgroups(Math.ceil(n/64), 1);
passEncoder.end();
const gpuReadBuffer = device.createBuffer({
size: x.byteLength,
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
});
commandEncoder.copyBufferToBuffer(
resultBuffer ,
0 ,
gpuReadBuffer ,
0 ,
x.byteLength
);
const gpuCommands = commandEncoder.finish();
device.queue.submit([gpuCommands]);
await gpuReadBuffer.mapAsync(GPUMapMode.READ);
const arrayBuffer = gpuReadBuffer.getMappedRange();
return new Float32Array(arrayBuffer);
}