@@ -752,13 +752,19 @@ static void ggml_cuda_turbo_prefill_attend(ggml_backend_cuda_context & ctx, ggml
752752 FATTN_VEC_CASE(128 , type_K, type_V) \
753753 FATTN_VEC_CASE(256 , type_K, type_V) \
754754
755+ #define FATTN_VEC_CASES_ALL_D_512 (type_K, type_V ) \
756+ FATTN_VEC_CASE ( 64 , type_K, type_V) \
757+ FATTN_VEC_CASE(128 , type_K, type_V) \
758+ FATTN_VEC_CASE(256 , type_K, type_V) \
759+ FATTN_VEC_CASE(512 , type_K, type_V) \
760+
755761static void ggml_cuda_flash_attn_ext_vec(ggml_backend_cuda_context & ctx, ggml_tensor * dst) {
756762 ggml_tensor * Q = dst->src [0 ];
757763 ggml_tensor * K = dst->src [1 ];
758764 ggml_tensor * V = dst->src [2 ];
759765
760766#ifdef GGML_CUDA_FA_ALL_QUANTS
761- FATTN_VEC_CASES_ALL_D (GGML_TYPE_F16 , GGML_TYPE_F16 )
767+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_F16 , GGML_TYPE_F16 )
762768 FATTN_VEC_CASES_ALL_D (GGML_TYPE_Q4_0 , GGML_TYPE_F16 )
763769 FATTN_VEC_CASES_ALL_D (GGML_TYPE_Q4_1 , GGML_TYPE_F16 )
764770 FATTN_VEC_CASES_ALL_D (GGML_TYPE_Q5_0 , GGML_TYPE_F16 )
@@ -803,7 +809,7 @@ static void ggml_cuda_flash_attn_ext_vec(ggml_backend_cuda_context & ctx, ggml_t
803809 FATTN_VEC_CASES_ALL_D (GGML_TYPE_Q4_1 , GGML_TYPE_Q8_0 )
804810 FATTN_VEC_CASES_ALL_D (GGML_TYPE_Q5_0 , GGML_TYPE_Q8_0 )
805811 FATTN_VEC_CASES_ALL_D (GGML_TYPE_Q5_1 , GGML_TYPE_Q8_0 )
806- FATTN_VEC_CASES_ALL_D (GGML_TYPE_Q8_0 , GGML_TYPE_Q8_0 )
812+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_Q8_0 , GGML_TYPE_Q8_0 )
807813 FATTN_VEC_CASES_ALL_D (GGML_TYPE_BF16 , GGML_TYPE_Q8_0 )
808814
809815 FATTN_VEC_CASES_ALL_D (GGML_TYPE_F16 , GGML_TYPE_BF16 )
@@ -814,49 +820,49 @@ static void ggml_cuda_flash_attn_ext_vec(ggml_backend_cuda_context & ctx, ggml_t
814820 FATTN_VEC_CASES_ALL_D (GGML_TYPE_Q8_0 , GGML_TYPE_BF16 )
815821 FATTN_VEC_CASES_ALL_D (GGML_TYPE_BF16 , GGML_TYPE_BF16 )
816822
817- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO2_0 , GGML_TYPE_TURBO2_0 )
818- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO3_0 , GGML_TYPE_TURBO3_0 )
819- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO4_0 , GGML_TYPE_TURBO4_0 )
820- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO2_0 , GGML_TYPE_Q8_0 )
821- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO3_0 , GGML_TYPE_Q8_0 )
822- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO4_0 , GGML_TYPE_Q8_0 )
823- FATTN_VEC_CASES_ALL_D (GGML_TYPE_Q8_0 , GGML_TYPE_TURBO2_0 )
824- FATTN_VEC_CASES_ALL_D (GGML_TYPE_Q8_0 , GGML_TYPE_TURBO3_0 )
825- FATTN_VEC_CASES_ALL_D (GGML_TYPE_Q8_0 , GGML_TYPE_TURBO4_0 )
826- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO4_0 , GGML_TYPE_TURBO3_0 )
827- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO3_0 , GGML_TYPE_TURBO4_0 )
828- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO2_0 , GGML_TYPE_TURBO3_0 )
829- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO3_0 , GGML_TYPE_TURBO2_0 )
830- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO3_TCQ , GGML_TYPE_TURBO3_TCQ )
831- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO2_TCQ , GGML_TYPE_TURBO2_TCQ )
832- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO3_TCQ , GGML_TYPE_Q8_0 )
833- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO2_TCQ , GGML_TYPE_Q8_0 )
834- FATTN_VEC_CASES_ALL_D (GGML_TYPE_Q8_0 , GGML_TYPE_TURBO3_TCQ )
835- FATTN_VEC_CASES_ALL_D (GGML_TYPE_Q8_0 , GGML_TYPE_TURBO2_TCQ )
823+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO2_0 , GGML_TYPE_TURBO2_0 )
824+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO3_0 , GGML_TYPE_TURBO3_0 )
825+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO4_0 , GGML_TYPE_TURBO4_0 )
826+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO2_0 , GGML_TYPE_Q8_0 )
827+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO3_0 , GGML_TYPE_Q8_0 )
828+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO4_0 , GGML_TYPE_Q8_0 )
829+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_Q8_0 , GGML_TYPE_TURBO2_0 )
830+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_Q8_0 , GGML_TYPE_TURBO3_0 )
831+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_Q8_0 , GGML_TYPE_TURBO4_0 )
832+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO4_0 , GGML_TYPE_TURBO3_0 )
833+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO3_0 , GGML_TYPE_TURBO4_0 )
834+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO2_0 , GGML_TYPE_TURBO3_0 )
835+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO3_0 , GGML_TYPE_TURBO2_0 )
836+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO3_TCQ , GGML_TYPE_TURBO3_TCQ )
837+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO2_TCQ , GGML_TYPE_TURBO2_TCQ )
838+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO3_TCQ , GGML_TYPE_Q8_0 )
839+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO2_TCQ , GGML_TYPE_Q8_0 )
840+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_Q8_0 , GGML_TYPE_TURBO3_TCQ )
841+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_Q8_0 , GGML_TYPE_TURBO2_TCQ )
836842#else
837- FATTN_VEC_CASES_ALL_D (GGML_TYPE_F16 , GGML_TYPE_F16 )
843+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_F16 , GGML_TYPE_F16 )
838844 FATTN_VEC_CASES_ALL_D (GGML_TYPE_Q4_0 , GGML_TYPE_Q4_0 )
839- FATTN_VEC_CASES_ALL_D (GGML_TYPE_Q8_0 , GGML_TYPE_Q8_0 )
845+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_Q8_0 , GGML_TYPE_Q8_0 )
840846 FATTN_VEC_CASES_ALL_D (GGML_TYPE_BF16 , GGML_TYPE_BF16 )
841- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO2_0 , GGML_TYPE_TURBO2_0 )
842- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO3_0 , GGML_TYPE_TURBO3_0 )
843- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO4_0 , GGML_TYPE_TURBO4_0 )
844- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO2_0 , GGML_TYPE_Q8_0 )
845- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO3_0 , GGML_TYPE_Q8_0 )
846- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO4_0 , GGML_TYPE_Q8_0 )
847- FATTN_VEC_CASES_ALL_D (GGML_TYPE_Q8_0 , GGML_TYPE_TURBO2_0 )
848- FATTN_VEC_CASES_ALL_D (GGML_TYPE_Q8_0 , GGML_TYPE_TURBO3_0 )
849- FATTN_VEC_CASES_ALL_D (GGML_TYPE_Q8_0 , GGML_TYPE_TURBO4_0 )
850- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO4_0 , GGML_TYPE_TURBO3_0 )
851- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO3_0 , GGML_TYPE_TURBO4_0 )
852- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO2_0 , GGML_TYPE_TURBO3_0 )
853- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO3_0 , GGML_TYPE_TURBO2_0 )
854- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO3_TCQ , GGML_TYPE_TURBO3_TCQ )
855- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO2_TCQ , GGML_TYPE_TURBO2_TCQ )
856- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO3_TCQ , GGML_TYPE_Q8_0 )
857- FATTN_VEC_CASES_ALL_D (GGML_TYPE_TURBO2_TCQ , GGML_TYPE_Q8_0 )
858- FATTN_VEC_CASES_ALL_D (GGML_TYPE_Q8_0 , GGML_TYPE_TURBO3_TCQ )
859- FATTN_VEC_CASES_ALL_D (GGML_TYPE_Q8_0 , GGML_TYPE_TURBO2_TCQ )
847+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO2_0 , GGML_TYPE_TURBO2_0 )
848+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO3_0 , GGML_TYPE_TURBO3_0 )
849+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO4_0 , GGML_TYPE_TURBO4_0 )
850+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO2_0 , GGML_TYPE_Q8_0 )
851+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO3_0 , GGML_TYPE_Q8_0 )
852+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO4_0 , GGML_TYPE_Q8_0 )
853+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_Q8_0 , GGML_TYPE_TURBO2_0 )
854+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_Q8_0 , GGML_TYPE_TURBO3_0 )
855+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_Q8_0 , GGML_TYPE_TURBO4_0 )
856+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO4_0 , GGML_TYPE_TURBO3_0 )
857+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO3_0 , GGML_TYPE_TURBO4_0 )
858+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO2_0 , GGML_TYPE_TURBO3_0 )
859+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO3_0 , GGML_TYPE_TURBO2_0 )
860+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO3_TCQ , GGML_TYPE_TURBO3_TCQ )
861+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO2_TCQ , GGML_TYPE_TURBO2_TCQ )
862+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO3_TCQ , GGML_TYPE_Q8_0 )
863+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_TURBO2_TCQ , GGML_TYPE_Q8_0 )
864+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_Q8_0 , GGML_TYPE_TURBO3_TCQ )
865+ FATTN_VEC_CASES_ALL_D_512 (GGML_TYPE_Q8_0 , GGML_TYPE_TURBO2_TCQ )
860866#endif // GGML_CUDA_FA_ALL_QUANTS
861867
862868 GGML_ABORT (" fatal error" );
@@ -915,6 +921,7 @@ static best_fattn_kernel ggml_cuda_get_best_fattn_kernel(const int device, const
915921 case 128 :
916922 case 112 :
917923 case 256 :
924+ case 512 :
918925 if (V->ne [0 ] != K->ne [0 ]) {
919926 return BEST_FATTN_KERNEL_NONE ;
920927 }
@@ -973,11 +980,16 @@ static best_fattn_kernel ggml_cuda_get_best_fattn_kernel(const int device, const
973980 K->type == GGML_TYPE_TURBO4_0 || V->type == GGML_TYPE_TURBO4_0 ||
974981 K->type == GGML_TYPE_TURBO3_TCQ || V->type == GGML_TYPE_TURBO3_TCQ ||
975982 K->type == GGML_TYPE_TURBO2_TCQ || V->type == GGML_TYPE_TURBO2_TCQ ) {
976- if (Q->ne [0 ] <= 256 && Q->ne [0 ] % 64 == 0 )
983+ if (Q->ne [0 ] <= 512 && Q->ne [0 ] % 64 == 0 )
977984 return BEST_FATTN_KERNEL_VEC ;
978985 return BEST_FATTN_KERNEL_NONE ;
979986 }
980987
988+ // D=512: MMA/TILE templates don't support this head_dim, use VEC unconditionally
989+ if (Q->ne [0 ] == 512 ) {
990+ return BEST_FATTN_KERNEL_VEC ;
991+ }
992+
981993 const bool can_use_vector_kernel = Q->ne [0 ] <= 256 && Q->ne [0 ] % 64 == 0 && K->ne [1 ] % FATTN_KQ_STRIDE == 0 ;
982994
983995 // If Turing tensor cores are available, use them:
@@ -1100,7 +1112,7 @@ void ggml_cuda_flash_attn_ext(ggml_backend_cuda_context & ctx, ggml_tensor * dst
11001112 }();
11011113 const bool turbo_kv = K->type == GGML_TYPE_TURBO2_0 || K->type == GGML_TYPE_TURBO3_0 || K->type == GGML_TYPE_TURBO4_0 || K->type == GGML_TYPE_TURBO3_TCQ || K->type == GGML_TYPE_TURBO2_TCQ ||
11021114 V->type == GGML_TYPE_TURBO2_0 || V->type == GGML_TYPE_TURBO3_0 || V->type == GGML_TYPE_TURBO4_0 || V->type == GGML_TYPE_TURBO3_TCQ || V->type == GGML_TYPE_TURBO2_TCQ ;
1103- if (turbo_kv && !turbo_prefill_vec && Q->ne [1 ] > 1 && turing_mma_available (ggml_cuda_info ().devices [ggml_cuda_get_device ()].cc )) {
1115+ if (turbo_kv && !turbo_prefill_vec && Q->ne [1 ] > 1 && Q-> ne [ 0 ] <= 256 && turing_mma_available (ggml_cuda_info ().devices [ggml_cuda_get_device ()].cc )) {
11041116 // Prefill path: turbo4 K uses inverse FWHT dequant (original domain, no Q rotation),
11051117 // turbo2/3 K uses simple dequant (rotated domain, Q pre-rotated). V un-rotation at graph level.
11061118 ggml_cuda_turbo_prefill_attend (ctx, dst);
@@ -1154,7 +1166,8 @@ void ggml_cuda_flash_attn_ext(ggml_backend_cuda_context & ctx, ggml_tensor * dst
11541166 // negligible relative to FFN compute (~1% slower native on Qwen3.5-27B, 3090).
11551167 // Set GGML_TURBO_DECODE_NATIVE=1 to force native VEC path (may help bandwidth-limited configs).
11561168 static const bool turbo_decode_native = (getenv (" GGML_TURBO_DECODE_NATIVE" ) != nullptr );
1157- const bool do_decode_dequant = !turbo_decode_native && turbo_kv;
1169+ // Skip dequant for D>256: MMA templates only go up to 256; use native VEC path instead
1170+ const bool do_decode_dequant = !turbo_decode_native && turbo_kv && Q->ne [0 ] <= 256 ;
11581171
11591172 half * k_fp16_dec = nullptr ;
11601173 half * v_fp16_dec = nullptr ;
0 commit comments