|
|
@@ -94,7 +94,7 @@ static __global__ void flash_attn_vec_ext_f16(
|
|
|
for (int i0 = 0; i0 < D/2; i0 += WARP_SIZE) {
|
|
|
const int i = i0 + threadIdx.x;
|
|
|
|
|
|
- const float2 tmp = Q_f2[j*(nb01/sizeof(float2)) + i];
|
|
|
+ const float2 tmp = ncols <= 2 || ic0 + j < ne01 ? Q_f2[j*(nb01/sizeof(float2)) + i] : make_float2(0.0f, 0.0f);
|
|
|
Q_h2[j][i0/WARP_SIZE] = make_half2(scale, scale) * make_half2(tmp.x, tmp.y);
|
|
|
}
|
|
|
}
|
|
|
@@ -212,7 +212,7 @@ static __global__ void flash_attn_vec_ext_f16(
|
|
|
|
|
|
#pragma unroll
|
|
|
for (int j_VKQ = 0; j_VKQ < ncols; ++j_VKQ) {
|
|
|
- if (ic0 + j_VKQ >= ne01) {
|
|
|
+ if (ncols > 2 && ic0 + j_VKQ >= ne01) {
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
@@ -227,7 +227,7 @@ static __global__ void flash_attn_vec_ext_f16(
|
|
|
dst[j_dst*D*gridDim.y + D*blockIdx.y + tid] = dst_val;
|
|
|
}
|
|
|
|
|
|
- if (parallel_blocks != 1 && tid < ncols && ic0 + tid < ne01) {
|
|
|
+ if (parallel_blocks != 1 && tid < ncols && (ncols <= 2 || ic0 + tid < ne01)) {
|
|
|
dst_meta[(ic0 + tid)*gridDim.y*parallel_blocks + blockIdx.y*parallel_blocks + ip] = make_float2(kqmax[tid], kqsum[tid]);
|
|
|
}
|
|
|
#else
|