| { |
| "op": "com.microsoft.MultiHeadAttention", |
| "cases": [ |
| { |
| "name": "cross_attention_no_bias", |
| "attrs": { "num_heads": 2 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [2, 3, 6], |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [2, 4, 6], |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [2, 4, 6], |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [2, 3, 6], "tolerance": 0.00002 } } |
| }, |
| { |
| "name": "self_attention_bias_causal", |
| "attrs": { "num_heads": 2, "scale": 0.6, "unidirectional": 1 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 4, 8], |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 4, 8], |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 4, 8], |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41 } |
| }, |
| "biasT": { |
| "dtype": "float32", |
| "shape": [24], |
| "data": { "kind": "fillFloat32", "sinStep": 0.19, "cosStep": 0.13 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 4, 8], "tolerance": 0.00002 } } |
| }, |
| { |
| "name": "single_query_cross_attention_head_dim1", |
| "attrs": { "num_heads": 2, "scale": 1 }, |
| "inputs": { |
| "queryT": { "dtype": "float32", "shape": [1, 1, 2], "data": { "kind": "values", "values": [1.0, -1.0] } }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 3, 2], |
| "data": { "kind": "values", "values": [1.0, 0.0, 0.0, 1.0, -1.0, 2.0] } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 3, 2], |
| "data": { "kind": "values", "values": [10.0, -10.0, 20.0, -20.0, 30.0, -30.0] } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 1, 2], "tolerance": 0.00002 } } |
| }, |
| { |
| "name": "batch2_no_bias_head_dim2", |
| "attrs": { "num_heads": 2 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [2, 2, 4], |
| "data": { "kind": "fillFloat32", "scale": 0.4, "sinStep": 0.17, "cosStep": 0.31 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [2, 3, 4], |
| "data": { "kind": "fillFloat32", "scale": 0.4, "sinStep": 0.11, "cosStep": 0.23 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [2, 3, 4], |
| "data": { "kind": "fillFloat32", "scale": 0.4, "sinStep": 0.07, "cosStep": 0.41 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [2, 2, 4], "tolerance": 0.00002 } } |
| }, |
| { |
| "name": "ort_cross_attention_batch2_head_size40_no_bias", |
| "provenance": { |
| "source": "onnxruntime/test/contrib_ops/multihead_attention_op_test.cc", |
| "test": "MultiHeadAttentionTest.CrossAttention_Batch2_HeadSize40", |
| "notes": "Deterministic projection of ORT's batch=2, q_seq=3, kv_seq=5, num_heads=2, head_size=40 no-bias cross-attention topology." |
| }, |
| "attrs": { "num_heads": 2 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [2, 3, 80], |
| "data": { "kind": "fillFloat32", "scale": 0.12, "sinStep": 0.017, "cosStep": 0.031 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [2, 5, 80], |
| "data": { "kind": "fillFloat32", "scale": 0.12, "sinStep": 0.011, "cosStep": 0.023 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [2, 5, 80], |
| "data": { "kind": "fillFloat32", "scale": 0.12, "sinStep": 0.007, "cosStep": 0.041 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [2, 3, 80], "tolerance": 0.00003 } } |
| }, |
| { |
| "name": "ort_cross_attention_batch2_head_size40_bias", |
| "provenance": { |
| "source": "onnxruntime/test/contrib_ops/multihead_attention_op_test.cc", |
| "test": "MultiHeadAttentionTest.CrossAttention_Batch2_HeadSize40", |
| "notes": "Deterministic projection of ORT's biased batch=2, q_seq=3, kv_seq=5, num_heads=2, head_size=40 cross-attention topology." |
| }, |
| "attrs": { "num_heads": 2 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [2, 3, 80], |
| "data": { "kind": "fillFloat32", "scale": 0.11, "sinStep": 0.013, "cosStep": 0.027 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [2, 5, 80], |
| "data": { "kind": "fillFloat32", "scale": 0.1, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [2, 5, 80], |
| "data": { "kind": "fillFloat32", "scale": 0.13, "sinStep": 0.029, "cosStep": 0.017 } |
| }, |
| "biasT": { |
| "dtype": "float32", |
| "shape": [240], |
| "data": { "kind": "fillFloat32", "scale": 0.04, "sinStep": 0.023, "cosStep": 0.011 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [2, 3, 80], "tolerance": 0.00003 } } |
| }, |
| { |
| "name": "ort_cross_attention_batch1_head_size16_bias", |
| "provenance": { |
| "source": "onnxruntime/test/contrib_ops/multihead_attention_op_test.cc", |
| "test": "MultiHeadAttentionTest.CrossAttention_Batch1_HeadSize16", |
| "notes": "Covers ORT's batch=1, q_seq=2, kv_seq=3, num_heads=2, head_size=16 biased cross-attention shape." |
| }, |
| "attrs": { "num_heads": 2 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 2, 32], |
| "data": { "kind": "fillFloat32", "scale": 0.2, "sinStep": 0.13, "cosStep": 0.29 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 3, 32], |
| "data": { "kind": "fillFloat32", "scale": 0.2, "sinStep": 0.19, "cosStep": 0.07 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 3, 32], |
| "data": { "kind": "fillFloat32", "scale": 0.2, "sinStep": 0.23, "cosStep": 0.17 } |
| }, |
| "biasT": { |
| "dtype": "float32", |
| "shape": [96], |
| "data": { "kind": "fillFloat32", "scale": 0.05, "sinStep": 0.31, "cosStep": 0.11 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 2, 32], "tolerance": 0.00003 } } |
| }, |
| { |
| "name": "ort_cross_attention_batch1_head_size16_no_bias", |
| "provenance": { |
| "source": "onnxruntime/test/contrib_ops/multihead_attention_op_test.cc", |
| "test": "MultiHeadAttentionTest.CrossAttention_Batch1_HeadSize16", |
| "notes": "No-bias companion for ORT's batch=1, q_seq=2, kv_seq=3, num_heads=2, head_size=16 cross-attention shape." |
| }, |
| "attrs": { "num_heads": 2 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 2, 32], |
| "data": { "kind": "fillFloat32", "scale": 0.24, "sinStep": 0.17, "cosStep": 0.05 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 3, 32], |
| "data": { "kind": "fillFloat32", "scale": 0.18, "sinStep": 0.07, "cosStep": 0.19 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 3, 32], |
| "data": { "kind": "fillFloat32", "scale": 0.22, "sinStep": 0.29, "cosStep": 0.13 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 2, 32], "tolerance": 0.00003 } } |
| }, |
| { |
| "name": "ort_cross_attention_batch1_head_size8_no_bias", |
| "provenance": { |
| "source": "onnxruntime/test/contrib_ops/multihead_attention_op_test.cc", |
| "test": "MultiHeadAttentionTest.CrossAttention_Batch1_HeadSize8", |
| "notes": "Small ORT cross-attention topology with head_size=8 and no bias." |
| }, |
| "attrs": { "num_heads": 2 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 2, 16], |
| "data": { "kind": "fillFloat32", "scale": 0.3, "sinStep": 0.17, "cosStep": 0.31 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 3, 16], |
| "data": { "kind": "fillFloat32", "scale": 0.3, "sinStep": 0.11, "cosStep": 0.23 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 3, 16], |
| "data": { "kind": "fillFloat32", "scale": 0.3, "sinStep": 0.07, "cosStep": 0.41 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 2, 16], "tolerance": 0.00003 } } |
| }, |
| { |
| "name": "ort_self_attention_batch2_head_size32_causal_no_bias_projection", |
| "provenance": { |
| "source": "onnxruntime/test/contrib_ops/multihead_attention_op_test.cc", |
| "test": "MultiHeadAttentionTest.SelfAttention_Batch2_HeadSize32_NoBias_NoMask_PackedQKV", |
| "notes": "Projects ORT's packed self-attention topology into separate Q/K/V inputs and enables the local unidirectional path." |
| }, |
| "attrs": { "num_heads": 2, "unidirectional": 1 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [2, 4, 64], |
| "data": { "kind": "fillFloat32", "scale": 0.18, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [2, 4, 64], |
| "data": { "kind": "fillFloat32", "scale": 0.18, "sinStep": 0.019, "cosStep": 0.023 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [2, 4, 64], |
| "data": { "kind": "fillFloat32", "scale": 0.18, "sinStep": 0.007, "cosStep": 0.041 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [2, 4, 64], "tolerance": 0.00003 } } |
| }, |
| { |
| "name": "flash_self_attention_head_dim64_no_bias", |
| "attrs": { "num_heads": 4, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 64, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.017, "cosStep": 0.031 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 64, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.011, "cosStep": 0.023 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 64, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.007, "cosStep": 0.041 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 64, 256], "tolerance": 0.0002 } } |
| }, |
| { |
| "name": "flash_self_attention_head_dim64_no_bias_causal", |
| "attrs": { "num_heads": 4, "scale": 0.125, "unidirectional": 1 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 64, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.019, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 64, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.013, "cosStep": 0.021 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 64, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.005, "cosStep": 0.037 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 64, 256], "tolerance": 0.0002 } } |
| }, |
| { |
| "name": "flash_self_attention_head_dim64_bias_causal", |
| "attrs": { "num_heads": 4, "scale": 0.125, "unidirectional": 1 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 64, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 64, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 64, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.029, "cosStep": 0.017 } |
| }, |
| "biasT": { |
| "dtype": "float32", |
| "shape": [768], |
| "data": { "kind": "fillFloat32", "scale": 0.03, "sinStep": 0.023, "cosStep": 0.011 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 64, 256], "tolerance": 0.0003 } } |
| }, |
| { |
| "name": "flash_decode_head_dim64_no_bias", |
| "attrs": { "num_heads": 4, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 1, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.017, "cosStep": 0.031 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 512, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.011, "cosStep": 0.023 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 512, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.007, "cosStep": 0.041 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 1, 256], "tolerance": 0.0002 } } |
| }, |
| { |
| "name": "flash_decode_head_dim64_bias", |
| "attrs": { "num_heads": 4, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 1, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 512, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 512, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.029, "cosStep": 0.017 } |
| }, |
| "biasT": { |
| "dtype": "float32", |
| "shape": [768], |
| "data": { "kind": "fillFloat32", "scale": 0.03, "sinStep": 0.023, "cosStep": 0.011 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 1, 256], "tolerance": 0.0003 } } |
| }, |
| { |
| "name": "splitk_decode_head_dim64_no_bias_kv2048", |
| "attrs": { "num_heads": 4, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 1, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 2048, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 2048, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.029, "cosStep": 0.017 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 1, 256], "tolerance": 0.0003 } } |
| }, |
| { |
| "name": "splitk_decode_head_dim128_no_bias_kv2048", |
| "provenance": { |
| "notes": "Compact companion for bench case decode-h8-d128-kv2048, covering headDim=128 decode split-K selection." |
| }, |
| "attrs": { "num_heads": 2, "scale": 0.08838834764831845 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 1, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 2048, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 2048, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.029, "cosStep": 0.017 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 1, 256], "tolerance": 0.0003 } } |
| }, |
| { |
| "name": "splitk_decode_head_dim64_no_bias_kv768_b2", |
| "attrs": { "num_heads": 8, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [2, 1, 512], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [2, 768, 512], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [2, 768, 512], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.029, "cosStep": 0.017 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [2, 1, 512], "tolerance": 0.0003 } } |
| }, |
| { |
| "name": "splitk_decode_head_dim64_bias_kv768_b2", |
| "attrs": { "num_heads": 8, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [2, 1, 512], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.011, "cosStep": 0.027 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [2, 768, 512], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.017, "cosStep": 0.035 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [2, 768, 512], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.031, "cosStep": 0.019 } |
| }, |
| "biasT": { |
| "dtype": "float32", |
| "shape": [1536], |
| "data": { "kind": "fillFloat32", "scale": 0.03, "sinStep": 0.023, "cosStep": 0.011 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [2, 1, 512], "tolerance": 0.0003 } } |
| }, |
| { |
| "name": "splitk_decode_head_dim64_bias_kv512", |
| "attrs": { "num_heads": 8, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 1, 512], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 512, 512], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 512, 512], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.029, "cosStep": 0.017 } |
| }, |
| "biasT": { |
| "dtype": "float32", |
| "shape": [1536], |
| "data": { "kind": "fillFloat32", "scale": 0.03, "sinStep": 0.021, "cosStep": 0.013 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 1, 512], "tolerance": 0.0003 } } |
| }, |
| { |
| "name": "flash_self_attention_head_dim128_no_bias_f16", |
| "provenance": { |
| "notes": "f16 headDim=128 prefill coverage for q32-broadcast benchmarks; full tier selects qkv_no_bias_flash_q32_broadcast and no-subgroups selects qkv_no_bias_flash_q32_shared." |
| }, |
| "attrs": { "num_heads": 4, "scale": 0.08838834764831845 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float16", |
| "shape": [1, 64, 512], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.017, "cosStep": 0.031 } |
| }, |
| "keyT": { |
| "dtype": "float16", |
| "shape": [1, 64, 512], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.011, "cosStep": 0.023 } |
| }, |
| "valueT": { |
| "dtype": "float16", |
| "shape": [1, 64, 512], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.007, "cosStep": 0.041 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float16", "shape": [1, 64, 512], "tolerance": 0.03 } } |
| }, |
| { |
| "name": "flash_decode_head_dim64_no_bias_f16", |
| "attrs": { "num_heads": 4, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float16", |
| "shape": [1, 1, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.017, "cosStep": 0.031 } |
| }, |
| "keyT": { |
| "dtype": "float16", |
| "shape": [1, 512, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.011, "cosStep": 0.023 } |
| }, |
| "valueT": { |
| "dtype": "float16", |
| "shape": [1, 512, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.007, "cosStep": 0.041 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float16", "shape": [1, 1, 256], "tolerance": 0.03 } } |
| }, |
| { |
| "name": "cross_attention_projection_bias_f16", |
| "attrs": { "num_heads": 2 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float16", |
| "shape": [1, 2, 8], |
| "data": { "kind": "fillFloat32", "scale": 0.1, "sinStep": 0.17, "cosStep": 0.31 } |
| }, |
| "keyT": { |
| "dtype": "float16", |
| "shape": [1, 3, 8], |
| "data": { "kind": "fillFloat32", "scale": 0.1, "sinStep": 0.11, "cosStep": 0.23 } |
| }, |
| "valueT": { |
| "dtype": "float16", |
| "shape": [1, 3, 8], |
| "data": { "kind": "fillFloat32", "scale": 0.1, "sinStep": 0.07, "cosStep": 0.41 } |
| }, |
| "biasT": { |
| "dtype": "float16", |
| "shape": [24], |
| "data": { "kind": "fillFloat32", "scale": 0.03, "sinStep": 0.19, "cosStep": 0.13 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float16", "shape": [1, 2, 8], "tolerance": 0.003 } } |
| }, |
| { |
| "name": "causal_cross_attention_q2_kv4_exact", |
| "provenance": { |
| "source": "onnxruntime/contrib_ops/cpu/bert/attention_helper.h", |
| "notes": "Exact upper-left causal witness. ORT CPU skips masking the final query row when qSeq < kvSeq and returns 3.75 instead of 1.5 there." |
| }, |
| "attrs": { "num_heads": 1, "unidirectional": 1 }, |
| "inputs": { |
| "queryT": { "dtype": "float32", "shape": [1, 2, 1], "data": { "kind": "values", "values": [0.0, 0.0] } }, |
| "keyT": { "dtype": "float32", "shape": [1, 4, 1], "data": { "kind": "values", "values": [0.0, 0.0, 0.0, 0.0] } }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 4, 1], |
| "data": { "kind": "values", "values": [1.0, 2.0, 4.0, 8.0] } |
| } |
| }, |
| "outputs": { |
| "outputT": { |
| "dtype": "float32", |
| "shape": [1, 2, 1], |
| "data": { "kind": "values", "values": [1.0, 1.5] }, |
| "tolerance": 0, |
| "relTolerance": 0 |
| } |
| } |
| }, |
| { |
| "name": "flash_unidir_nonsquare_q128_kv512_d64", |
| "attrs": { "num_heads": 4, "scale": 0.125, "unidirectional": 1 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 128, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.013, "cosStep": 0.027 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 512, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.011, "cosStep": 0.023 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 512, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.007, "cosStep": 0.031 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 128, 256], "tolerance": 0.0003 } } |
| }, |
| { |
| "name": "flash_head_dim80_lpq4_no_bias", |
| "attrs": { "num_heads": 4, "scale": 0.111803398875 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 64, 320], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.017, "cosStep": 0.031 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 64, 320], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.011, "cosStep": 0.023 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 64, 320], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.007, "cosStep": 0.041 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 64, 320], "tolerance": 0.0002 } } |
| }, |
| { |
| "name": "empty_input_zero_dim", |
| "attrs": { "num_heads": 2 }, |
| "inputs": { |
| "queryT": { "dtype": "float32", "shape": [0, 3, 6], "data": { "kind": "values", "values": [] } }, |
| "keyT": { "dtype": "float32", "shape": [0, 4, 6], "data": { "kind": "values", "values": [] } }, |
| "valueT": { "dtype": "float32", "shape": [0, 4, 6], "data": { "kind": "values", "values": [] } } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [0, 3, 6], "tolerance": 0 } } |
| }, |
| { |
| "name": "dispatch_cliff_qseq_65537", |
| "provenance": { |
| "notes": "query sequence 65537 exceeds the flash-path cap and exercises the scalar fallback's folded dispatch. x is clamped to 65535 and the grid-stride loop handles the final two queries on its second iteration. kvSeq=2 keeps the reference compact, while distinct query rows expose an indexing error." |
| }, |
| "attrs": { "num_heads": 1 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 65537, 64], |
| "data": { "kind": "fillFloat32", "sinStep": 0.013, "cosStep": 0.017 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 2, 64], |
| "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.023 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 2, 64], |
| "data": { "kind": "fillFloat32", "sinStep": 0.007, "cosStep": 0.041 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 65537, 64], "tolerance": 0.00002 } } |
| }, |
| { |
| "name": "scalar_causal_odd_headdim6_qseq4", |
| "attrs": { "num_heads": 2, "unidirectional": 1 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 4, 12], |
| "data": { "kind": "fillFloat32", "scale": 0.4, "sinStep": 0.13, "cosStep": 0.29 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 4, 12], |
| "data": { "kind": "fillFloat32", "scale": 0.4, "sinStep": 0.11, "cosStep": 0.23 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 4, 12], |
| "data": { "kind": "fillFloat32", "scale": 0.4, "sinStep": 0.07, "cosStep": 0.41 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 4, 12], "tolerance": 0.00003 } } |
| }, |
| { |
| "name": "scalar_bias_cross_odd_headdim6", |
| "attrs": { "num_heads": 2, "scale": 0.5 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 2, 12], |
| "data": { "kind": "fillFloat32", "scale": 0.3, "sinStep": 0.17, "cosStep": 0.31 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 3, 12], |
| "data": { "kind": "fillFloat32", "scale": 0.3, "sinStep": 0.11, "cosStep": 0.23 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 3, 12], |
| "data": { "kind": "fillFloat32", "scale": 0.3, "sinStep": 0.07, "cosStep": 0.41 } |
| }, |
| "biasT": { |
| "dtype": "float32", |
| "shape": [36], |
| "data": { "kind": "fillFloat32", "scale": 0.05, "sinStep": 0.19, "cosStep": 0.13 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 2, 12], "tolerance": 0.00003 } } |
| }, |
| { |
| "name": "scalar_causal_qseq6_gt_kvseq3_odd_headdim", |
| "attrs": { "num_heads": 2, "unidirectional": 1 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 6, 12], |
| "data": { "kind": "fillFloat32", "scale": 0.4, "sinStep": 0.13, "cosStep": 0.27 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 3, 12], |
| "data": { "kind": "fillFloat32", "scale": 0.4, "sinStep": 0.11, "cosStep": 0.23 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 3, 12], |
| "data": { "kind": "fillFloat32", "scale": 0.4, "sinStep": 0.07, "cosStep": 0.41 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 6, 12], "tolerance": 0.00003 } } |
| }, |
| { |
| "name": "cluster_prefill_qseq64_h16_d64_compact", |
| "provenance": { |
| "notes": "Compact companion for bench case prefill-cluster-qseq64-h16-d64-HEALTHY, which exposes the baseline/no-subgroups tier gap in the cluster prefill route." |
| }, |
| "attrs": { "num_heads": 16, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 64, 1024], |
| "data": { "kind": "fillFloat32", "scale": 0.2, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 128, 1024], |
| "data": { "kind": "fillFloat32", "scale": 0.2, "sinStep": 0.019, "cosStep": 0.023 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 128, 1024], |
| "data": { "kind": "fillFloat32", "scale": 0.2, "sinStep": 0.007, "cosStep": 0.041 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 64, 1024], "tolerance": 0.00008, "relTolerance": 0.00008 } |
| } |
| }, |
| { |
| "name": "flux2_joint_d128_q32_h8_compact", |
| "provenance": { |
| "notes": "Compact companion for bench case flux2-joint-attn-img512-s1536-24h-d128, preserving headDim=128 and qSeq*heads>=256 so the flash-cluster path and no-subgroups fallback remain eligible." |
| }, |
| "attrs": { "num_heads": 8, "scale": 0.08838834764831845 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 32, 1024], |
| "data": { "kind": "fillFloat32", "scale": 0.16, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 32, 1024], |
| "data": { "kind": "fillFloat32", "scale": 0.16, "sinStep": 0.019, "cosStep": 0.023 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 32, 1024], |
| "data": { "kind": "fillFloat32", "scale": 0.16, "sinStep": 0.007, "cosStep": 0.041 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 32, 1024], "tolerance": 0.0001, "relTolerance": 0.0001 } |
| } |
| }, |
| { |
| "name": "flux2_joint_d128_q32_h8_bias_compact", |
| "provenance": { |
| "notes": "Compact correctness companion for the fused-bias benchmark at the 32-vec4, 32-lane register-topology boundary." |
| }, |
| "attrs": { "num_heads": 8, "scale": 0.08838834764831845 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 32, 1024], |
| "data": { "kind": "fillFloat32", "scale": 0.16, "sinStep": 0.011, "cosStep": 0.027 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 32, 1024], |
| "data": { "kind": "fillFloat32", "scale": 0.16, "sinStep": 0.017, "cosStep": 0.035 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 32, 1024], |
| "data": { "kind": "fillFloat32", "scale": 0.16, "sinStep": 0.031, "cosStep": 0.019 } |
| }, |
| "biasT": { |
| "dtype": "float32", |
| "shape": [3072], |
| "data": { "kind": "fillFloat32", "scale": 0.03, "sinStep": 0.023, "cosStep": 0.011 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 32, 1024], "tolerance": 0.00012, "relTolerance": 0.00012 } |
| } |
| }, |
| { |
| "name": "empty_query_seq0_nonempty_kv", |
| "attrs": { "num_heads": 2 }, |
| "inputs": { |
| "queryT": { "dtype": "float32", "shape": [1, 0, 6], "data": { "kind": "values", "values": [] } }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 3, 6], |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 3, 6], |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41 } |
| } |
| }, |
| "outputs": { |
| "outputT": { |
| "dtype": "float32", |
| "shape": [1, 0, 6], |
| "data": { "kind": "values", "values": [] }, |
| "tolerance": 0 |
| } |
| } |
| }, |
| { |
| "name": "q31_kv511_h8_d64_double_threshold_compact", |
| "provenance": { |
| "notes": "Compact lock immediately below both flash admission boundaries: qSeq*heads=31*8=248 (<256) and kvSeq=511 (<512). It guards the realistic scalar fallback that the paired benchmark exposes." |
| }, |
| "attrs": { "num_heads": 8, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 31, 512], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.017, "cosStep": 0.031 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 511, 512], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.011, "cosStep": 0.023 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 511, 512], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.007, "cosStep": 0.041 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 31, 512], "tolerance": 0.0005, "relTolerance": 0.0005 } |
| } |
| }, |
| { |
| "name": "flash_shortq2_longkv2048_h4_d32_compact", |
| "provenance": { |
| "notes": "Correctness lock for short-query/long-context flash admission and the minimum vectorized headDim=32 path." |
| }, |
| "attrs": { "num_heads": 4, "scale": 0.17677669529663687 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 2, 128], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.017, "cosStep": 0.031 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 2048, 128], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.011, "cosStep": 0.023 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 2048, 128], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.007, "cosStep": 0.041 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 2, 128], "tolerance": 0.0005, "relTolerance": 0.0005 } |
| } |
| }, |
| { |
| "name": "splitk_decode_h4_d32_kv512_compact", |
| "provenance": { "notes": "Correctness lock for headDim=32 decode split-K on subgroup and subgroup-free tiers." }, |
| "attrs": { "num_heads": 4, "scale": 0.17677669529663687 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 1, 128], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 512, 128], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 512, 128], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.029, "cosStep": 0.017 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 1, 128], "tolerance": 0.0005, "relTolerance": 0.0005 } |
| } |
| }, |
| { |
| "name": "small_head_parallel_q3_kv65_h2_d6_compact", |
| "provenance": { |
| "notes": "Compact correctness lock for the D<32 key-parallel fallback. The paired q128/kv2048 benchmark exposes the per-key-barrier pathology this path removes." |
| }, |
| "attrs": { "num_heads": 2, "scale": 0.408248290463863 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 3, 12], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 65, 12], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 65, 12], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.029, "cosStep": 0.017 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 3, 12], "tolerance": 0.00005, "relTolerance": 0.00005 } |
| } |
| }, |
| { |
| "name": "small_head_parallel_f16_q3_kv65_h2_d6", |
| "provenance": { |
| "notes": "Float16 coverage for the D<32 key-parallel fallback. Values are scaled to O(1) while queries and keys remain small, keeping the convex-combination output near one so the tolerance detects meaningful scale errors." |
| }, |
| "attrs": { "num_heads": 2, "scale": 0.408248290463863 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float16", |
| "shape": [1, 3, 12], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float16", |
| "shape": [1, 65, 12], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float16", |
| "shape": [1, 65, 12], |
| "data": { "kind": "fillFloat32", "scale": 1.0, "sinStep": 0.029, "cosStep": 0.017 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float16", "shape": [1, 3, 12], "tolerance": 0.002, "relTolerance": 0.002 } } |
| }, |
| { |
| "name": "short_query_splitk_single_partition_q16_kv2048_h8_d32", |
| "provenance": { |
| "notes": "Locks the adaptive one-partition short-query flash path once batch*queries*heads already supplies 128 workgroups; the paired q16/kv4096 benchmark measures the same occupancy regime." |
| }, |
| "attrs": { "num_heads": 8, "scale": 0.17677669529663687 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 16, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 2048, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 2048, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.029, "cosStep": 0.017 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 16, 256], "tolerance": 0.0005, "relTolerance": 0.0005 } |
| } |
| }, |
| { |
| "name": "materialized_prefill_q512_h1_d128_no_bias", |
| "provenance": { |
| "notes": "Correctness lock for the register-blocked QK / in-place softmax / register-blocked PV prefill path used by long f32 attention." |
| }, |
| "attrs": { "num_heads": 1, "scale": 0.08838834764831845 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 512, 128], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 512, 128], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 512, 128], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.029, "cosStep": 0.017 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 512, 128], "tolerance": 0.0004, "relTolerance": 0.0004 } |
| } |
| }, |
| { |
| "name": "materialized_sgmat_fused_f16_q1024_h4_d64_no_bias", |
| "provenance": { |
| "notes": "Pins the f16-operand fused materialized subgroup-matrix route just over its 16MB score-bytes admission floor (4 heads x 1024 x 1024 x 4B): f16 QK operands with f32 accumulation, raw f32 scores plus row stats, and the f16-probability PV apply with the dedicated f32 store scratch." |
| }, |
| "attrs": { "num_heads": 4, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float16", |
| "shape": [1, 1024, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float16", |
| "shape": [1, 1024, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float16", |
| "shape": [1, 1024, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.029, "cosStep": 0.017, "offset": 1.0 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float16", "shape": [1, 1024, 256], "tolerance": 0.02, "relTolerance": 0.02 } } |
| }, |
| { |
| "name": "materialized_sgmat_fused_f16_q1024_h4_d80_no_bias", |
| "provenance": { |
| "notes": "The d=80 twin of the f16 fused materialized fixture: a head dim that is not a multiple of 32 takes the guarded staging forms instead of the unguarded selects, on the same 16MB score-bytes admission floor." |
| }, |
| "attrs": { "num_heads": 4, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float16", |
| "shape": [1, 1024, 320], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float16", |
| "shape": [1, 1024, 320], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float16", |
| "shape": [1, 1024, 320], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.029, "cosStep": 0.017, "offset": 1.0 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float16", "shape": [1, 1024, 320], "tolerance": 0.02, "relTolerance": 0.02 } } |
| }, |
| { |
| "name": "materialized_sgmat_q512_kv512_h1_d128_bias", |
| "provenance": { |
| "notes": "Bias twin of the d128 subgroup-matrix prefill. headDim % 32 == 0 takes the select-form Q tile load, so this locks the fused Q bias on that branch and the post-normalization V bias in the compact store epilogue. The K bias is deliberately absent from the kernel and present in the reference: it shifts every logit in a row by one constant, so softmax cancels it, and a divergence here would prove otherwise." |
| }, |
| "attrs": { "num_heads": 1, "scale": 0.08838834764831845 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 512, 128], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 512, 128], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 512, 128], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.029, "cosStep": 0.017 } |
| }, |
| "biasT": { |
| "dtype": "float32", |
| "shape": [384], |
| "data": { "kind": "fillFloat32", "scale": 0.05, "sinStep": 0.023, "cosStep": 0.011 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 512, 128], "tolerance": 0.0006, "relTolerance": 0.0006 } |
| } |
| }, |
| { |
| "name": "portable_head_dim320_no_bias", |
| "provenance": { |
| "notes": "Locks the device-derived portable fallback above the former hard-coded headDim<=256 ceiling; D320 occurs in wide vision and multimodal attention blocks." |
| }, |
| "attrs": { "num_heads": 1, "scale": 0.05590169943749474 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 2, 320], |
| "data": { "kind": "fillFloat32", "scale": 0.06, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 3, 320], |
| "data": { "kind": "fillFloat32", "scale": 0.06, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 3, 320], |
| "data": { "kind": "fillFloat32", "scale": 0.06, "sinStep": 0.029, "cosStep": 0.017 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 2, 320], "tolerance": 0.00005, "relTolerance": 0.00005 } |
| } |
| }, |
| { |
| "name": "splitk_decode_q1_kv1500_h6_d64_underfilled_wide_subgroup", |
| "provenance": { |
| "notes": "A six-head f32 decode geometry where d64 supplies only 16 vec4 dot products to a 32-lane subgroup; the selector should prefer the portable split-K kernel instead of an underfilled cooperative QK subgroup." |
| }, |
| "attrs": { "num_heads": 6, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 1, 384], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 1500, 384], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 1500, 384], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.029, "cosStep": 0.017 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 1, 384], "tolerance": 0.0005, "relTolerance": 0.0005 } |
| } |
| }, |
| { |
| "name": "materialized_sgmat_cached_q1500_kv1500_h2_d64_tails", |
| "provenance": { |
| "notes": "A production-scale parity lock for the f32 subgroup-matrix path and register-cached vec4 softmax. S=1500 exercises BM/BN64 tails and a partial final lane group; two heads cover packed BSH offsets at lower test cost." |
| }, |
| "attrs": { "num_heads": 2, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 1500, 128], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.011, "cosStep": 0.027 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 1500, 128], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.017, "cosStep": 0.035 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 1500, 128], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.031, "cosStep": 0.019 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 1500, 128], "tolerance": 0.0004, "relTolerance": 0.0004 } |
| } |
| }, |
| { |
| "name": "materialized_prefill_q512_h1_d64_bias", |
| "provenance": { |
| "notes": "Bias companion for the portable materialized f32 path; the even KV length exercises its register-cached vec4 softmax while locking fused Q bias and post-normalization V bias." |
| }, |
| "attrs": { "num_heads": 1, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 512, 64], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.011, "cosStep": 0.027 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 512, 64], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.017, "cosStep": 0.035 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 512, 64], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.031, "cosStep": 0.019 } |
| }, |
| "biasT": { |
| "dtype": "float32", |
| "shape": [192], |
| "data": { "kind": "fillFloat32", "scale": 0.03, "sinStep": 0.023, "cosStep": 0.011 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 512, 64], "tolerance": 0.0004, "relTolerance": 0.0004 } |
| } |
| }, |
| { |
| "name": "materialized_prefill_q512_kv515_h1_d64_bias_scalar_softmax", |
| "provenance": { |
| "notes": "Odd-KV bias coverage keeps the portable materialized GEMMs eligible while proving the scalar softmax remains the correctness fallback when scores cannot be viewed as vec4." |
| }, |
| "attrs": { "num_heads": 1, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 512, 64], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 515, 64], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 515, 64], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.029, "cosStep": 0.017 } |
| }, |
| "biasT": { |
| "dtype": "float32", |
| "shape": [192], |
| "data": { "kind": "fillFloat32", "scale": 0.03, "sinStep": 0.023, "cosStep": 0.011 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 512, 64], "tolerance": 0.0004, "relTolerance": 0.0004 } |
| } |
| }, |
| { |
| "name": "materialized_sgmat_cached_q520_kv516_h2_d80_all_tails", |
| "provenance": { |
| "notes": "Generalized subgroup-matrix coverage: d80 exercises the BK32 tail, q520/kv516 exercise both matrix tile tails, and kv516 keeps the register-cached vec4 softmax eligible." |
| }, |
| "attrs": { "num_heads": 2, "scale": 0.11180339887498948 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 520, 160], |
| "data": { "kind": "fillFloat32", "scale": 0.06, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 516, 160], |
| "data": { "kind": "fillFloat32", "scale": 0.06, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 516, 160], |
| "data": { "kind": "fillFloat32", "scale": 0.06, "sinStep": 0.029, "cosStep": 0.017 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 520, 160], "tolerance": 0.001, "relTolerance": 0.001 } |
| } |
| }, |
| { |
| "name": "materialized_sgmat_q520_kv516_h2_d80_all_tails_bias", |
| "provenance": { |
| "notes": "Bias twin on the guarded Q tile load: d80 is not a multiple of 32, so the select-form branch is unavailable and the bounds-checked load carries the bias instead. q520/kv516 keep both matrix tile tails live, where a bias applied to a padded row would leak into the result." |
| }, |
| "attrs": { "num_heads": 2, "scale": 0.11180339887498948 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 520, 160], |
| "data": { "kind": "fillFloat32", "scale": 0.06, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 516, 160], |
| "data": { "kind": "fillFloat32", "scale": 0.06, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 516, 160], |
| "data": { "kind": "fillFloat32", "scale": 0.06, "sinStep": 0.029, "cosStep": 0.017 } |
| }, |
| "biasT": { |
| "dtype": "float32", |
| "shape": [480], |
| "data": { "kind": "fillFloat32", "scale": 0.05, "sinStep": 0.023, "cosStep": 0.011 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 520, 160], "tolerance": 0.0012, "relTolerance": 0.0012 } |
| } |
| }, |
| { |
| "name": "materialized_sgmat_scalar_softmax_q513_kv515_h1_d80", |
| "provenance": { |
| "notes": "An odd KV length disables vec4 caching while preserving the generalized subgroup-matrix score/apply path; every GEMM dimension has a tail." |
| }, |
| "attrs": { "num_heads": 1, "scale": 0.11180339887498948 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 513, 80], |
| "data": { "kind": "fillFloat32", "scale": 0.06, "sinStep": 0.011, "cosStep": 0.027 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 515, 80], |
| "data": { "kind": "fillFloat32", "scale": 0.06, "sinStep": 0.017, "cosStep": 0.035 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 515, 80], |
| "data": { "kind": "fillFloat32", "scale": 0.06, "sinStep": 0.031, "cosStep": 0.019 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 513, 80], "tolerance": 0.001, "relTolerance": 0.001 } } |
| }, |
| { |
| "name": "materialized_sgmat_cached_batch2_q512_kv512_h1_d32", |
| "provenance": { |
| "notes": "Batch and narrow-head coverage for the generalized selector; two batches also exercise the workgroup-z to batch/head mapping." |
| }, |
| "attrs": { "num_heads": 1, "scale": 0.17677669529663687 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [2, 512, 32], |
| "data": { "kind": "fillFloat32", "scale": 0.06, "sinStep": 0.007, "cosStep": 0.023 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [2, 512, 32], |
| "data": { "kind": "fillFloat32", "scale": 0.06, "sinStep": 0.015, "cosStep": 0.033 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [2, 512, 32], |
| "data": { "kind": "fillFloat32", "scale": 0.06, "sinStep": 0.025, "cosStep": 0.013 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [2, 512, 32], "tolerance": 0.001, "relTolerance": 0.001 } } |
| }, |
| { |
| "name": "bias_prefill_d256_register_boundary_compact", |
| "provenance": { |
| "notes": "Upper-head boundary for the fused-bias f32 Q32 broadcast specialization. At two subgroup-widths of vec4 head state the clustered kernel avoids the broadcast kernel's doubled long-lived Q/output register footprint." |
| }, |
| "attrs": { "num_heads": 8, "scale": 0.0625 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 32, 2048], |
| "data": { "kind": "fillFloat32", "scale": 0.16, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 32, 2048], |
| "data": { "kind": "fillFloat32", "scale": 0.16, "sinStep": 0.019, "cosStep": 0.023 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 32, 2048], |
| "data": { "kind": "fillFloat32", "scale": 0.16, "sinStep": 0.007, "cosStep": 0.041 } |
| }, |
| "biasT": { |
| "dtype": "float32", |
| "shape": [6144], |
| "data": { "kind": "fillFloat32", "scale": 0.03, "sinStep": 0.023, "cosStep": 0.011 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 32, 2048], "tolerance": 0.00015, "relTolerance": 0.00015 } |
| } |
| }, |
| { |
| "name": "attn_bias_flash_full_b2_h8_s32", |
| "attrs": { "num_heads": 8 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [2, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [2, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [2, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41 } |
| }, |
| "attentionBiasT": { |
| "dtype": "float32", |
| "shape": [2, 8, 32, 32], |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.29, "scale": 0.5 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [2, 32, 256], "tolerance": 0.00003 } } |
| }, |
| { |
| "name": "attn_bias_flash_broadcast_b1h1_s32", |
| "attrs": { "num_heads": 8 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [2, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [2, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [2, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41 } |
| }, |
| "attentionBiasT": { |
| "dtype": "float32", |
| "shape": [1, 1, 32, 32], |
| "data": { "kind": "fillFloat32", "sinStep": 0.19, "cosStep": 0.37, "scale": 0.5 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [2, 32, 256], "tolerance": 0.00003 } } |
| }, |
| { |
| "name": "attn_bias_flash_broadcast_head_b2h1_s32", |
| "attrs": { "num_heads": 8 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [2, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [2, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [2, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41 } |
| }, |
| "attentionBiasT": { |
| "dtype": "float32", |
| "shape": [2, 1, 32, 32], |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.11, "scale": 0.5 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [2, 32, 256], "tolerance": 0.00003 } } |
| }, |
| { |
| "name": "attn_bias_flash_broadcast_batch_b1h8_s32", |
| "attrs": { "num_heads": 8 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [2, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [2, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [2, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41 } |
| }, |
| "attentionBiasT": { |
| "dtype": "float32", |
| "shape": [1, 8, 32, 32], |
| "data": { "kind": "fillFloat32", "sinStep": 0.29, "cosStep": 0.07, "scale": 0.5 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [2, 32, 256], "tolerance": 0.00003 } } |
| }, |
| { |
| "name": "attn_bias_fused_bias_flash_b2_h8_s32", |
| "attrs": { "num_heads": 8 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [2, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [2, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [2, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41 } |
| }, |
| "biasT": { |
| "dtype": "float32", |
| "shape": [768], |
| "data": { "kind": "fillFloat32", "sinStep": 0.05, "cosStep": 0.43, "scale": 0.2 } |
| }, |
| "attentionBiasT": { |
| "dtype": "float32", |
| "shape": [2, 8, 32, 32], |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.29, "scale": 0.5 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [2, 32, 256], "tolerance": 0.00003 } } |
| }, |
| { |
| "name": "attn_bias_tiled_prefill_q32_h4_d64", |
| "attrs": { "num_heads": 4 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41 } |
| }, |
| "attentionBiasT": { |
| "dtype": "float32", |
| "shape": [1, 1, 32, 32], |
| "data": { "kind": "fillFloat32", "sinStep": 0.19, "cosStep": 0.37, "scale": 0.5 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 32, 256], "tolerance": 0.00003 } } |
| }, |
| { |
| "name": "attn_bias_scalar_cross_odd_headdim6", |
| "attrs": { "num_heads": 2 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [2, 4, 12], |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [2, 5, 12], |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [2, 5, 12], |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41 } |
| }, |
| "attentionBiasT": { |
| "dtype": "float32", |
| "shape": [2, 2, 4, 5], |
| "data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.29, "scale": 0.5 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [2, 4, 12], "tolerance": 0.00002 } } |
| }, |
| { |
| "name": "attn_bias_scalar_fused_bias_causal_odd_headdim6", |
| "attrs": { "num_heads": 2, "unidirectional": 1 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 4, 12], |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 4, 12], |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 4, 12], |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41 } |
| }, |
| "biasT": { |
| "dtype": "float32", |
| "shape": [36], |
| "data": { "kind": "fillFloat32", "sinStep": 0.05, "cosStep": 0.43, "scale": 0.2 } |
| }, |
| "attentionBiasT": { |
| "dtype": "float32", |
| "shape": [1, 1, 4, 4], |
| "data": { "kind": "fillFloat32", "sinStep": 0.19, "cosStep": 0.37, "scale": 0.5 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 4, 12], "tolerance": 0.00002 } } |
| }, |
| { |
| "name": "attn_bias_flash_f16_b1_h8_s32", |
| "attrs": { "num_heads": 8 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float16", |
| "shape": [1, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31 } |
| }, |
| "keyT": { |
| "dtype": "float16", |
| "shape": [1, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23 } |
| }, |
| "valueT": { |
| "dtype": "float16", |
| "shape": [1, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41 } |
| }, |
| "attentionBiasT": { |
| "dtype": "float16", |
| "shape": [1, 1, 32, 32], |
| "data": { "kind": "fillFloat32", "sinStep": 0.19, "cosStep": 0.37, "scale": 0.5 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float16", "shape": [1, 32, 256], "tolerance": 0.03 } } |
| }, |
| { |
| "name": "flash_q30_below_cluster_h9_d64_no_bias", |
| "provenance": { |
| "notes": "One query row below the cooperative cluster threshold (qSeq 30 < 31) while qSeq*heads=270 still clears the flash occupancy floor, and kvSeq stays far under the split-K thresholds. Locks the one-query-row-per-workgroup flash kernel: the subgroup form on fixed-width tiers, the portable form on tiers without subgroups." |
| }, |
| "attrs": { "num_heads": 9, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 30, 576], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.017, "cosStep": 0.031 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 32, 576], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.011, "cosStep": 0.023 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 32, 576], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.007, "cosStep": 0.041 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 30, 576], "tolerance": 0.00005, "relTolerance": 0.00005 } |
| } |
| }, |
| { |
| "name": "flash_q30_below_cluster_h9_d64_bias", |
| "provenance": { |
| "notes": "Fused-QKV-bias sibling of flash_q30_below_cluster_h9_d64_no_bias: same sub-cluster query count, so the biased flash kernel runs per query row instead of the clustered or split-K forms." |
| }, |
| "attrs": { "num_heads": 9, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 30, 576], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.017, "cosStep": 0.031 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 32, 576], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.011, "cosStep": 0.023 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 32, 576], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.007, "cosStep": 0.041 } |
| }, |
| "biasT": { |
| "dtype": "float32", |
| "shape": [1728], |
| "data": { "kind": "fillFloat32", "scale": 0.05, "sinStep": 0.013, "cosStep": 0.029 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 30, 576], "tolerance": 0.00005, "relTolerance": 0.00005 } |
| } |
| }, |
| { |
| "name": "flash_q30_below_cluster_h9_d64_attn_bias", |
| "provenance": { |
| "notes": "Additive attention-bias sibling of flash_q30_below_cluster_h9_d64_no_bias: qSeq 30 keeps the tiled prefill kernel (qSeq >= 31) out, so the per-query-row attention-bias flash kernel runs on tiers without subgroups." |
| }, |
| "attrs": { "num_heads": 9, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 30, 576], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.017, "cosStep": 0.031 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 32, 576], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.011, "cosStep": 0.023 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 32, 576], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.007, "cosStep": 0.041 } |
| }, |
| "attentionBiasT": { |
| "dtype": "float32", |
| "shape": [1, 9, 30, 32], |
| "data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.11, "scale": 0.5 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 30, 576], "tolerance": 0.00005, "relTolerance": 0.00005 } |
| } |
| }, |
| { |
| "name": "small_seq_minilm_b1_q11_h12_d32", |
| "provenance": { |
| "notes": "all-MiniLM-L6-v2 self-attention at a short sentence: the whole-head small-seq variant." |
| }, |
| "attrs": { "num_heads": 12 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 11, 384], |
| "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.043, "scale": 0.4 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 11, 384], |
| "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.023, "scale": 0.4 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 11, 384], |
| "data": { "kind": "fillFloat32", "sinStep": 0.007, "cosStep": 0.041, "scale": 0.4 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 11, 384], "tolerance": 0.00002 } } |
| }, |
| { |
| "name": "small_seq_boundary_b1_q32_kv32_h4_d64", |
| "provenance": { |
| "notes": "SMALL_SEQ_MAX on both axes; kvSeq+headDim = 96 sits exactly on SMALL_SEQ_MAX_PRIVATE_FLOATS." |
| }, |
| "attrs": { "num_heads": 4 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.043, "scale": 0.4 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.023, "scale": 0.4 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 32, 256], |
| "data": { "kind": "fillFloat32", "sinStep": 0.007, "cosStep": 0.041, "scale": 0.4 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 32, 256], "tolerance": 0.00002 } } |
| }, |
| { |
| "name": "small_seq_cross_b1_q5_kv17_h3_d16", |
| "provenance": { |
| "notes": "Cross attention: kvSeq != qSeq, and neither is a power of two (the workgroup rounds up, the tail threads must not write)." |
| }, |
| "attrs": { "num_heads": 3 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 5, 48], |
| "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.043, "scale": 0.4 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 17, 48], |
| "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.023, "scale": 0.4 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 17, 48], |
| "data": { "kind": "fillFloat32", "sinStep": 0.007, "cosStep": 0.041, "scale": 0.4 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 5, 48], "tolerance": 0.00002 } } |
| }, |
| { |
| "name": "small_seq_batch2_q7_kv7_h2_d8", |
| "provenance": { |
| "notes": "Batch > 1 drives the dispatch y axis; a wrong batch stride would mix the two sequences." |
| }, |
| "attrs": { "num_heads": 2 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [2, 7, 16], |
| "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.043, "scale": 0.4 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [2, 7, 16], |
| "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.023, "scale": 0.4 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [2, 7, 16], |
| "data": { "kind": "fillFloat32", "sinStep": 0.007, "cosStep": 0.041, "scale": 0.4 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [2, 7, 16], "tolerance": 0.00002 } } |
| }, |
| { |
| "name": "small_seq_declines_once_flash_is_eligible_b1_q32_h12_d32", |
| "provenance": { |
| "notes": "Selection boundary opposite the small-sequence case: 12 heads at sequence length 32 satisfy flashShapeOk, so the whole-head route must decline. This locks the shared `not flashShapeOk` predicate used by the whole-head and portable routes." |
| }, |
| "attrs": { "num_heads": 12 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 32, 384], |
| "data": { "kind": "fillFloat32", "sinStep": 0.017, "cosStep": 0.043, "scale": 0.4 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 32, 384], |
| "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.023, "scale": 0.4 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 32, 384], |
| "data": { "kind": "fillFloat32", "sinStep": 0.007, "cosStep": 0.041, "scale": 0.4 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 32, 384], "tolerance": 0.00002 } } |
| }, |
| { |
| "name": "materialized_sgmat_q512_kv512_h2_d64_offset_value_scale_lock", |
| "provenance": { |
| "notes": "The other materialized-sgmat fixtures draw V from a zero-mean sinusoid, so a softmax average over hundreds of keys cancels to ~1e-5 and the 4e-4 absolute tolerance swamps any multiplicative error: halving the apply output passes every one of them. Offsetting V to oscillate about 1.0 makes the attention average O(1), so the normalization itself is under test - the denominator the row-stats pass publishes, and the divide the apply performs with it." |
| }, |
| "attrs": { "num_heads": 2, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 512, 128], |
| "data": { "kind": "fillFloat32", "scale": 0.9, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 512, 128], |
| "data": { "kind": "fillFloat32", "scale": 0.9, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 512, 128], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "offset": 1.0, "sinStep": 0.031, "cosStep": 0.019 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 512, 128], "tolerance": 0.0004, "relTolerance": 0.0004 } |
| } |
| }, |
| { |
| "name": "materialized_sgmat_fused_q1024_kv1024_h4_d64_offset_value_scale_lock", |
| "provenance": { |
| "notes": "Above the fused-softmax score-byte threshold (4 heads x 1024 x 1024 x 4B = 16.8 MiB), so this is the row-stats route rather than the separate softmax pass. V oscillates about 1.0 so the attention average is O(1) and the normalization is actually under test: halving the apply output, or doubling either the per-tile or the combined denominator, fails this and passes every zero-mean fixture." |
| }, |
| "attrs": { "num_heads": 4, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 1024, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.9, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 1024, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.9, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 1024, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "offset": 1.0, "sinStep": 0.031, "cosStep": 0.019 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 1024, 256], "tolerance": 0.0004, "relTolerance": 0.0004 } |
| } |
| }, |
| { |
| "name": "materialized_sgmat_fused_q1024_kv1024_h4_d64_bias_offset_value_scale_lock", |
| "provenance": { |
| "notes": "Exercises the bias arm of the fused row-statistics route: Q bias is applied before the score-tile statistics, while V bias is added after the normalized average. A 16.8 MiB score tensor exceeds the fuse threshold, and V oscillating around 1.0 keeps the output O(1) so normalization-scale errors remain observable." |
| }, |
| "attrs": { "num_heads": 4, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 1024, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.9, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 1024, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.9, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 1024, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "offset": 1.0, "sinStep": 0.031, "cosStep": 0.019 } |
| }, |
| "biasT": { |
| "dtype": "float32", |
| "shape": [768], |
| "data": { "kind": "fillFloat32", "scale": 0.05, "sinStep": 0.041, "cosStep": 0.023 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 1024, 256], "tolerance": 0.0004, "relTolerance": 0.0004 } |
| } |
| }, |
| { |
| "name": "splitk_decode_h4_d64_kv2048_no_bias_ramp_value_scale_lock", |
| "provenance": { |
| "notes": "Every no-bias decode split-K fixture draws V from a zero-mean sinusoid, so the softmax average over 2048 keys cancels to ~5e-5 while the absolute tolerance is 3e-4: halving the apply output, or dropping the exp-weighted rescale in the cross-partition combine, passes all nine of them (the bias siblings only escape because the V bias survives the average). A monotone V ramp makes each output element 0.5 + 1.5 * (weighted mean key index) / kvSeq, which is O(1) - so a uniform scale error is visible - and is a direct function of the per-partition weights, so a combine that mixes partitions with the wrong exponent offset moves it too." |
| }, |
| "attrs": { "num_heads": 4, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 1, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 2048, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 2048, 256], |
| "data": { "kind": "linspace", "start": 0.5, "end": 2.0 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 1, 256], "tolerance": 0.00005 } } |
| }, |
| { |
| "name": "splitk_decode_h4_d64_kv2048_no_bias_f16_ramp_value_scale_lock", |
| "provenance": { |
| "notes": "The f16 arm of the no-bias decode split-K kernel is a separate compile (usesF16) and its only coverage was flash_decode_head_dim64_no_bias_f16, whose 0.03 absolute tolerance against a ~1e-4 expected output cannot detect a 295x scale error - the single blindest fixture in the op. Same ramped V as the f32 sibling, so the f16 accumulate/rescale path is scale-locked too." |
| }, |
| "attrs": { "num_heads": 4, "scale": 0.125 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float16", |
| "shape": [1, 1, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.017, "cosStep": 0.031 } |
| }, |
| "keyT": { |
| "dtype": "float16", |
| "shape": [1, 2048, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.011, "cosStep": 0.023 } |
| }, |
| "valueT": { |
| "dtype": "float16", |
| "shape": [1, 2048, 256], |
| "data": { "kind": "linspace", "start": 0.5, "end": 2.0 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float16", "shape": [1, 1, 256], "tolerance": 0.003 } } |
| }, |
| { |
| "name": "flash_q32_h4_d128_no_bias_f16_ramp_value_scale_lock", |
| "provenance": { |
| "notes": "qkv_no_bias_flash_q32_broadcast and qkv_no_bias_flash_q32_shared are reached by exactly one fixture, flash_self_attention_head_dim128_no_bias_f16, whose zero-mean V averages to ~1.8e-3 under a 0.03 absolute tolerance - a 16x scale error passes. Same shape, dtype and route with a monotone V ramp so each query row lands at 0.5 + 1.5 * (weighted mean key index) / 64: the register-blocked q32 epilogue divide is now under test, and the per-query variation also catches a broadcast that staged the wrong lane's row." |
| }, |
| "attrs": { "num_heads": 4, "scale": 0.08838834764831845 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float16", |
| "shape": [1, 64, 512], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.017, "cosStep": 0.031 } |
| }, |
| "keyT": { |
| "dtype": "float16", |
| "shape": [1, 64, 512], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.011, "cosStep": 0.023 } |
| }, |
| "valueT": { |
| "dtype": "float16", |
| "shape": [1, 64, 512], |
| "data": { "kind": "linspace", "start": 0.5, "end": 2.0 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float16", "shape": [1, 64, 512], "tolerance": 0.003 } } |
| }, |
| { |
| "name": "short_query_splitk_single_partition_q16_kv2048_h8_d32_ramp_value_scale_lock", |
| "provenance": { |
| "notes": "The adaptive short-query path uses one partition when batch*queries*heads already supplies enough work, so normalization stays in-kernel instead of using the cross-partition combine. A ramped V keeps each of the 16 query-row outputs O(1), making scale errors observable where a zero-mean companion averages to 5.8e-5 under a 5e-4 tolerance." |
| }, |
| "attrs": { "num_heads": 8, "scale": 0.17677669529663687 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 16, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.013, "cosStep": 0.029 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 2048, 256], |
| "data": { "kind": "fillFloat32", "scale": 0.08, "sinStep": 0.019, "cosStep": 0.037 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 2048, 256], |
| "data": { "kind": "linspace", "start": 0.5, "end": 2.0 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 16, 256], "tolerance": 0.00005 } } |
| } |
| ] |
| } |
|
|