From 65bebd31c088d2b2569c80e7d4414e3e6b2e070b Mon Sep 17 00:00:00 2001 From: Reese Levine Date: Wed, 20 Aug 2025 09:10:57 -0700 Subject: [PATCH 1/4] debug --- ggml/src/ggml-webgpu/ggml-webgpu.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/ggml/src/ggml-webgpu/ggml-webgpu.cpp b/ggml/src/ggml-webgpu/ggml-webgpu.cpp index d9a195cccac14..a1e9a998a9ff2 100644 --- a/ggml/src/ggml-webgpu/ggml-webgpu.cpp +++ b/ggml/src/ggml-webgpu/ggml-webgpu.cpp @@ -432,6 +432,7 @@ static const char * ggml_backend_webgpu_name(ggml_backend_t backend) { static void ggml_backend_webgpu_free(ggml_backend_t backend) { ggml_backend_webgpu_context * ctx = (ggml_backend_webgpu_context *) backend->context; WEBGPU_LOG_DEBUG("ggml_backend_webgpu_free(" << ctx->name << ")"); + std::cout << "ggml_backend_webgpu_free(" << ctx->name << ")" << std::endl; // TODO: cleanup GGML_UNUSED(ctx); From 16df269a034e37cac05e9caa4adbfa9f81f1f0f6 Mon Sep 17 00:00:00 2001 From: Reese Levine Date: Wed, 20 Aug 2025 16:46:30 -0700 Subject: [PATCH 2/4] Bugfix for memset --- ggml/src/ggml-webgpu/wgsl-shaders/memset.wgsl | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ggml/src/ggml-webgpu/wgsl-shaders/memset.wgsl b/ggml/src/ggml-webgpu/wgsl-shaders/memset.wgsl index cb7c8c3e09e91..7da5276b9081d 100644 --- a/ggml/src/ggml-webgpu/wgsl-shaders/memset.wgsl +++ b/ggml/src/ggml-webgpu/wgsl-shaders/memset.wgsl @@ -19,20 +19,20 @@ fn main(@builtin(global_invocation_id) gid: vec3) { let start = params.offset; let end = params.offset + params.size; - for (var j: u32 = 0u; j < bytes_per_thread; j = j + 1u) { + for (var j: u32 = 0u; j < bytes_per_thread; j += 4) { let byte_index = start + i + j; - if (byte_index + 4u <= end) { - output_buffer[(byte_index >> 2u)] = params.value; + if (byte_index + 4 <= end) { + output_buffer[byte_index >> 2] = params.value; } else { // Handle tail (unaligned) - for (var k: u32 = 0u; k < 4u; k = k + 1u) { + for (var k: u32 = 0; k < 4; k++) { let idx = byte_index + k; if (idx < end) { - let word_idx = idx >> 2u; - let byte_offset = (idx & 3u) * 8u; - let mask = ~(0xffu << byte_offset); + let word_idx = idx >> 2; + let bit_offset = (idx & 3) * 8u; + let mask = ~(0xffu << bit_offset); let existing = output_buffer[word_idx]; - output_buffer[word_idx] = (existing & mask) | ((params.value & 0xffu) << byte_offset); + output_buffer[word_idx] = (existing & mask) | (((params.value >> bit_offset) & 0xff) << bit_offset); } } } From 10babfd7a21bfa312ec1ef0d87b315b66ea9ec4e Mon Sep 17 00:00:00 2001 From: Reese Levine Date: Wed, 20 Aug 2025 17:40:06 -0700 Subject: [PATCH 3/4] Add padding to end of buffers on creation --- ggml/src/ggml-webgpu/ggml-webgpu.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ggml/src/ggml-webgpu/ggml-webgpu.cpp b/ggml/src/ggml-webgpu/ggml-webgpu.cpp index a1e9a998a9ff2..369ddd84e917a 100644 --- a/ggml/src/ggml-webgpu/ggml-webgpu.cpp +++ b/ggml/src/ggml-webgpu/ggml-webgpu.cpp @@ -432,7 +432,6 @@ static const char * ggml_backend_webgpu_name(ggml_backend_t backend) { static void ggml_backend_webgpu_free(ggml_backend_t backend) { ggml_backend_webgpu_context * ctx = (ggml_backend_webgpu_context *) backend->context; WEBGPU_LOG_DEBUG("ggml_backend_webgpu_free(" << ctx->name << ")"); - std::cout << "ggml_backend_webgpu_free(" << ctx->name << ")" << std::endl; // TODO: cleanup GGML_UNUSED(ctx); @@ -824,7 +823,7 @@ static ggml_backend_buffer_t ggml_backend_webgpu_buffer_type_alloc_buffer(ggml_b wgpu::Buffer buf; ggml_webgpu_create_buffer(ctx->webgpu_ctx->device, buf, - size, + (size + WEBGPU_STORAGE_BUF_BINDING_MULT - 1) & ~(WEBGPU_STORAGE_BUF_BINDING_MULT - 1), wgpu::BufferUsage::Storage | wgpu::BufferUsage::CopySrc | wgpu::BufferUsage::CopyDst, "allocated_buffer"); From 7a323b08eba1776f740ce823ee33caab8e1f2421 Mon Sep 17 00:00:00 2001 From: Reese Levine Date: Wed, 20 Aug 2025 18:09:45 -0700 Subject: [PATCH 4/4] Simplify bit-shifting --- ggml/src/ggml-webgpu/wgsl-shaders/memset.wgsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ggml/src/ggml-webgpu/wgsl-shaders/memset.wgsl b/ggml/src/ggml-webgpu/wgsl-shaders/memset.wgsl index 7da5276b9081d..194d2d6f58c77 100644 --- a/ggml/src/ggml-webgpu/wgsl-shaders/memset.wgsl +++ b/ggml/src/ggml-webgpu/wgsl-shaders/memset.wgsl @@ -32,7 +32,7 @@ fn main(@builtin(global_invocation_id) gid: vec3) { let bit_offset = (idx & 3) * 8u; let mask = ~(0xffu << bit_offset); let existing = output_buffer[word_idx]; - output_buffer[word_idx] = (existing & mask) | (((params.value >> bit_offset) & 0xff) << bit_offset); + output_buffer[word_idx] = (existing & mask) | (params.value & (0xffu << bit_offset)); } } }