| { |
| "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": "ORT cross-attention with batch 1, two query rows, three key/value rows, two heads of width 16, and no bias." |
| }, |
| "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.02454369261, "cosStep": 0.0007669903939 } |
| } |
| }, |
| "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.02454369261, "cosStep": 0.00009587379924 } |
| } |
| }, |
| "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.02454369261, "cosStep": 0.00002396844981 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 1, 256], "tolerance": 0.0003 } } |
| }, |
| { |
| "name": "splitk_decode_head_dim128_no_bias_kv2048", |
| "provenance": { |
| "notes": "A compact decode with eight heads, head size 128, and a long KV sequence exercises split-K attention." |
| }, |
| "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.02454369261, "cosStep": 0.00002396844981 } |
| } |
| }, |
| "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.0122718463, "cosStep": 0.00001597896654 } |
| } |
| }, |
| "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": "A float16 prefill with head size 128 exercises the q32 broadcast route with subgroups and the shared-memory q32 route without them." |
| }, |
| "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.0122718463, "cosStep": 0.000383495197 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float16", "shape": [1, 64, 512], "tolerance": 0.002 } } |
| }, |
| { |
| "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.02454369261, "cosStep": 0.00009587379924 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float16", "shape": [1, 1, 256], "tolerance": 0.002 } } |
| }, |
| { |
| "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": "Upper-left causal masking with two queries and four keys. The second query averages only the first two values, producing exactly 1.5." |
| }, |
| "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": "A 65,537-row query exceeds the flash-path cap and exercises the scalar fallback's folded dispatch. The x dimension is capped at 65,535, so a grid-stride iteration handles the final two distinct rows; two keys keep expected-value evaluation compact." |
| }, |
| "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": "A compact sequence-64, 16-head prefill exercises the clustered route and its no-subgroups fallback." |
| }, |
| "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": "Head size 128 and `qSeq * heads >= 256` keep the flash-cluster route and its no-subgroups fallback eligible at a compact scale." |
| }, |
| "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": "A compact fused-bias case exercises the boundary of 32 four-wide head segments across 32 lanes." |
| }, |
| "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": "`qSeq * heads = 248` and `kvSeq = 511` lie immediately below the two flash admission boundaries, selecting the scalar fallback." |
| }, |
| "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.0122718463, "cosStep": 0.0000480307096 } |
| } |
| }, |
| "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.04908738521, "cosStep": 0.00004793689962 } |
| } |
| }, |
| "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.04908738521, "cosStep": 0.0001917475985 } |
| } |
| }, |
| "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": "Head size 6 exercises the key-parallel fallback with multiple keys per lane and a compact expected output." |
| }, |
| "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 head size 6 exercises the key-parallel fallback. Values remain near one while queries and keys stay small, keeping scale errors observable." |
| }, |
| "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": "Sixteen queries over eight heads supply 128 workgroups, so the adaptive short-query flash path uses one K partition and normalizes in-kernel." |
| }, |
| "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.02454369261, "cosStep": 0.00002396844981 } |
| } |
| }, |
| "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.04908738521, "cosStep": 0.0001917475985 } |
| } |
| }, |
| "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": "Float16 head size 80 is not divisible by 32, selecting guarded tile staging on the fused materialized route at the 16 MiB score threshold." |
| }, |
| "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": "Head size 128 selects the subgroup-matrix prefill's unguarded Q tile load. Q bias is fused into that load and V bias follows normalization; K bias adds one constant to every row logit and must cancel under softmax." |
| }, |
| "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": "Head size 320 exercises the portable route used by 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 head size 64 supplies only 16 vec4 dot products to a 32-lane subgroup. The case exercises the portable split-K route 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.01636246174, "cosStep": 0.00002181661565 } |
| } |
| }, |
| "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.04908738521, "cosStep": 0.00006544984695 } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 1500, 128], "tolerance": 0.0004, "relTolerance": 0.0004 } |
| } |
| }, |
| { |
| "name": "materialized_prefill_q512_h1_d64_bias", |
| "provenance": { |
| "notes": "An even key/value length exercises register-cached vec4 softmax on the portable materialized route with 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": "Head size 80 exercises the BK32 tail, query length 520 and key/value length 516 exercise both matrix tile tails, and the even key count keeps 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.03926990817, "cosStep": 0.0001522089464 } |
| } |
| }, |
| "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": "Head size 80 selects the bounds-checked Q tile load with fused bias. Query length 520 and key/value length 516 keep both matrix tails live, exposing any bias applied to padded rows." |
| }, |
| "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.07853981634, "cosStep": 0.0003050089955 } |
| } |
| }, |
| "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": "Two batches and head size 32 exercise the narrow-head subgroup-matrix route and the workgroup-z mapping to batch and head." |
| }, |
| "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.1963495408, "cosStep": 0.000383495197 } |
| } |
| }, |
| "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_scalar_all_neg_inf_row_zero_q2_kv32_h8_d64", |
| "provenance": { |
| "notes": "BSH float32 Q/K/V uses eight heads of width 64, two query tokens, and 32 keys. Rank-4 attention bias is broadcast over batch and heads; query row 1 is -Infinity at every key while row 0 is finite. The portable scalar online-attention route must return zero for every head in row 1 without forming NaN from a zero denominator; row 0 follows the ordinary softmax-weighted value calculation." |
| }, |
| "attrs": { "num_heads": 8 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 2, 512], |
| "data": { "kind": "fillFloat32", "scale": 0.25, "sinStep": 0.017, "cosStep": 0.031 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 32, 512], |
| "data": { "kind": "fillFloat32", "scale": 0.25, "sinStep": 0.011, "cosStep": 0.023 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 32, 512], |
| "data": { "kind": "fillFloat32", "scale": 0.25, "sinStep": 0.007, "cosStep": 0.041 } |
| }, |
| "attentionBiasT": { |
| "dtype": "float32", |
| "shape": [1, 1, 2, 32], |
| "data": { |
| "kind": "values", |
| "values": [0.0, 0.193, 0.296, 0.259, 0.1, -0.105, -0.261, -0.295, -0.189, 0.005, 0.197, 0.296, 0.256, 0.096, -0.11, -0.264, -0.294, -0.185, 0.01, 0.201, 0.297, 0.254, 0.091, -0.115, -0.266, -0.293, -0.181, 0.015, 0.205, 0.298, 0.251, 0.086, "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity"] |
| } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 2, 512], "tolerance": 0.00002, "relTolerance": 0.00002 } |
| } |
| }, |
| { |
| "name": "attn_bias_scalar_single_finite_key_q1_kv32_h8_d64", |
| "provenance": { |
| "notes": "Rank-4 bias has one finite entry at key 3 and -Infinity elsewhere. The scalar softmax therefore places all mass on key 3, so every head returns value row 3. This distinguishes a valid one-key denominator from `attn_bias_scalar_all_neg_inf_row_zero_q2_kv32_h8_d64`." |
| }, |
| "attrs": { "num_heads": 8 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 1, 512], |
| "data": { "kind": "fillFloat32", "scale": 0.25, "sinStep": 0.017, "cosStep": 0.031 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 32, 512], |
| "data": { "kind": "fillFloat32", "scale": 0.25, "sinStep": 0.011, "cosStep": 0.023 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 32, 512], |
| "data": { "kind": "fillFloat32", "scale": 0.25, "sinStep": 0.007, "cosStep": 0.041 } |
| }, |
| "attentionBiasT": { |
| "dtype": "float32", |
| "shape": [1, 1, 1, 32], |
| "data": { |
| "kind": "values", |
| "values": ["-Infinity", "-Infinity", "-Infinity", 0.0, "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity", "-Infinity"] |
| } |
| } |
| }, |
| "outputs": { |
| "outputT": { "dtype": "float32", "shape": [1, 1, 512], "tolerance": 0.00001, "relTolerance": 0.00001 } |
| } |
| }, |
| { |
| "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.02454369261, "cosStep": 0.001533980788 } |
| }, |
| "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": "Query length 30 is below the cooperative-cluster threshold while 270 query-head rows clear the flash admission floor. The case exercises one-query-row-per-workgroup flash with and 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 with query length 30 exercises the biased one-query-row flash route below the clustered and split-K thresholds." |
| }, |
| "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 with query length 30 exercises the per-query-row flash route below the tiled-prefill threshold 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": "Values oscillate around 1.0, keeping the attention average at order-one magnitude. This makes both the denominator published by row statistics and the division in the subgroup-matrix apply pass observable." |
| }, |
| "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": "The 16.8 MiB score tensor selects the fused row-statistics route. Values oscillate around 1.0 so a per-tile, combined-denominator, or apply-scale error remains 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 } |
| } |
| }, |
| "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": "A monotone value ramp makes each output an order-one function of the weighted key index. This exposes both uniform scale errors and incorrect exponential offsets in the cross-partition split-K combine." |
| }, |
| "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": "A monotone value ramp keeps float16 decode outputs at order-one magnitude, making split-K accumulation, cross-partition rescaling, and final normalization observable." |
| }, |
| "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": "A monotone value ramp gives each float16 q32 row a distinct order-one output, exposing the register-blocked epilogue division and an incorrect broadcast lane." |
| }, |
| "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 because query-head parallelism already supplies enough work. A value ramp keeps all 16 outputs at order-one magnitude, exposing in-kernel normalization errors." |
| }, |
| "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 } } |
| }, |
| { |
| "name": "small_seq_blocked_bias_causal_1x64x64_h4d16", |
| "provenance": { |
| "notes": "Short-sequence attention with 64 queries, 64 keys, four heads of width 16, fused bias, and causal masking." |
| }, |
| "attrs": { "num_heads": 4, "unidirectional": 1 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 64, 64], |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 64, 64], |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 64, 64], |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41 } |
| }, |
| "biasT": { |
| "dtype": "float32", |
| "shape": [192], |
| "data": { "kind": "fillFloat32", "sinStep": 0.19, "cosStep": 0.13 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 64, 64], "tolerance": 0.00002 } } |
| }, |
| { |
| "name": "small_seq_blocked_no_bias_causal_q13_kv40_h2d16", |
| "provenance": { |
| "notes": "Thirteen queries leave five active rows in the final eight-row block, and the key count is not divisible by sixteen. Causal masking makes out-of-range lanes and inactive rows contribute the identity partial." |
| }, |
| "attrs": { "num_heads": 2, "unidirectional": 1 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 13, 32], |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 40, 32], |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 40, 32], |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 13, 32], "tolerance": 0.00002 } } |
| }, |
| { |
| "name": "small_seq_blocked_bias_bidirectional_q24_kv40_h3d32", |
| "provenance": { |
| "notes": "Head dim 32 (eight vec4 per row, the route's register ceiling) with bias and no causal mask; kv > q so every query sees all forty keys." |
| }, |
| "attrs": { "num_heads": 3, "unidirectional": 0 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 24, 96], |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 40, 96], |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 40, 96], |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41 } |
| }, |
| "biasT": { |
| "dtype": "float32", |
| "shape": [288], |
| "data": { "kind": "fillFloat32", "sinStep": 0.19, "cosStep": 0.13 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 24, 96], "tolerance": 0.00002 } } |
| }, |
| { |
| "name": "small_seq_blocked_no_bias_bidirectional_q3_kv5_h1d8", |
| "provenance": { |
| "notes": "Fewer keys than key lanes (5 keys, 8 lanes after the power-of-two floor) and fewer queries than one block: most lanes hold no key and merge identities." |
| }, |
| "attrs": { "num_heads": 1, "unidirectional": 0 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 3, 8], |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 5, 8], |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 5, 8], |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [1, 3, 8], "tolerance": 0.00002 } } |
| }, |
| { |
| "name": "small_seq_blocked_bias_causal_batch2_q16_kv16_h2d16", |
| "provenance": { |
| "notes": "Two batches of two heads at exactly two query blocks; the batch axis rides dispatch z and the bias is shared across batches." |
| }, |
| "attrs": { "num_heads": 2, "unidirectional": 1 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [2, 16, 32], |
| "data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.31 } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [2, 16, 32], |
| "data": { "kind": "fillFloat32", "sinStep": 0.11, "cosStep": 0.23 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [2, 16, 32], |
| "data": { "kind": "fillFloat32", "sinStep": 0.07, "cosStep": 0.41 } |
| }, |
| "biasT": { |
| "dtype": "float32", |
| "shape": [96], |
| "data": { "kind": "fillFloat32", "sinStep": 0.19, "cosStep": 0.13 } |
| } |
| }, |
| "outputs": { "outputT": { "dtype": "float32", "shape": [2, 16, 32], "tolerance": 0.00002 } } |
| }, |
| { |
| "name": "small_seq_positive_infinity_query", |
| "provenance": { |
| "notes": "The unmasked whole-head route always includes an `exp(0)` term, so a finite row cannot have a zero denominator. A positive-infinity query produces non-finite scores and the expected NaN result." |
| }, |
| "attrs": { "num_heads": 2 }, |
| "inputs": { |
| "queryT": { |
| "dtype": "float32", |
| "shape": [1, 4, 8], |
| "data": { "kind": "cycle", "values": ["Infinity", 0.5, -0.25, 0.75, 0.125, -0.5, 0.25, 1.0] } |
| }, |
| "keyT": { |
| "dtype": "float32", |
| "shape": [1, 4, 8], |
| "data": { "kind": "fillFloat32", "sinStep": 0.011, "cosStep": 0.023, "scale": 0.4 } |
| }, |
| "valueT": { |
| "dtype": "float32", |
| "shape": [1, 4, 8], |
| "data": { "kind": "fillFloat32", "sinStep": 0.007, "cosStep": 0.041, "scale": 0.4 } |
| } |
| }, |
| "outputs": { |
| "outputT": { |
| "dtype": "float32", |
| "shape": [1, 4, 8], |
| "tolerance": 0.00002, |
| "relTolerance": 0.00002, |
| "allowNaN": true |
| } |
| } |
| } |
| ] |
| } |
|
|