]> git.djapps.eu Git - pkg/ggml/sources/llama.cpp/commitdiff
ggml : optimize rope function to avoid call powf in the tight loop (#807)
authorHoward Su <redacted>
Fri, 14 Apr 2023 06:24:52 +0000 (14:24 +0800)
committerGitHub <redacted>
Fri, 14 Apr 2023 06:24:52 +0000 (09:24 +0300)
ggml.c

diff --git a/ggml.c b/ggml.c
index 42e3ee314424d5f8dada77990a03c79ef24b6c58..e2ebc9e4b58e798d7f55941ae2ab7638fb180877 100644 (file)
--- a/ggml.c
+++ b/ggml.c
@@ -7507,19 +7507,20 @@ static void ggml_compute_forward_rope_f32(
     // row index used to determine which thread to use
     int ir = 0;
 
+    const float theta_scale = powf(10000.0, ((float)-2)/n_dims);
+
     for (int64_t i3 = 0; i3 < ne3; i3++) {
         for (int64_t i2 = (mode == 0 ? 0 : n_past); i2 < ne2; i2++) {
             const int p = (mode == 0 ? n_past + i2 : i2);
             for (int64_t i1 = 0; i1 < ne1; i1++) {
                 if (ir++ < ir0) continue;
                 if (ir   > ir1) break;
-
+                float theta = (float)p;
                 for (int i0 = 0; i0 < n_dims; i0 += 2) {
-                    const float theta = powf(10000.0, ((float)-i0)/n_dims);
-
-                    const float cos_theta = cosf(p*theta);
-                    const float sin_theta = sinf(p*theta);
+                    const float cos_theta = cosf(theta);
+                    const float sin_theta = sinf(theta);
 
+                    theta *= theta_scale;
                     const float * const src = (float *)((char *) src0->data + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0);
                           float * dst_data  = (float *)((char *)  dst->data + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0);
 
@@ -7580,19 +7581,20 @@ static void ggml_compute_forward_rope_f16(
     // row index used to determine which thread to use
     int ir = 0;
 
+    const float theta_scale = powf(10000.0, ((float)-2)/n_dims);
+
     for (int64_t i3 = 0; i3 < ne3; i3++) {
         for (int64_t i2 = (mode == 0 ? 0 : n_past); i2 < ne2; i2++) {
             const int p = (mode == 0 ? n_past + i2 : i2);
             for (int64_t i1 = 0; i1 < ne1; i1++) {
                 if (ir++ < ir0) continue;
                 if (ir   > ir1) break;
-
+                float theta = (float)p;
                 for (int i0 = 0; i0 < n_dims; i0 += 2) {
-                    const float theta = powf(10000.0, ((float)-i0)/n_dims);
-
-                    const float cos_theta = cosf(p*theta);
-                    const float sin_theta = sinf(p*theta);
+                    const float cos_theta = cosf(theta);
+                    const float sin_theta = sinf(theta);
 
+                    theta *= theta_scale;
                     const ggml_fp16_t * const src = (ggml_fp16_t *)((char *) src0->data + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0);
                           ggml_fp16_t * dst_data  = (ggml_fp16_t *)((char *)  dst->data + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0);