{ "op": "com.microsoft.FusedMatMul", "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" }, "attrs": { "alpha": 0 }, "inputs": { "A": { "dtype": "float32", "shape": [2, 2], "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0] } }, "B": { "dtype": "float32", "shape": [2, 2], "data": { "kind": "values", "values": [5.0, 6.0, 7.0, 8.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.02 } } }, { "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.02 } } }, { "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.03 } } }, { "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.03 } } }, { "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.02 } } }, { "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.03 } } }, { "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.03 } } }, { "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.05 } } }, { "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.05 } } }, { "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.05 } } }, { "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.05 } } }, { "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.05 } } }, { "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": "subgroup_matrix_kn_tail_f16_compact draws both operands from a zero-mean sinusoid, so the K=34 dot random-walks to 0.013 and the 0.05 absolute tolerance is 3.7x the whole output: alpha could be ignored, a K tile dropped, or Y halved and it still passes. Offsetting both operands makes every element approach alpha * K * aOffset * bOffset (~3.4), a value proportional to the contraction length, so the K=34 partial tile, the N=66 column tail and the alpha=0.5 epilogue are all under test on the tail-broadcast 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": "Well-conditioned sibling of subgroup_matrix_broadcast_rank4x3_f16_compact, whose zero-mean operands cancel to 0.021 under a 0.05 absolute tolerance (2.4x blind). Offsetting both operands drives each output to ~K * aOffset * bOffset, so the rank-4 by rank-3 batch broadcast now pins the per-batch B slice and the K=32 count instead of only the addressing pattern." }, "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-side batch broadcast: A carries dim 1 on the batch axis while B carries 2, so one A slice feeds both output batches. Every other rank-4 by rank-3 fixture broadcasts B (or matches both extents), leaving the A-broadcast stride - a zero A batch stride against a non-zero B one - unrendered. Operands are offset so each output lands near alpha * K * aOffset * bOffset and a swapped or dropped batch stride moves the result rather than cancelling." }, "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": "broadcast_rank4_tiled_reg_f16_compact cancels to 0.015 against a 0.05 absolute tolerance, so the register-blocked rank-4 route was 3.4x blind to any uniform scale error - including a silently dropped alpha. Offsetting both operands makes each output ~alpha * K * aOffset * bOffset with K=33 (one full 32-wide k tile plus a 1-element tail), so a mis-counted k tile, a doubled accumulator or a missing alpha all move it far outside tolerance." }, "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": "transbatch_a_dense_m_tail_f16_compact was the most blind fixture of this op: a 0.05 absolute tolerance over a 0.010 output, so a 4.8x uniform scale error passes. Offsetting both operands makes every element ~alpha * K * aOffset * bOffset, so the [M,batch,K] transBatchA stride, the K=32 contraction and the alpha=0.5 scale are pinned rather than just the row/column addressing." }, "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": "aligned_f16_transA_transB_alpha_64x32 cancels to 0.11 under a 0.03 absolute tolerance, so a 27% scale error - alpha 0.5 applied twice, say - still passes. Offsetting both operands makes each output ~alpha * K * aOffset * bOffset, which keeps the doubly-transposed addressing under test while making the alpha epilogue and the K=32 count observable on both the 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": "f16_unaligned_3x5x7 cancels to 0.15 under a 0.02 absolute tolerance (13% blind). The same 3x5 by 5x7 shape with offset operands lands at ~K * aOffset * bOffset, so the odd-K/odd-N scalar and tiled fallbacks - the routes small unaligned shapes actually take - now catch a dropped K element or a doubled tail." }, "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": "aligned_f16_plain_64x32x64 cancels to 0.124 under a 0.02 absolute tolerance, so a 16% uniform scale error passes on the fully aligned f16 subgroup-matrix path (M=64, K=32, N=64 - no tail at all). Offsetting both operands makes each element ~K * aOffset * bOffset, so the aligned 32x64 tile now pins the k-block count and the scratch drain, not just the addressing." }, "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": "Batched twin of aligned_f16_plain_64x32x64_offset_scale_lock. aligned_f16_batched_plain_2x64x32x64 cancels to 0.124 under a 0.03 absolute tolerance (24% blind); with offset operands each element is ~K * aOffset * bOffset and the two batches carry different data, so the batch stride is pinned alongside the magnitude." }, "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": "subgroup_matrix_m_tail_57_partial_block_f16 cancels to 0.062 under a 0.03 absolute tolerance, so the partial 8-row MMA block at M=57 (one full 32-row tile plus a 25-row remainder) was 49% blind to a scale error. With offset operands each element is ~K * aOffset * bOffset, so the guarded rows have to carry the same magnitude as the full ones - a tail block that accumulates one k step short, or drains a stale scratch slot, no longer looks like noise." }, "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": "aligned_f16_transA_64x32 cancels to 0.053 under a 0.03 absolute tolerance - 57% blind, the loosest of the transpose fixtures. transA alone (transB = 0) is its own render of the operand loader, and with offset operands each element is ~K * aOffset * bOffset, so the transposed A stride is pinned against a k-count error rather than only against a wrong-element read." }, "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": "Combines both transposes with an M tail (50 = 32 + 18). Offset operands make each element approximately K * aOffset * bOffset, checking the guarded rows of the doubly-transposed load for magnitude as well as placement; the zero-mean companion cancels to 0.099 under a 0.05 absolute tolerance and cannot provide that scale lock." }, "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": "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 } } } ] }