struct Uniforms { aShape : vec2; bShape : vec2; outShape : vec2; } struct Matrix { numbers : array; } @group(0) @binding(0) var firstMatrix : Matrix; @group(0) @binding(1) var secondMatrix : Matrix; @group(0) @binding(2) var resultMatrix : Matrix; @group(0) @binding(3) var uniforms : Uniforms; @stage(compute) @workgroup_size(2, 2, 1) fn main(@builtin(global_invocation_id) global_id : vec3) { let resultCell : vec2 = vec2(global_id.y, global_id.x); let dimInner : u32 = uniforms.aShape.y; let dimOutter : u32 = uniforms.outShape.y; var result : u32 = 0u; for(var i : u32 = 0u; (i < dimInner); i = (i + 1u)) { let a : u32 = (i + (resultCell.x * dimInner)); let b : u32 = (resultCell.y + (i * dimOutter)); result = (result + (firstMatrix.numbers[a] * secondMatrix.numbers[b])); } let index : u32 = (resultCell.y + (resultCell.x * dimOutter)); resultMatrix.numbers[index] = result; }