{ "fixtureArrays": { "ort_float32_broadcast_rank3_by_rank4_output_Y": [1, 3, 5, 33, 43, 53, 5, 23, 41, 85, 111, 137, 9, 43, 77, 137, 179, 221], "ort_float32_rank3_by_rank2_output_Y": [20, 23, 26, 29, 56, 68, 80, 92, 92, 113, 134, 155, 128, 158, 188, 218], "ort_float32_batched_rank4_input_A": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], "ort_float32_trans_batch_a_input_A": [0, 1, 2, 3, 12, 13, 14, 15, 4, 5, 6, 7, 16, 17, 18, 19, 8, 9, 10, 11, 20, 21, 22, 23], "ort_float32_trans_batch_b_input_B": [1, 0, 1, 2, 0, 1, -1, 0, 1, 1, 0, 1, 2, -1, 1, 1] }, "cases": [ { "name": "ort_float32_broadcast_rank4_by_rank3", "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.FloatTypeNoTranspose" }, "inputs": { "A": { "dtype": "float32", "shape": [3, 1, 1, 2], "data": { "kind": "values", "values": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0] } }, "B": { "dtype": "float32", "shape": [2, 2, 2], "data": { "kind": "values", "values": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0] } } }, "outputs": { "Y": { "dtype": "float32", "shape": [3, 2, 1, 2], "tolerance": 0.000001, "data": { "kind": "values", "values": [2.0, 3.0, 6.0, 7.0, 6.0, 11.0, 26.0, 31.0, 10.0, 19.0, 46.0, 55.0] } } } }, { "name": "ort_float32_broadcast_rank3_by_rank4", "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.FloatTypeNoTranspose" }, "inputs": { "A": { "dtype": "float32", "shape": [2, 3, 2], "data": { "kind": "values", "values": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0] } }, "B": { "dtype": "float32", "shape": [3, 2, 2, 1], "data": { "kind": "values", "values": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0] } } }, "outputs": { "Y": { "dtype": "float32", "shape": [3, 2, 3, 1], "tolerance": 0.000001, "data": { "kind": "values", "values": { "$ref": "#/fixtureArrays/ort_float32_broadcast_rank3_by_rank4_output_Y" } } } } }, { "name": "ort_float32_left_1d_batched_rhs", "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.FloatTypeNoTranspose" }, "inputs": { "A": { "dtype": "float32", "shape": [2], "data": { "kind": "values", "values": [0.0, 1.0] } }, "B": { "dtype": "float32", "shape": [3, 2, 1], "data": { "kind": "values", "values": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0] } } }, "outputs": { "Y": { "dtype": "float32", "shape": [3, 1], "tolerance": 0.000001, "data": { "kind": "values", "values": [1.0, 3.0, 5.0] } } } }, { "name": "ort_float32_right_1d_batched_lhs", "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.FloatTypeNoTranspose" }, "inputs": { "A": { "dtype": "float32", "shape": [3, 1, 2], "data": { "kind": "values", "values": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0] } }, "B": { "dtype": "float32", "shape": [2], "data": { "kind": "values", "values": [0.0, 1.0] } } }, "outputs": { "Y": { "dtype": "float32", "shape": [3, 1], "tolerance": 0.000001, "data": { "kind": "values", "values": [1.0, 3.0, 5.0] } } } }, { "name": "ort_float32_plain_2d", "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.FloatTypeNoTranspose" }, "inputs": { "A": { "dtype": "float32", "shape": [3, 4], "data": { "kind": "values", "values": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0] } }, "B": { "dtype": "float32", "shape": [4, 3], "data": { "kind": "values", "values": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0] } } }, "outputs": { "Y": { "dtype": "float32", "shape": [3, 3], "tolerance": 0.000001, "data": { "kind": "values", "values": [42.0, 48.0, 54.0, 114.0, 136.0, 158.0, 186.0, 224.0, 262.0] } } } }, { "name": "ort_float32_rank3_by_rank2", "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.FloatTypeNoTranspose" }, "inputs": { "A": { "dtype": "float32", "shape": [2, 2, 3], "data": { "kind": "values", "values": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0] } }, "B": { "dtype": "float32", "shape": [3, 4], "data": { "kind": "values", "values": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0] } } }, "outputs": { "Y": { "dtype": "float32", "shape": [2, 2, 4], "tolerance": 0.000001, "data": { "kind": "values", "values": { "$ref": "#/fixtureArrays/ort_float32_rank3_by_rank2_output_Y" } } } } }, { "name": "ort_float32_rank3_by_broadcast_rank3", "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.FloatTypeNoTranspose" }, "inputs": { "A": { "dtype": "float32", "shape": [2, 2, 3], "data": { "kind": "values", "values": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0] } }, "B": { "dtype": "float32", "shape": [1, 3, 4], "data": { "kind": "values", "values": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0] } } }, "outputs": { "Y": { "dtype": "float32", "shape": [2, 2, 4], "tolerance": 0.000001, "data": { "kind": "values", "values": { "$ref": "#/fixtureArrays/ort_float32_rank3_by_rank2_output_Y" } } } } }, { "name": "ort_float32_singleton_rank3_by_rank3", "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.FloatTypeNoTranspose" }, "inputs": { "A": { "dtype": "float32", "shape": [1, 2, 3], "data": { "kind": "values", "values": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0] } }, "B": { "dtype": "float32", "shape": [1, 3, 4], "data": { "kind": "values", "values": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0] } } }, "outputs": { "Y": { "dtype": "float32", "shape": [1, 2, 4], "tolerance": 0.000001, "data": { "kind": "values", "values": [20.0, 23.0, 26.0, 29.0, 56.0, 68.0, 80.0, 92.0] } } } }, { "name": "ort_float32_batched_rank4", "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.FloatTypeNoTranspose" }, "inputs": { "A": { "dtype": "float32", "shape": [2, 2, 2, 2], "data": { "kind": "values", "values": { "$ref": "#/fixtureArrays/ort_float32_batched_rank4_input_A" } } }, "B": { "dtype": "float32", "shape": [2, 2, 2, 2], "data": { "kind": "values", "values": { "$ref": "#/fixtureArrays/ort_float32_batched_rank4_input_A" } } } }, "outputs": { "Y": { "dtype": "float32", "shape": [2, 2, 2, 2], "tolerance": 0.000001, "data": { "kind": "values", "values": [2.0, 3.0, 6.0, 11.0, 46.0, 55.0, 66.0, 79.0, 154.0, 171.0, 190.0, 211.0, 326.0, 351.0, 378.0, 407.0] } } } }, { "name": "ort_float32_broadcast_rank4_by_rank4", "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.FloatTypeNoTranspose" }, "inputs": { "A": { "dtype": "float32", "shape": [1, 2, 3, 2], "data": { "kind": "values", "values": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0] } }, "B": { "dtype": "float32", "shape": [3, 2, 2, 1], "data": { "kind": "values", "values": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0] } } }, "outputs": { "Y": { "dtype": "float32", "shape": [3, 2, 3, 1], "tolerance": 0.000001, "data": { "kind": "values", "values": { "$ref": "#/fixtureArrays/ort_float32_broadcast_rank3_by_rank4_output_Y" } } } } }, { "name": "ort_float32_vector_dot_scalar_output", "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.FloatTypeNoTranspose" }, "inputs": { "A": { "dtype": "float32", "shape": [3], "data": { "kind": "values", "values": [0.0, 1.0, 2.0] } }, "B": { "dtype": "float32", "shape": [3], "data": { "kind": "values", "values": [0.0, 1.0, 2.0] } } }, "outputs": { "Y": { "dtype": "float32", "shape": [], "tolerance": 0.000001, "data": { "kind": "values", "values": [5.0] } } } }, { "name": "ort_float32_alpha_zero_outputs_zero", "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.DoubleTypeAlphaZero", "notes": "Diverges from the upstream test's inputs (inputs.A values [1.0, 2.0, 3.0, 4.0] -> constant 2.0; inputs.B values [5.0, 6.0, 7.0, 8.0] -> constant 3.0); the expected output is recomputed by the CPU reference for the new inputs. A zero alpha scales the whole product away, so no operand value can reach the result and both operands are uniform fills." }, "attrs": { "alpha": 0 }, "inputs": { "A": { "dtype": "float32", "shape": [2, 2], "data": { "kind": "constant", "value": 2.0 } }, "B": { "dtype": "float32", "shape": [2, 2], "data": { "kind": "constant", "value": 3.0 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [2, 2], "tolerance": 0.000001, "data": { "kind": "values", "values": [0.0, 0.0, 0.0, 0.0] } } } }, { "name": "ort_float32_empty_k_dimension_outputs_zero", "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.DoubleTypeEmptyKDim" }, "inputs": { "A": { "dtype": "float32", "shape": [2, 0], "data": { "kind": "values", "values": [] } }, "B": { "dtype": "float32", "shape": [0, 3], "data": { "kind": "values", "values": [] } } }, "outputs": { "Y": { "dtype": "float32", "shape": [2, 3], "tolerance": 0.000001, "data": { "kind": "values", "values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] } } } }, { "name": "ort_float32_transpose_a_scaled", "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.DoubleTypeScale" }, "attrs": { "alpha": 0.5, "transA": 1 }, "inputs": { "A": { "dtype": "float32", "shape": [2, 3], "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] } }, "B": { "dtype": "float32", "shape": [2, 3], "data": { "kind": "values", "values": [7.0, 8.0, 9.0, 10.0, 11.0, 12.0] } } }, "outputs": { "Y": { "dtype": "float32", "shape": [3, 3], "tolerance": 0.000001, "data": { "kind": "values", "values": [23.5, 26.0, 28.5, 32.0, 35.5, 39.0, 40.5, 45.0, 49.5] } } } }, { "name": "ort_float32_transpose_b", "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.FloatTypeTransposeB" }, "attrs": { "transB": 1 }, "inputs": { "A": { "dtype": "float32", "shape": [2, 3], "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] } }, "B": { "dtype": "float32", "shape": [4, 3], "data": { "kind": "values", "values": [7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0] } } }, "outputs": { "Y": { "dtype": "float32", "shape": [2, 4], "tolerance": 0.000001, "data": { "kind": "values", "values": [50.0, 68.0, 86.0, 104.0, 122.0, 167.0, 212.0, 257.0] } } } }, { "name": "ort_float32_transpose_ab_scaled", "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.FloatTypeScale" }, "attrs": { "alpha": 4, "transA": 1, "transB": 1 }, "inputs": { "A": { "dtype": "float32", "shape": [3, 2], "data": { "kind": "values", "values": [1.0, 4.0, 2.0, 5.0, 3.0, 6.0] } }, "B": { "dtype": "float32", "shape": [4, 3], "data": { "kind": "values", "values": [7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0] } } }, "outputs": { "Y": { "dtype": "float32", "shape": [2, 4], "tolerance": 0.000001, "data": { "kind": "values", "values": [200.0, 272.0, 344.0, 416.0, 488.0, 668.0, 848.0, 1028.0] } } } }, { "name": "ort_float32_trans_batch_a", "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.FloatTypeTransposeBatch", "notes": "Exercises transBatchA, where logical [batch,N,M] input A is stored as [N,batch,M]." }, "attrs": { "transBatchA": 1 }, "inputs": { "A": { "dtype": "float32", "shape": [3, 2, 4], "data": { "kind": "values", "values": { "$ref": "#/fixtureArrays/ort_float32_trans_batch_a_input_A" } } }, "B": { "dtype": "float32", "shape": [2, 4, 2], "data": { "kind": "values", "values": [1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 2.0, -1.0, 1.0, 2.0, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0] } } }, "outputs": { "Y": { "dtype": "float32", "shape": [2, 3, 2], "tolerance": 0.000001, "data": { "kind": "values", "values": [8.0, 0.0, 24.0, 4.0, 40.0, 8.0, 14.0, 53.0, 18.0, 69.0, 22.0, 85.0] } } } }, { "name": "ort_float32_trans_batch_b", "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.FloatTypeTransposeBatch", "notes": "Exercises transBatchB, where logical [batch,K,N] input B is stored as [K,batch,N]." }, "attrs": { "transBatchB": 1 }, "inputs": { "A": { "dtype": "float32", "shape": [2, 3, 4], "data": { "kind": "values", "values": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0] } }, "B": { "dtype": "float32", "shape": [4, 2, 2], "data": { "kind": "values", "values": { "$ref": "#/fixtureArrays/ort_float32_trans_batch_b_input_B" } } } }, "outputs": { "Y": { "dtype": "float32", "shape": [2, 3, 2], "tolerance": 0.000001 } } }, { "name": "ort_float32_trans_batch_ab_scaled", "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.FloatTypeTransposeBatch", "notes": "Exercises combined transBatchA and transBatchB with alpha scaling." }, "attrs": { "transBatchA": 1, "transBatchB": 1, "alpha": 0.5 }, "inputs": { "A": { "dtype": "float32", "shape": [3, 2, 4], "data": { "kind": "values", "values": { "$ref": "#/fixtureArrays/ort_float32_trans_batch_a_input_A" } } }, "B": { "dtype": "float32", "shape": [4, 2, 2], "data": { "kind": "values", "values": { "$ref": "#/fixtureArrays/ort_float32_trans_batch_b_input_B" } } } }, "outputs": { "Y": { "dtype": "float32", "shape": [2, 3, 2], "tolerance": 0.000001, "data": { "kind": "values", "values": [4.0, 0.0, 12.0, 2.0, 20.0, 4.0, 7.0, 26.5, 9.0, 34.5, 11.0, 42.5] } } } }, { "name": "ort_float32_scaled_no_transpose", "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.FloatTypeScale" }, "attrs": { "alpha": 0.5 }, "inputs": { "A": { "dtype": "float32", "shape": [2, 3], "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] } }, "B": { "dtype": "float32", "shape": [3, 2], "data": { "kind": "values", "values": [7.0, 8.0, 9.0, 10.0, 11.0, 12.0] } } }, "outputs": { "Y": { "dtype": "float32", "shape": [2, 2], "tolerance": 0.000001, "data": { "kind": "values", "values": [29.0, 32.0, 69.5, 77.0] } } } }, { "name": "ort_float32_empty_input_m_zero", "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.DoubleTypeEmptyInput" }, "inputs": { "A": { "dtype": "float32", "shape": [0, 3], "data": { "kind": "values", "values": [] } }, "B": { "dtype": "float32", "shape": [3, 4], "data": { "kind": "values", "values": [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] } } }, "outputs": { "Y": { "dtype": "float32", "shape": [0, 4], "tolerance": 0.000001, "data": { "kind": "values", "values": [] } } } }, { "name": "aligned_plain_64x32x64", "inputs": { "A": { "dtype": "float32", "shape": [64, 32], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.027, "scale": 0.2 } }, "B": { "dtype": "float32", "shape": [32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.019, "cosStep": 0.007, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [64, 64], "tolerance": 0.0001 } } }, { "name": "register_blocked_plain_512x64x512_alpha_scaled", "inputs": { "A": { "dtype": "float32", "shape": [512, 64], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.027, "scale": 0.2 } }, "B": { "dtype": "float32", "shape": [64, 512], "data": { "kind": "fillFloat32", "sinStep": 0.019, "cosStep": 0.007, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [512, 512], "tolerance": 0.0001 } }, "attrs": { "alpha": 0.5 }, "provenance": { "notes": "Rank-2 M=N=512 and K=64 produce 64 aligned 64x64 workgroup tiles, exercising register-blocked vec4 staging and 4x4 per-thread accumulation. alpha=0.5 verifies scaling in the output epilogue." } }, { "name": "aligned_transB_alpha_64x32", "attrs": { "transB": 1, "alpha": 0.5 }, "inputs": { "A": { "dtype": "float32", "shape": [64, 32], "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.023, "scale": 0.2 } }, "B": { "dtype": "float32", "shape": [64, 32], "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.009, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [64, 64], "tolerance": 0.0001 } } }, { "name": "aligned_batched_plain_2x64x32x64", "inputs": { "A": { "dtype": "float32", "shape": [2, 64, 32], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.027, "scale": 0.2 } }, "B": { "dtype": "float32", "shape": [2, 32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.019, "cosStep": 0.007, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [2, 64, 64], "tolerance": 0.0001 } } }, { "name": "aligned_batched_transB_alpha_2x64x32", "attrs": { "transB": 1, "alpha": 0.25 }, "inputs": { "A": { "dtype": "float32", "shape": [2, 64, 32], "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.023, "scale": 0.2 } }, "B": { "dtype": "float32", "shape": [2, 64, 32], "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.009, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [2, 64, 64], "tolerance": 0.0001 } } }, { "name": "aligned_mtail_50x32x128", "inputs": { "A": { "dtype": "float32", "shape": [50, 32], "data": { "kind": "fillFloat32", "sinStep": 0.015, "cosStep": 0.021, "scale": 0.2 } }, "B": { "dtype": "float32", "shape": [32, 128], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.011, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [50, 128], "tolerance": 0.0001 } } }, { "name": "aligned_transA_64x32", "attrs": { "transA": 1 }, "inputs": { "A": { "dtype": "float32", "shape": [32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.027, "scale": 0.2 } }, "B": { "dtype": "float32", "shape": [32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.019, "cosStep": 0.007, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [64, 64], "tolerance": 0.0001 } } }, { "name": "aligned_transA_transB_alpha_64x32", "attrs": { "transA": 1, "transB": 1, "alpha": 0.5 }, "inputs": { "A": { "dtype": "float32", "shape": [32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.023, "scale": 0.2 } }, "B": { "dtype": "float32", "shape": [64, 32], "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.009, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [64, 64], "tolerance": 0.0001 } } }, { "name": "f32_subgroup_matrix_subnormal_dot_products_gpu_gap", "skipGpu": { "category": "permanent", "reason": "Portable WGSL floating-point semantics do not guarantee preservation of the subnormal values required by this fixture. Backend evidence: WebGPU/Metal flushes subnormals to zero in f32; the ~3e-39 subnormal dot products collapse to zero (subgroup-matrix path)." }, "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.FloatTypeNoTranspose", "notes": "M=32, K=32, N=64 selects the subgroup-matrix path; finite subnormal dot products must not flush to zero." }, "inputs": { "A": { "dtype": "float32", "shape": [32, 32], "data": { "kind": "constant", "value": 1e-20 } }, "B": { "dtype": "float32", "shape": [32, 64], "data": { "kind": "constant", "value": 1e-20 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [32, 64], "tolerance": 1e-43 } } }, { "name": "f32_subgroup_matrix_scaled_subnormal_dot_products_gpu_gap", "skipGpu": { "category": "permanent", "reason": "Portable WGSL floating-point semantics do not guarantee preservation of the subnormal values required by this fixture. Backend evidence: WebGPU/Metal flushes subnormals to zero in f32; the ~3e-39 subnormal dot products collapse to zero before alpha scaling (subgroup-matrix path)." }, "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.FloatTypeScale", "notes": "Alpha scaling is applied after accumulation, so finite subnormal products remain valid nonzero outputs." }, "attrs": { "alpha": 0.5 }, "inputs": { "A": { "dtype": "float32", "shape": [32, 32], "data": { "kind": "constant", "value": 1e-20 } }, "B": { "dtype": "float32", "shape": [32, 64], "data": { "kind": "constant", "value": 1e-20 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [32, 64], "tolerance": 1e-43 } } }, { "name": "f32_subgroup_matrix_transB_subnormal_dot_products_gpu_gap", "skipGpu": { "category": "permanent", "reason": "Portable WGSL floating-point semantics do not guarantee preservation of the subnormal values required by this fixture. Backend evidence: WebGPU/Metal flushes subnormals to zero in f32; the ~3e-39 subnormal dot products collapse to zero (subgroup-matrix transB path)." }, "provenance": { "source": "onnxruntime/test/contrib_ops/fused_matmul_op_test.cc", "test": "FusedMatMulOpTest.FloatTypeTransposeB", "notes": "The transposed-B subgroup-matrix path has the same finite subnormal accumulation requirement." }, "attrs": { "transB": 1 }, "inputs": { "A": { "dtype": "float32", "shape": [32, 32], "data": { "kind": "constant", "value": 1e-20 } }, "B": { "dtype": "float32", "shape": [64, 32], "data": { "kind": "constant", "value": 1e-20 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [32, 64], "tolerance": 1e-43 } } }, { "name": "aligned_f16_plain_64x32x64", "inputs": { "A": { "dtype": "float16", "shape": [64, 32], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.027, "scale": 0.2 } }, "B": { "dtype": "float16", "shape": [32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.019, "cosStep": 0.007, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [64, 64], "tolerance": 0.002 } } }, { "name": "aligned_f16_transB_alpha_64x32", "attrs": { "transB": 1, "alpha": 0.5 }, "inputs": { "A": { "dtype": "float16", "shape": [64, 32], "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.023, "scale": 0.2 } }, "B": { "dtype": "float16", "shape": [64, 32], "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.009, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [64, 64], "tolerance": 0.02 } } }, { "name": "f16_unaligned_3x5x7", "inputs": { "A": { "dtype": "float16", "shape": [3, 5], "data": { "kind": "fillFloat32", "sinStep": 0.015, "cosStep": 0.021, "scale": 0.2 } }, "B": { "dtype": "float16", "shape": [5, 7], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.011, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [3, 7], "tolerance": 0.003 } } }, { "name": "aligned_f16_transA_64x32", "attrs": { "transA": 1 }, "inputs": { "A": { "dtype": "float16", "shape": [32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.027, "scale": 0.2 } }, "B": { "dtype": "float16", "shape": [32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.019, "cosStep": 0.007, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [64, 64], "tolerance": 0.001 } } }, { "name": "aligned_f16_batched_plain_2x64x32x64", "inputs": { "A": { "dtype": "float16", "shape": [2, 64, 32], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.027, "scale": 0.2 } }, "B": { "dtype": "float16", "shape": [2, 32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.019, "cosStep": 0.007, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [2, 64, 64], "tolerance": 0.002 } } }, { "name": "f16_rank3_by_broadcast_rank3", "inputs": { "A": { "dtype": "float16", "shape": [2, 2, 3], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.027, "scale": 0.2 } }, "B": { "dtype": "float16", "shape": [1, 3, 4], "data": { "kind": "fillFloat32", "sinStep": 0.019, "cosStep": 0.007, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [2, 2, 4], "tolerance": 0.002 } } }, { "name": "aligned_f16_transA_transB_alpha_64x32", "attrs": { "transA": 1, "transB": 1, "alpha": 0.5 }, "inputs": { "A": { "dtype": "float16", "shape": [32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.023, "scale": 0.2 } }, "B": { "dtype": "float16", "shape": [64, 32], "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.009, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [64, 64], "tolerance": 0.002 } } }, { "name": "subgroup_matrix_m_tail_57_partial_block_f16", "inputs": { "A": { "dtype": "float16", "shape": [57, 32], "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.023, "scale": 0.2 } }, "B": { "dtype": "float16", "shape": [32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.011, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [57, 64], "tolerance": 0.001 } } }, { "name": "subgroup_matrix_m_tail_33_alpha_scaled_f32", "attrs": { "alpha": 0.5 }, "inputs": { "A": { "dtype": "float32", "shape": [33, 32], "data": { "kind": "fillFloat32", "sinStep": 0.015, "cosStep": 0.021, "scale": 0.2 } }, "B": { "dtype": "float32", "shape": [32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.019, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [33, 64], "tolerance": 0.0002 } } }, { "name": "trans_batch_a_broadcast_rank4_f32", "attrs": { "transBatchA": 1 }, "inputs": { "A": { "dtype": "float32", "shape": [2, 3, 2, 4], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.027, "scale": 0.2 } }, "B": { "dtype": "float32", "shape": [3, 1, 4, 5], "data": { "kind": "fillFloat32", "sinStep": 0.019, "cosStep": 0.007, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [3, 2, 2, 5], "tolerance": 0.0002 } } }, { "name": "empty_n_dimension_zero_width_output", "inputs": { "A": { "dtype": "float32", "shape": [3, 4], "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0] } }, "B": { "dtype": "float32", "shape": [4, 0], "data": { "kind": "values", "values": [] } } }, "outputs": { "Y": { "dtype": "float32", "shape": [3, 0], "tolerance": 0.000001, "data": { "kind": "values", "values": [] } } } }, { "name": "transA_transB_subgroup_matrix_m_tail_50_f16", "attrs": { "transA": 1, "transB": 1, "alpha": 1 }, "inputs": { "A": { "dtype": "float16", "shape": [32, 50], "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.023, "scale": 0.2 } }, "B": { "dtype": "float16", "shape": [64, 32], "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.009, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [50, 64], "tolerance": 0.002 } } }, { "name": "f32_decode_gemv_m1_k65_n68_vec4_compact", "provenance": { "notes": "Compact M=1 float32 GEMV correctness lock for the model-shaped K=4096,N=4096 bandwidth-bound benchmark. Odd K preserves the sliced reduction while N=68 exercises the final partial 128-column workgroup." }, "attrs": { "alpha": 1 }, "inputs": { "A": { "dtype": "float32", "shape": [1, 65], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021, "scale": 0.2 } }, "B": { "dtype": "float32", "shape": [65, 68], "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.029, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [1, 68], "tolerance": 0.0002 } } }, { "name": "f32_rank4_by_rank2_shared_weight_compact", "provenance": { "notes": "Compact rank-4 by rank-2 shared-weight broadcast lock for the attention-shaped benchmark. Odd M/K/N exercise batch offset and tile-tail handling." }, "attrs": { "alpha": 0.5 }, "inputs": { "A": { "dtype": "float32", "shape": [2, 3, 5, 7], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021, "scale": 0.2 } }, "B": { "dtype": "float32", "shape": [7, 9], "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.029, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [2, 3, 5, 9], "tolerance": 0.0002 } } }, { "name": "subgroup_matrix_kn_tail_f16_compact", "provenance": { "notes": "Compact f16 subgroup-matrix lock with both a partial K=34 tile and N=66 output tail." }, "attrs": { "alpha": 0.5 }, "inputs": { "A": { "dtype": "float16", "shape": [33, 34], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021, "scale": 0.1 } }, "B": { "dtype": "float16", "shape": [34, 66], "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.029, "scale": 0.1 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [33, 66], "tolerance": 0.0004 } } }, { "name": "subgroup_matrix_broadcast_rank4x3_f16_compact", "provenance": { "notes": "Compact rank-4 by rank-3 broadcast lock for the model-shaped [1,8,M,K] x [8,K,N] stress case." }, "attrs": { "alpha": 1 }, "inputs": { "A": { "dtype": "float16", "shape": [1, 2, 33, 32], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021, "scale": 0.1 } }, "B": { "dtype": "float16", "shape": [2, 32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.029, "scale": 0.1 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [1, 2, 33, 64], "tolerance": 0.0005 } } }, { "name": "broadcast_rank4_tiled_reg_f16_compact", "provenance": { "notes": "Compact rank-4 by rank-3 broadcast lock for the register-blocked non-subgroup-matrix path. Odd M/K/N exercise every output and reduction tail." }, "attrs": { "alpha": 0.5 }, "inputs": { "A": { "dtype": "float16", "shape": [1, 2, 65, 33], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021, "scale": 0.1 } }, "B": { "dtype": "float16", "shape": [2, 33, 67], "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.029, "scale": 0.1 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [1, 2, 65, 67], "tolerance": 0.0004 } } }, { "name": "broadcast_rank4_tiled_reg_shared_f32_compact", "provenance": { "notes": "Float32 shared rank-2 weight counterpart for the register-blocked rank-4 path. Odd M/K/N cover all output and reduction tails." }, "attrs": { "alpha": 0.5 }, "inputs": { "A": { "dtype": "float32", "shape": [1, 2, 65, 33], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021, "scale": 0.1 } }, "B": { "dtype": "float32", "shape": [33, 67], "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.029, "scale": 0.1 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [1, 2, 65, 67], "tolerance": 0.0003 } } }, { "name": "transbatch_a_dense_m_tail_f16_compact", "provenance": { "notes": "Compact lock for stored [M,batch,K] transBatchA addressing. M=65 exercises the subgroup-matrix row tail; all/no-mma/no-subgroups select the MMA/register-blocked portable paths used by the model-shaped stress case." }, "attrs": { "alpha": 0.5, "transBatchA": 1 }, "inputs": { "A": { "dtype": "float16", "shape": [65, 2, 32], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021, "scale": 0.1 } }, "B": { "dtype": "float16", "shape": [2, 32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.029, "scale": 0.1 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [2, 65, 64], "tolerance": 0.0004 } } }, { "name": "transbatch_a_dense_m_tail_f32_compact", "provenance": { "notes": "Float32 counterpart proving the same transBatchA MMA/register-blocked split remains correct when shader-f16 is unavailable." }, "attrs": { "alpha": 0.5, "transBatchA": 1 }, "inputs": { "A": { "dtype": "float32", "shape": [65, 2, 32], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021, "scale": 0.1 } }, "B": { "dtype": "float32", "shape": [2, 32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.029, "scale": 0.1 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [2, 65, 64], "tolerance": 0.0003 } } }, { "name": "rank5_three_batch_dims", "attrs": { "alpha": 1, "transA": 0, "transB": 0, "transBatchA": 0, "transBatchB": 0 }, "inputs": { "A": { "dtype": "float32", "shape": [2, 1, 2, 2, 3], "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.29, "scale": 0.5 } }, "B": { "dtype": "float32", "shape": [1, 3, 1, 3, 4], "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.25 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [2, 3, 2, 2, 4], "tolerance": 0.000001 } } }, { "name": "subgroup_matrix_kn_tail_f16_offset_alpha_scale_lock", "provenance": { "notes": "Offset float16 operands keep each output near `alpha * K * aOffset * bOffset` (about 3.4), making the K=34 reduction tail, N=66 column tail, and `alpha = 0.5` epilogue observable on the subgroup-matrix route." }, "attrs": { "alpha": 0.5 }, "inputs": { "A": { "dtype": "float16", "shape": [33, 34], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021, "scale": 0.1, "offset": 0.5 } }, "B": { "dtype": "float16", "shape": [34, 66], "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.029, "scale": 0.1, "offset": 0.4 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [33, 66], "tolerance": 0.03, "relTolerance": 0.01 } } }, { "name": "subgroup_matrix_broadcast_rank4x3_f16_offset_scale_lock", "provenance": { "notes": "Offset operands keep outputs near `K * aOffset * bOffset`, making the per-batch B slice and K=32 contraction observable in a rank-4 by rank-3 broadcast." }, "attrs": { "alpha": 1 }, "inputs": { "A": { "dtype": "float16", "shape": [1, 2, 33, 32], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021, "scale": 0.1, "offset": 0.5 } }, "B": { "dtype": "float16", "shape": [2, 32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.029, "scale": 0.1, "offset": 0.4 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [1, 2, 33, 64], "tolerance": 0.03, "relTolerance": 0.01 } } }, { "name": "subgroup_matrix_a_batch_broadcast_rank4x3_f16", "provenance": { "notes": "A has batch extent 1 while B has extent 2, so one A slice feeds both output batches. Offset operands keep the expected magnitude nonzero, exposing a swapped or nonzero A batch stride." }, "attrs": { "alpha": 1 }, "inputs": { "A": { "dtype": "float16", "shape": [1, 1, 33, 32], "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.019, "scale": 0.1, "offset": 0.5 } }, "B": { "dtype": "float16", "shape": [2, 32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.007, "cosStep": 0.031, "scale": 0.1, "offset": 0.4 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [1, 2, 33, 64], "tolerance": 0.03, "relTolerance": 0.01 } } }, { "name": "broadcast_rank4_tiled_reg_f16_offset_alpha_scale_lock", "provenance": { "notes": "Offset operands keep outputs near `alpha * K * aOffset * bOffset` with K=33, making the one-element reduction tail and `alpha` multiplier observable on the register-blocked rank-4 route." }, "attrs": { "alpha": 0.5 }, "inputs": { "A": { "dtype": "float16", "shape": [1, 2, 65, 33], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021, "scale": 0.1, "offset": 0.5 } }, "B": { "dtype": "float16", "shape": [2, 33, 67], "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.029, "scale": 0.1, "offset": 0.4 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [1, 2, 65, 67], "tolerance": 0.03, "relTolerance": 0.01 } } }, { "name": "transbatch_a_dense_m_tail_f16_offset_alpha_scale_lock", "provenance": { "notes": "Offset operands make each output proportional to `alpha * K`, exposing the [M, batch, K] transBatchA stride, K=32 contraction, and `alpha = 0.5` scale." }, "attrs": { "alpha": 0.5, "transBatchA": 1 }, "inputs": { "A": { "dtype": "float16", "shape": [65, 2, 32], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021, "scale": 0.1, "offset": 0.5 } }, "B": { "dtype": "float16", "shape": [2, 32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.029, "scale": 0.1, "offset": 0.4 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [2, 65, 64], "tolerance": 0.03, "relTolerance": 0.01 } } }, { "name": "aligned_f16_transA_transB_alpha_offset_scale_lock", "provenance": { "notes": "Offset operands keep the doubly transposed output proportional to `alpha * K`, making the K=32 contraction and `alpha = 0.5` epilogue observable on subgroup-matrix and portable tiled routes." }, "attrs": { "transA": 1, "transB": 1, "alpha": 0.5 }, "inputs": { "A": { "dtype": "float16", "shape": [32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.023, "scale": 0.2, "offset": 0.5 } }, "B": { "dtype": "float16", "shape": [64, 32], "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.009, "scale": 0.2, "offset": 0.4 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [64, 64], "tolerance": 0.03, "relTolerance": 0.01 } } }, { "name": "f16_unaligned_3x5x7_offset_scale_lock", "provenance": { "notes": "Offset operands in a 3x5 by 5x7 multiply keep outputs proportional to K, exposing dropped reduction elements or doubled tails on the unaligned scalar and tiled routes." }, "inputs": { "A": { "dtype": "float16", "shape": [3, 5], "data": { "kind": "fillFloat32", "sinStep": 0.015, "cosStep": 0.021, "scale": 0.2, "offset": 0.6 } }, "B": { "dtype": "float16", "shape": [5, 7], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.011, "scale": 0.2, "offset": 0.5 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [3, 7], "tolerance": 0.01, "relTolerance": 0.005 } } }, { "name": "aligned_f16_plain_64x32x64_offset_scale_lock", "provenance": { "notes": "Offset operands keep each fully aligned M=64, K=32, N=64 output proportional to K, making the subgroup-matrix reduction count and scratch drain observable." }, "inputs": { "A": { "dtype": "float16", "shape": [64, 32], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.027, "scale": 0.2, "offset": 0.5 } }, "B": { "dtype": "float16", "shape": [32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.019, "cosStep": 0.007, "scale": 0.2, "offset": 0.4 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [64, 64], "tolerance": 0.03, "relTolerance": 0.01 } } }, { "name": "aligned_f16_batched_plain_2x64x32x64_offset_scale_lock", "provenance": { "notes": "Two batches carry distinct offset operands, keeping outputs proportional to K and making both the batch stride and aligned subgroup-matrix reduction count observable." }, "inputs": { "A": { "dtype": "float16", "shape": [2, 64, 32], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.027, "scale": 0.2, "offset": 0.5 } }, "B": { "dtype": "float16", "shape": [2, 32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.019, "cosStep": 0.007, "scale": 0.2, "offset": 0.4 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [2, 64, 64], "tolerance": 0.03, "relTolerance": 0.01 } } }, { "name": "subgroup_matrix_m_tail_57_partial_block_f16_offset_scale_lock", "provenance": { "notes": "M=57 leaves 25 rows after one full 32-row tile. Offset operands require tail rows to match the full rows' expected magnitude, exposing a short reduction or stale scratch value." }, "inputs": { "A": { "dtype": "float16", "shape": [57, 32], "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.023, "scale": 0.2, "offset": 0.5 } }, "B": { "dtype": "float16", "shape": [32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.011, "scale": 0.2, "offset": 0.4 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [57, 64], "tolerance": 0.03, "relTolerance": 0.01 } } }, { "name": "aligned_f16_transA_64x32_offset_scale_lock", "provenance": { "notes": "With only A transposed, offset operands keep each output proportional to K and expose both a transposed-A stride error and an incorrect reduction count." }, "attrs": { "transA": 1 }, "inputs": { "A": { "dtype": "float16", "shape": [32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.027, "scale": 0.2, "offset": 0.5 } }, "B": { "dtype": "float16", "shape": [32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.019, "cosStep": 0.007, "scale": 0.2, "offset": 0.4 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [64, 64], "tolerance": 0.03, "relTolerance": 0.01 } } }, { "name": "transA_transB_subgroup_matrix_m_tail_50_f16_offset_scale_lock", "provenance": { "notes": "Both operands are transposed and M=50 leaves an 18-row tail. Offset operands make the guarded tail rows' magnitude and placement independently observable." }, "attrs": { "transA": 1, "transB": 1, "alpha": 1 }, "inputs": { "A": { "dtype": "float16", "shape": [32, 50], "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.023, "scale": 0.2, "offset": 0.5 } }, "B": { "dtype": "float16", "shape": [64, 32], "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.009, "scale": 0.2, "offset": 0.4 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [50, 64], "tolerance": 0.03, "relTolerance": 0.01 } } }, { "name": "f16_rank3_by_broadcast_rank3_offset_scale_lock", "provenance": { "notes": "f16_rank3_by_broadcast_rank3 cancels to 0.076 under a 0.02 absolute tolerance (26% blind). Offsetting both operands makes each element ~K * aOffset * bOffset over K=3, so the shared single-batch B - read by both output batches - is pinned for value as well as for broadcast addressing." }, "inputs": { "A": { "dtype": "float16", "shape": [2, 2, 3], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.027, "scale": 0.2, "offset": 1.0 } }, "B": { "dtype": "float16", "shape": [1, 3, 4], "data": { "kind": "fillFloat32", "sinStep": 0.019, "cosStep": 0.007, "scale": 0.2, "offset": 0.8 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [2, 2, 4], "tolerance": 0.01, "relTolerance": 0.005 } } }, { "name": "rank6_four_batch_dims", "attrs": { "alpha": 1, "transA": 0, "transB": 0, "transBatchA": 0, "transBatchB": 0 }, "inputs": { "A": { "dtype": "float32", "shape": [2, 2, 1, 2, 2, 3], "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.29, "scale": 0.5 } }, "B": { "dtype": "float32", "shape": [1, 1, 3, 1, 3, 4], "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31, "scale": 0.25 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [2, 2, 3, 2, 2, 4], "tolerance": 0.000001 } } }, { "name": "trans_batch_a_and_trans_a_with_trans_batch_b_and_trans_b", "provenance": { "notes": "Combines transBatchA with transA and transBatchB with transB, checking both logical extents and both stride pairs. Expected values follow the documented storage orders A[k][batch][m] and B[n][batch][k]." }, "attrs": { "transA": 1, "transB": 1, "transBatchA": 1, "transBatchB": 1 }, "inputs": { "A": { "dtype": "float32", "shape": [4, 2, 3], "data": { "kind": "values", "values": [0.0, 1.0, 2.0, 4.0, 5.0, 6.0, 10.0, 11.0, 12.0, 14.0, 15.0, 16.0, 20.0, 21.0, 22.0, 24.0, 25.0, 26.0, 30.0, 31.0, 32.0, 34.0, 35.0, 36.0] } }, "B": { "dtype": "float32", "shape": [5, 2, 4], "data": { "kind": "values", "values": [0.0, 1.0, 2.0, 3.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 24.0, 25.0, 26.0, 27.0, 28.0, 29.0, 30.0, 31.0, 31.0, 32.0, 33.0, 34.0] } } }, "outputs": { "Y": { "dtype": "float32", "shape": [2, 3, 5], "tolerance": 0.000001, "data": { "kind": "values", "values": [140.0, 560.0, 980.0, 1400.0, 1820.0, 146.0, 594.0, 1042.0, 1490.0, 1938.0, 152.0, 628.0, 1104.0, 1580.0, 2056.0, 392.0, 924.0, 1456.0, 1988.0, 2520.0, 410.0, 970.0, 1530.0, 2090.0, 2650.0, 428.0, 1016.0, 1604.0, 2192.0, 2780.0] } } } }, { "name": "subgroup_matrix_band_m8_f16", "attrs": { "alpha": 2 }, "inputs": { "A": { "dtype": "float16", "shape": [8, 64], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021 } }, "B": { "dtype": "float16", "shape": [64, 64], "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.029 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [8, 64], "tolerance": 0.005 } } }, { "name": "subgroup_matrix_splitk_m_tail_f16", "attrs": { "alpha": 2 }, "inputs": { "A": { "dtype": "float16", "shape": [10, 2048], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021 } }, "B": { "dtype": "float16", "shape": [2048, 256], "data": { "kind": "fillFloat32", "sinStep": 0.019, "cosStep": 0.031 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [10, 256], "tolerance": 0.005 } } }, { "name": "subgroup_matrix_splitk_alpha_scaled_f32", "attrs": { "alpha": 1.5 }, "inputs": { "A": { "dtype": "float32", "shape": [16, 1024], "data": { "kind": "fillFloat32", "sinStep": 0.03, "cosStep": 0.07, "scale": 0.2 } }, "B": { "dtype": "float32", "shape": [1024, 128], "data": { "kind": "fillFloat32", "sinStep": 0.041, "cosStep": 0.089, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [16, 128], "tolerance": 0.0002 } } }, { "name": "band_vec4_alpha_scaled_m8_k256_n512", "provenance": { "notes": "Route lock for the few-row band without a K split: eight rows over four 128-column groups, alpha folded into the vec4 store." }, "attrs": { "alpha": 0.5 }, "inputs": { "A": { "dtype": "float32", "shape": [8, 256], "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.13, "scale": 0.2 } }, "B": { "dtype": "float32", "shape": [256, 512], "data": { "kind": "fillFloat32", "sinStep": 0.05, "cosStep": 0.19, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [8, 512], "tolerance": 0.0001 } } }, { "name": "subgroup_matrix_batched_transB_small_m_f16", "attrs": { "transB": 1, "alpha": 0.25 }, "inputs": { "A": { "dtype": "float16", "shape": [2, 4, 32], "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.023, "scale": 0.2 } }, "B": { "dtype": "float16", "shape": [2, 64, 32], "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.009, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [2, 4, 64], "tolerance": 0.01 } } }, { "name": "subgroup_matrix_transA_small_m_f16", "attrs": { "transA": 1, "alpha": 3 }, "inputs": { "A": { "dtype": "float16", "shape": [64, 8], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021 } }, "B": { "dtype": "float16", "shape": [64, 64], "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.029 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [8, 64], "tolerance": 0.005 } } }, { "name": "f32_decode_gemv_m1_k65_n68_alpha_half", "provenance": { "notes": "A compact M=1 GEMV with alpha=0.5 exercises a non-unit multiplier folded into the store as a baked constant. The expected output verifies that the multiplier is applied exactly once." }, "attrs": { "alpha": 0.5 }, "inputs": { "A": { "dtype": "float32", "shape": [1, 65], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021, "scale": 0.2 } }, "B": { "dtype": "float32", "shape": [65, 68], "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.029, "scale": 0.2 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [1, 68], "tolerance": 0.0002 } } }, { "name": "f16_rank4_by_rank2_shared_weight_m33_k34_n66", "provenance": { "notes": "Shared rank-2 B across both rank-4 batch axes; covers subgroup-matrix admission, partial tiles and its small-M fallback without changing accumulation precision." }, "attrs": { "alpha": 0.5 }, "inputs": { "A": { "dtype": "float16", "shape": [2, 3, 33, 34], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021 } }, "B": { "dtype": "float16", "shape": [34, 66], "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.029 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [2, 3, 33, 66], "tolerance": 0.001 } } }, { "name": "f16_rank4_by_rank2_shared_weight_m8_k32_n64", "provenance": { "notes": "Shared rank-2 B across both rank-4 batch axes; covers subgroup-matrix admission, partial tiles and its small-M fallback without changing accumulation precision." }, "attrs": { "alpha": 0.5 }, "inputs": { "A": { "dtype": "float16", "shape": [2, 3, 8, 32], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021 } }, "B": { "dtype": "float16", "shape": [32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.029 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [2, 3, 8, 64], "tolerance": 0.001 } } }, { "name": "f16_rank4_by_rank2_shared_weight_m1_k32_n64", "provenance": { "notes": "Shared rank-2 B across both rank-4 batch axes; covers subgroup-matrix admission, partial tiles and its small-M fallback without changing accumulation precision." }, "attrs": { "alpha": 0.5 }, "inputs": { "A": { "dtype": "float16", "shape": [2, 3, 1, 32], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021 } }, "B": { "dtype": "float16", "shape": [32, 64], "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.029 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [2, 3, 1, 64], "tolerance": 0.001 } } }, { "name": "transbatch_b_aligned_occupancy_float16", "attrs": { "transBatchB": 1, "alpha": 0.5 }, "inputs": { "A": { "dtype": "float16", "shape": [2, 128, 128], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021, "scale": 0.05, "offset": 0.2 } }, "B": { "dtype": "float16", "shape": [128, 2, 512], "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.029, "scale": 0.07, "offset": 0.3 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [2, 128, 512], "tolerance": 0.001, "relTolerance": 0.001 } } }, { "name": "transbatch_b_aligned_occupancy_float32", "attrs": { "transBatchB": 1, "alpha": 0.5 }, "inputs": { "A": { "dtype": "float32", "shape": [2, 128, 128], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021, "scale": 0.05, "offset": 0.2 } }, "B": { "dtype": "float32", "shape": [128, 2, 512], "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.029, "scale": 0.07, "offset": 0.3 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [2, 128, 512], "tolerance": 0.0001, "relTolerance": 0.00002 } } }, { "name": "transbatch_b_portable_reg_aligned_float16", "attrs": { "transBatchB": 1, "alpha": -0.5 }, "inputs": { "A": { "dtype": "float16", "shape": [4, 128, 128], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021, "scale": 0.05, "offset": 0.2 } }, "B": { "dtype": "float16", "shape": [128, 4, 512], "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.029, "scale": 0.07, "offset": 0.3 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [4, 128, 512], "tolerance": 0.001, "relTolerance": 0.001 } }, "provenance": { "notes": "Portable register tile transBatchB: physical B[K,batch,N], natural tile count reaches the shared occupancy gate; negative alpha and positive inputs avoid cancellation." } }, { "name": "transbatch_b_portable_reg_tails_float16", "attrs": { "transBatchB": 1, "alpha": -0.5 }, "inputs": { "A": { "dtype": "float16", "shape": [3, 129, 131], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021, "scale": 0.05, "offset": 0.2 } }, "B": { "dtype": "float16", "shape": [131, 3, 513], "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.029, "scale": 0.07, "offset": 0.3 } } }, "outputs": { "Y": { "dtype": "float16", "shape": [3, 129, 513], "tolerance": 0.001, "relTolerance": 0.001 } }, "provenance": { "notes": "Portable register tile transBatchB: physical B[K,batch,N], natural tile count reaches the shared occupancy gate; negative alpha and positive inputs avoid cancellation." } }, { "name": "transbatch_b_portable_reg_aligned_float32", "attrs": { "transBatchB": 1, "alpha": -0.5 }, "inputs": { "A": { "dtype": "float32", "shape": [4, 128, 128], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021, "scale": 0.05, "offset": 0.2 } }, "B": { "dtype": "float32", "shape": [128, 4, 512], "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.029, "scale": 0.07, "offset": 0.3 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [4, 128, 512], "tolerance": 0.0001, "relTolerance": 0.00002 } }, "provenance": { "notes": "Portable register tile transBatchB: physical B[K,batch,N], natural tile count reaches the shared occupancy gate; negative alpha and positive inputs avoid cancellation." } }, { "name": "transbatch_b_portable_reg_tails_float32", "attrs": { "transBatchB": 1, "alpha": -0.5 }, "inputs": { "A": { "dtype": "float32", "shape": [3, 129, 131], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.021, "scale": 0.05, "offset": 0.2 } }, "B": { "dtype": "float32", "shape": [131, 3, 513], "data": { "kind": "fillFloat32", "sinStep": 0.009, "cosStep": 0.029, "scale": 0.07, "offset": 0.3 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [3, 129, 513], "tolerance": 0.0001, "relTolerance": 0.00002 } }, "provenance": { "notes": "Portable register tile transBatchB: physical B[K,batch,N], natural tile count reaches the shared occupancy gate; negative alpha and positive inputs avoid cancellation." } }, { "name": "f32_band_preferred_m4_k2048_n4096", "attrs": { "alpha": 0.5 }, "inputs": { "A": { "dtype": "float32", "shape": [4, 2048], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.031, "scale": 0.1, "offset": 0.02 } }, "B": { "dtype": "float32", "shape": [2048, 4096], "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.041, "scale": 0.1, "offset": 0.03 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [4, 4096], "tolerance": 0.0001, "relTolerance": 0.00001 } }, "provenance": { "notes": "Natural f32 preferred single-band geometry with nonuniform operands and alpha0.5. N4096 keeps the existing single-band path eligible at deep K; N2048 would select the split-band family." } }, { "name": "f32_band_preferred_m16_k2560_n4096", "attrs": { "alpha": 0.5 }, "inputs": { "A": { "dtype": "float32", "shape": [16, 2560], "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.031, "scale": 0.1, "offset": 0.02 } }, "B": { "dtype": "float32", "shape": [2560, 4096], "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.041, "scale": 0.1, "offset": 0.03 } } }, "outputs": { "Y": { "dtype": "float32", "shape": [16, 4096], "tolerance": 0.0001, "relTolerance": 0.00001 } }, "provenance": { "notes": "Natural f32 preferred single-band geometry with nonuniform operands and alpha0.5. N4096 keeps the existing single-band path eligible at deep K; N2048 would select the split-band family." } } ] }