From f266648fa9ef20b4332226c6fda14fffb85a3002 Mon Sep 17 00:00:00 2001 From: I3eg1nner <45710049+I3eg1nner@users.noreply.github.com> Date: Wed, 16 Sep 2026 19:19:47 +0800 Subject: [PATCH] spacemit : fix wrong transpose function for int16 data (#25161) The `sizeof(int16_t)` branch in `permute_transpose_impl` calls `rvv_transposed_s32_mn_to_nm` instead of `rvv_transposed_s16_mn_to_nm`. This is a copy-paste bug from the `sizeof(int32_t)` branch above it. The s32 function uses 32-bit segment load/stores (`vssseg8e32.v`) on 16-bit data, reading 2x bytes per element and producing completely wrong transposition results -- 14 out of 16 positions are corrupted for a 4x4 int16 matrix. The correct function `rvv_transposed_s16_mn_to_nm` already exists (line 390) and is used elsewhere in flash attention (line 1488). --- ggml/src/ggml-cpu/spacemit/rvv_kernels.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ggml/src/ggml-cpu/spacemit/rvv_kernels.cpp b/ggml/src/ggml-cpu/spacemit/rvv_kernels.cpp index d2f8974362..13b84dcbe7 100644 --- a/ggml/src/ggml-cpu/spacemit/rvv_kernels.cpp +++ b/ggml/src/ggml-cpu/spacemit/rvv_kernels.cpp @@ -639,7 +639,7 @@ static void permute_transpose_impl(const ggml_tensor * src0, } } else if (n_src_stride == sizeof(int16_t)) { for (int64_t bi = ith; bi < batch; bi += nth) { - rvv_transposed_s32_mn_to_nm((int8_t *) ((char *) dst->data + bi * batch_stride), n_dst_stride, + rvv_transposed_s16_mn_to_nm((int8_t *) ((char *) dst->data + bi * batch_stride), n_dst_stride, (int8_t *) ((char *) src0->data + bi * batch_stride), m_src_stride, m, n); } } else {