]> zoso.dev Git - nano-pow.git/commitdiff
Replace search shared code with dispatch call.
authorChris Duncan <chris@zoso.dev>
Sun, 12 Jan 2025 07:33:14 +0000 (23:33 -0800)
committerChris Duncan <chris@zoso.dev>
Sun, 12 Jan 2025 07:33:14 +0000 (23:33 -0800)
src/classes/gpu.ts

index 3e7c325ae01f93b18e4a4b1c0ddf5405ae3eeba0..a2923fdf94e7187f8e444bc235311f4f58ff7028 100644 (file)
@@ -126,69 +126,9 @@ export class NanoPowGpu {
 
                let nonce = 0n
                do {
-                       // Set up uniform buffer object
-                       // Note: u32 size is 4, but total alignment must be multiple of 16
-                       const uboView = new DataView(new ArrayBuffer(48))
-                       for (let i = 0; i < 64; i += 8) {
-                               const uint32 = hash.slice(i, i + 8)
-                               uboView.setUint32(i / 2, parseInt(uint32, 16))
-                       }
                        const random = Math.floor(Math.random() * 0xffffffff)
                        const seed = (BigInt(random) << 32n) | BigInt(random)
-                       uboView.setBigUint64(32, seed, true)
-                       uboView.setUint32(40, threshold, true)
-                       this.#device.queue.writeBuffer(this.#uboBuffer, 0, uboView)
-
-                       // Reset `nonce` and `found` to 0u in WORK before each calculation
-                       this.#device.queue.writeBuffer(this.#gpuBuffer, 0, new Uint32Array([0, 0, 0]))
-
-                       // Bind UBO read and GPU write buffers
-                       const bindGroup = this.#device.createBindGroup({
-                               layout: this.#bindGroupLayout,
-                               entries: [
-                                       {
-                                               binding: 0,
-                                               resource: {
-                                                       buffer: this.#uboBuffer
-                                               },
-                                       },
-                                       {
-                                               binding: 1,
-                                               resource: {
-                                                       buffer: this.#gpuBuffer
-                                               },
-                                       },
-                               ],
-                       })
-
-                       // Create command encoder to issue commands to GPU and initiate computation
-                       const commandEncoder = this.#device.createCommandEncoder()
-                       const passEncoder = commandEncoder.beginComputePass()
-
-                       // Issue commands and end compute pass structure
-                       passEncoder.setPipeline(this.#pipeline)
-                       passEncoder.setBindGroup(0, bindGroup)
-                       passEncoder.dispatchWorkgroups(0xff, 0xff)
-                       passEncoder.end()
-
-                       // Copy 8-byte nonce and 4-byte found flag from GPU to CPU for reading
-                       commandEncoder.copyBufferToBuffer(this.#gpuBuffer, 0, this.#cpuBuffer, 0, 12)
-
-                       // End computation by passing array of command buffers to command queue for execution
-                       this.#device.queue.submit([commandEncoder.finish()])
-
-                       // Read results back to Javascript and then unmap buffer after reading
-                       let data = null
-                       try {
-                               await this.#cpuBuffer.mapAsync(GPUMapMode.READ)
-                               await this.#device.queue.onSubmittedWorkDone()
-                               data = new DataView(this.#cpuBuffer.getMappedRange().slice(0))
-                               this.#cpuBuffer.unmap()
-                       } catch (err) {
-                               console.warn(`Error getting data from GPU. ${err}`)
-                               return this.search(hash, threshold)
-                       }
-                       if (data == null) throw new Error(`Failed to get data from buffer.`)
+                       const data = await this.#dispatch(seed, hash, threshold, 0xff)
                        nonce = data.getBigUint64(0, true)
                        this.#busy = !data.getUint32(8)
                } while (this.#busy)
@@ -225,7 +165,8 @@ export class NanoPowGpu {
                }
                if (this.#device == null) throw new Error(`WebGPU device failed to load.`)
 
-               const data = await this.#dispatch(BigInt(`0x${work}`), hash, threshold, 1)
+               const seed = BigInt(`0x${work}`)
+               const data = await this.#dispatch(seed, hash, threshold, 1)
                const nonce = data.getBigUint64(0, true).toString(16).padStart(16, '0')
                const found = !!data.getUint32(8)
                this.#busy = false