| 23338 | raw_row < raw_cap && |
| 23339 | phase == METAL_DECODE_LAYER_FULL && |
| 23340 | getenv("DS4_METAL_DISABLE_PRE_M5_QKV_NORM_KV_STORE_FUSE") == NULL && |
| 23341 | (ds4_gpu_device_is_pre_m5_apple_silicon() || |
| 23342 | ds4_gpu_device_is_m5_apple_silicon()) && |
| 23343 | ds4_gpu_kv_rope_fp8_fuse_available() != 0) { |
| 23344 | { |
| 23345 | /* Fold the kv task into this layer's KV staging kernel |
| 23346 | * (byte-exact); DS4_METAL_DISABLE_KV_NORM_DEFER=1 keeps |
| 23347 | * the standalone two-task dispatch. */ |
| 23348 | static int defer_kv = -1; |
| 23349 | if (defer_kv < 0) defer_kv = getenv("DS4_METAL_DISABLE_KV_NORM_DEFER") == NULL; |
| 23350 | if (defer_kv && g->tp_world == 2) ds4_gpu_dsv4_qkv_norm_defer_kv_next(); |
| 23351 | } |
| 23352 | kv_norm_store_fused = |
| 23353 | ds4_gpu_dsv4_qkv_rms_norm_kv_rope_fp8_store_tensor( |
| 23354 | metal_graph_qr_norm(g), |
| 23355 | metal_graph_qr(g), |
| 23356 | model->map, |
| 23357 | model->size, |
| 23358 | layer->attn_q_a_norm->abs_offset, |
| 23359 | (uint32_t)q_rank, |
| 23360 | metal_graph_kv(g), |
| 23361 | metal_graph_kv_raw(g), |
no test coverage detected