@@ -63,8 +63,8 @@ void mul_impl(WebGPUGraph& graph, const std::vector<int>& args) {
6363
6464 uint32_t wg_size =
6565 utils::clamp_workgroup_size (device, kBinaryMulWorkgroupSizeX );
66- uint32_t workgroup_count =
67- utils::compute_1d_workgroup_count (device, out_meta.numel , wg_size, " mul" );
66+ utils::WgCount workgroup_count =
67+ utils::compute_2d_workgroup_count (device, out_meta.numel , wg_size, " mul" );
6868
6969 WGPUConstantEntry wg_size_constant = {};
7070 wg_size_constant.key = {" wg_size" , WGPU_STRLEN };
@@ -165,8 +165,8 @@ void mul_impl(WebGPUGraph& graph, const std::vector<int>& args) {
165165 bg_desc.entries = bg_entries;
166166 WGPUBindGroup bind_group = wgpuDeviceCreateBindGroup (device, &bg_desc);
167167
168- const size_t dispatch_idx =
169- graph. add_dispatch ( {pipeline, bind_group, workgroup_count});
168+ const size_t dispatch_idx = graph. add_dispatch (
169+ {pipeline, bind_group, workgroup_count. x , " mul " , workgroup_count. y });
170170
171171 // Dynamic shapes: rebuild all 3 broadcast TensorMeta UBOs + dispatch.
172172 WGPUBuffer o_buf = out_meta_buf, a_buf = in1_meta_buf, b_buf = in2_meta_buf;
@@ -199,9 +199,10 @@ void mul_impl(WebGPUGraph& graph, const std::vector<int>& args) {
199199 wgpuQueueWriteBuffer (g.queue (), o_buf, 0 , &om, sizeof (om));
200200 wgpuQueueWriteBuffer (g.queue (), a_buf, 0 , &am, sizeof (am));
201201 wgpuQueueWriteBuffer (g.queue (), b_buf, 0 , &bm, sizeof (bm));
202- g.dispatch_at (dispatch_idx).workgroup_count_x =
203- utils::compute_1d_workgroup_count (
204- g.device (), om.numel , wg_size, " mul(resize)" );
202+ const utils::WgCount wgc = utils::compute_2d_workgroup_count (
203+ g.device (), om.numel , wg_size, " mul(resize)" );
204+ g.dispatch_at (dispatch_idx).workgroup_count_x = wgc.x ;
205+ g.dispatch_at (dispatch_idx).workgroup_count_y = wgc.y ;
205206 };
206207 graph.add_tensor_resize_hook (in1_id, mul_resize);
207208 graph.add_tensor_resize_hook (in2_id, mul_resize);
0 commit comments