diff --git a/ggml/src/ggml-cpu/ops.cpp b/ggml/src/ggml-cpu/ops.cpp index 3e377298f..16a916d20 100644 --- a/ggml/src/ggml-cpu/ops.cpp +++ b/ggml/src/ggml-cpu/ops.cpp @@ -6012,11 +6012,10 @@ static void ggml_compute_forward_soft_max_ext_back_f32( // linear runtime, no additional memory float dot_y_dy = 0; - ggml_vec_dot_f32 (nc, &dot_y_dy, 0, y, 0, dy, 0, 1); - ggml_vec_cpy_f32 (nc, dx, dy); - ggml_vec_acc1_f32 (nc, dx, -dot_y_dy); - ggml_vec_mul_f32 (nc, dx, dx, y); - ggml_vec_scale_f32(nc, dx, scale); + ggml_vec_dot_f32(nc, &dot_y_dy, 0, y, 0, dy, 0, 1); + for (int i = 0; i < nc; i++) { + dx[i] = scale * (dy[i] - dot_y_dy) * y[i]; + } #ifndef NDEBUG for (int i = 0; i < nc; ++i) {