48#include <mkl_vml_functions.h>
51#if defined(__AVX__) || defined(__AVX2__) || defined(__AVX512F__)
56#define M_PI 3.14159265358979323846
62typedef struct ggml_tensor *(*ck_ggml_new_tensor_1d_fn)(
struct ggml_context *,
enum ggml_type, int64_t);
63typedef struct ggml_tensor *(*ck_ggml_view_3d_fn)(
struct ggml_context *,
struct ggml_tensor *, int64_t, int64_t, int64_t, size_t, size_t, size_t);
64typedef struct ggml_tensor *(*ck_ggml_rope_multi_inplace_fn)(
struct ggml_context *,
78typedef struct ggml_cgraph *(*ck_ggml_new_graph_fn)(
struct ggml_context *);
81typedef void *(*ck_ggml_get_data_fn)(
const struct ggml_tensor *);
88 static void *libm_handle = NULL;
90 libm_handle = dlopen(
"libm.so.6", RTLD_NOW | RTLD_LOCAL);
114 return fn ? fn(value) : cosf(value);
123 return fn ? fn(value) : sinf(value);
130#if defined(__linux__)
131 static void *libm_handle = NULL;
133 libm_handle = dlopen(
"libm.so.6", RTLD_NOW | RTLD_LOCAL);
140 return fn ? fn(base, exponent) : powf(base, exponent);
145 static int tried = 0;
151 const char *env_dir = getenv(
"CK_GGML_LIB_DIR");
152 const char *dirs[] = {
153 "/opt/app-root/src/Software/llama.cpp/build/bin",
154 "./llama.cpp/build/bin",
155 "llama.cpp/build/bin",
159 if (env_dir && env_dir[0]) {
160 snprintf(path_buf,
sizeof(path_buf),
"%s/libggml-base.so", env_dir);
161 dlopen(path_buf, RTLD_NOW | RTLD_GLOBAL);
162 snprintf(path_buf,
sizeof(path_buf),
"%s/libggml.so", env_dir);
163 dlopen(path_buf, RTLD_NOW | RTLD_GLOBAL);
164 snprintf(path_buf,
sizeof(path_buf),
"%s/libggml-cpu.so", env_dir);
165 void *cpu = dlopen(path_buf, RTLD_NOW | RTLD_GLOBAL);
170 for (
int i = 0; dirs[i] != NULL; ++i) {
171 snprintf(path_buf,
sizeof(path_buf),
"%s/libggml-base.so", dirs[i]);
172 dlopen(path_buf, RTLD_NOW | RTLD_GLOBAL);
173 snprintf(path_buf,
sizeof(path_buf),
"%s/libggml.so", dirs[i]);
174 dlopen(path_buf, RTLD_NOW | RTLD_GLOBAL);
175 snprintf(path_buf,
sizeof(path_buf),
"%s/libggml-cpu.so", dirs[i]);
176 void *cpu = dlopen(path_buf, RTLD_NOW | RTLD_GLOBAL);
276 const float *cos_cache,
277 const float *sin_cache,
281 int aligned_head_dim,
285 const float *cos_cache,
286 const float *sin_cache,
290 int aligned_head_dim,
292 int head_stride_tokens,
296 const float *cos_cache,
297 const float *sin_cache,
302 int aligned_head_dim,
307 const float *cos_cache,
308 const float *sin_cache,
313 int aligned_head_dim,
320 const float *cos_cache,
321 const float *sin_cache,
326 int aligned_head_dim,
346 int half_dim = head_dim / 2;
347 for (
int pos = 0; pos < max_seq_len; ++pos) {
348 for (
int i = 0; i < half_dim; ++i) {
349 const float exponent = ((float)(2 * i)) / (
float)head_dim;
350 const float freq_f = 1.0f / powf(base, exponent);
351 const float angle_f = (float)pos * freq_f;
352 cos_cache[pos * half_dim + i] = cosf(angle_f);
353 sin_cache[pos * half_dim + i] = sinf(angle_f);
390 const char *scaling_type,
391 float scaling_factor)
394 if (rotary_dim <= 0 || rotary_dim > head_dim) {
395 rotary_dim = head_dim;
399 int is_linear_scaling = 0;
400 if (scaling_type != NULL && strcmp(scaling_type,
"linear") == 0 && scaling_factor > 0.0f && scaling_factor != 1.0f) {
401 is_linear_scaling = 1;
404 int rotary_half = rotary_dim / 2;
406 for (
int pos = 0; pos < max_seq_len; ++pos) {
408 float effective_pos = (float)pos;
409 if (is_linear_scaling) {
410 effective_pos = (float)pos / scaling_factor;
413 for (
int i = 0; i < rotary_half; ++i) {
417 const float exponent = ((float)(2 * i)) / (
float)rotary_dim;
418 const float freq_f = 1.0f / powf(base, exponent);
419 float angle_f = effective_pos * freq_f;
420 cos_cache[pos * rotary_half + i] = cosf(angle_f);
421 sin_cache[pos * rotary_half + i] = sinf(angle_f);
429 int original_context)
431 return ((
float)rotary_dim *
432 logf((
float)original_context / (rotations * 2.0f * (
float)
M_PI))) /
433 (2.0f * logf(freq_base));
438 return factor <= 1.0f ? 1.0f : 0.1f * scale * logf(factor) + 1.0f;
445 const int32_t *positions,
450 int original_context,
454 float mscale_all_dim)
456 if ((!cos_f32 && !cos_bf16) || (!sin_f32 && !sin_bf16) ||
457 num_tokens <= 0 || rotary_dim <= 0 || (rotary_dim & 1) != 0 ||
458 freq_base <= 0.0f || factor <= 0.0f || original_context <= 0 ||
459 beta_fast <= 0.0f || beta_slow <= 0.0f) {
463 const int pairs = rotary_dim / 2;
465 beta_fast, rotary_dim, freq_base, original_context));
467 beta_slow, rotary_dim, freq_base, original_context));
468 low = fmaxf(low, 0.0f);
469 high = fminf(high, (
float)(rotary_dim - 1));
470 if (low == high) high += 0.001f;
472 const float attention_factor =
477 const float position = (float)(positions ? positions[
token] :
token);
478 for (
int pair = 0; pair < pairs; ++pair) {
479 const float exponent = (2.0f * (float)pair) / (float)rotary_dim;
481 const float inv_extrap = 1.0f / pos_freq;
482 const float inv_interp = 1.0f / (factor * pos_freq);
483 float ramp = ((float)pair - low) / (high - low);
484 ramp = fminf(1.0f, fmaxf(0.0f, ramp));
485 const float inv_freq = inv_interp * ramp + inv_extrap * (1.0f - ramp);
486 const float angle = position * inv_freq;
489 const size_t index = (size_t)
token * (
size_t)pairs + (size_t)pair;
490 if (cos_f32) cos_f32[index] = cosine;
491 if (sin_f32) sin_f32[index] = sine;
500 const int32_t *positions,
505 int original_context,
509 float mscale_all_dim)
512 cos_cache, sin_cache, NULL, NULL, positions, num_tokens, rotary_dim,
513 freq_base, factor, original_context, beta_fast, beta_slow, mscale,
523 int original_context,
527 float mscale_all_dim)
530 cos_cache, sin_cache, NULL, NULL, NULL, num_tokens, rotary_dim,
531 freq_base, factor, original_context, beta_fast, beta_slow, mscale,
537 const int32_t *positions,
542 int original_context,
546 float mscale_all_dim)
549 NULL, NULL, cos_cache, sin_cache, positions, num_tokens, rotary_dim,
550 freq_base, factor, original_context, beta_fast, beta_slow, mscale,
566 const char *scaling_type,
567 float scaling_factor)
569 if (!cos_cache || !sin_cache || max_seq_len <= 0 || head_dim <= 0) {
572 if (rotary_dim <= 0 || rotary_dim > head_dim) {
573 rotary_dim = head_dim;
579 const int linear_scaling =
580 scaling_type != NULL &&
581 strcmp(scaling_type,
"linear") == 0 &&
582 scaling_factor > 0.0f &&
583 scaling_factor != 1.0f;
584 const int rotary_half = rotary_dim / 2;
585 const float theta_scale =
588 for (
int pos = 0; pos < max_seq_len; ++pos) {
589 float theta = (float)pos;
590 if (linear_scaling) {
591 theta /= scaling_factor;
593 for (
int i = 0; i < rotary_half; ++i) {
594 cos_cache[(size_t)pos * (
size_t)rotary_half + (size_t)i] =
596 sin_cache[(size_t)pos * (
size_t)rotary_half + (size_t)i] =
598 theta *= theta_scale;
609 const float *cos_cache,
610 const float *sin_cache,
613 int aligned_head_dim,
618 if (rotary_dim <= 0 || rotary_dim > head_dim) {
619 rotary_dim = head_dim;
622 int rotary_half = rotary_dim / 2;
624 for (
int t = 0; t < num_tokens; ++t) {
625 int pos = pos_offset + t;
626 const float *cos_row = cos_cache + pos * rotary_half;
627 const float *sin_row = sin_cache + pos * rotary_half;
628 float *x_row = x + (size_t)t * (
size_t)aligned_head_dim;
630#if defined(__AVX512F__)
633 for (; i + 16 <= rotary_half; i += 16) {
634 __m512 x0 = _mm512_loadu_ps(&x_row[i]);
635 __m512 x1 = _mm512_loadu_ps(&x_row[i + rotary_half]);
636 __m512 c = _mm512_loadu_ps(&cos_row[i]);
637 __m512 s = _mm512_loadu_ps(&sin_row[i]);
640 __m512 r0 = _mm512_fmsub_ps(x0, c, _mm512_mul_ps(x1, s));
642 __m512 r1 = _mm512_fmadd_ps(x0, s, _mm512_mul_ps(x1, c));
644 _mm512_storeu_ps(&x_row[i], r0);
645 _mm512_storeu_ps(&x_row[i + rotary_half], r1);
648 for (; i < rotary_half; ++i) {
650 float x1 = x_row[i + rotary_half];
651 float c = cos_row[i];
652 float s = sin_row[i];
653 x_row[i] = x0 * c - x1 * s;
654 x_row[i + rotary_half] = x0 * s + x1 * c;
657#elif defined(__AVX__)
660 for (; i + 8 <= rotary_half; i += 8) {
661 __m256 x0 = _mm256_loadu_ps(&x_row[i]);
662 __m256 x1 = _mm256_loadu_ps(&x_row[i + rotary_half]);
663 __m256 c = _mm256_loadu_ps(&cos_row[i]);
664 __m256 s = _mm256_loadu_ps(&sin_row[i]);
667 __m256 x0c = _mm256_mul_ps(x0, c);
668 __m256 x1s = _mm256_mul_ps(x1, s);
669 __m256 r0 = _mm256_sub_ps(x0c, x1s);
672 __m256 x0s = _mm256_mul_ps(x0, s);
673 __m256 x1c = _mm256_mul_ps(x1, c);
674 __m256 r1 = _mm256_add_ps(x0s, x1c);
676 _mm256_storeu_ps(&x_row[i], r0);
677 _mm256_storeu_ps(&x_row[i + rotary_half], r1);
680 for (; i < rotary_half; ++i) {
682 float x1 = x_row[i + rotary_half];
683 float c = cos_row[i];
684 float s = sin_row[i];
685 x_row[i] = x0 * c - x1 * s;
686 x_row[i + rotary_half] = x0 * s + x1 * c;
691 for (
int i = 0; i < rotary_half; ++i) {
693 float x1 = x_row[i + rotary_half];
694 float c = cos_row[i];
695 float s = sin_row[i];
697 x_row[i] = x0 * c - x1 * s;
698 x_row[i + rotary_half] = x0 * s + x1 * c;
708 const float *cos_cache,
709 const float *sin_cache,
712 int aligned_head_dim,
716 if (rotary_dim <= 0 || rotary_dim > head_dim) {
717 rotary_dim = head_dim;
720 int rotary_half = rotary_dim / 2;
722 for (
int t = 0; t < num_tokens; ++t) {
723 int pos = pos_offset + t;
724 const float *cos_row = cos_cache + pos * rotary_half;
725 const float *sin_row = sin_cache + pos * rotary_half;
726 float *x_row = x + (size_t)t * (
size_t)aligned_head_dim;
728 for (
int i = 0; i < rotary_half; ++i) {
729 const int idx0 = 2 * i;
730 const int idx1 = idx0 + 1;
731 float x0 = x_row[idx0];
732 float x1 = x_row[idx1];
733 float c = cos_row[i];
734 float s = sin_row[i];
735 x_row[idx0] = x0 * c - x1 * s;
736 x_row[idx1] = x0 * s + x1 * c;
743 const float *cos_cache,
744 const float *sin_cache,
747 int aligned_head_dim,
751 if (rotary_dim <= 0 || rotary_dim > head_dim) {
752 rotary_dim = head_dim;
755 int rotary_even = rotary_dim - (rotary_dim % 2);
756 int rotary_half = rotary_even / 2;
758 for (
int t = 0; t < num_tokens; ++t) {
759 int pos = pos_offset + t;
760 const float *cos_row = cos_cache + pos * rotary_half;
761 const float *sin_row = sin_cache + pos * rotary_half;
762 const float *d_out_row = d_out + (size_t)t * (
size_t)aligned_head_dim;
763 float *d_x_row = d_x + (size_t)t * (
size_t)aligned_head_dim;
765 for (
int i = 0; i < rotary_half; ++i) {
766 const int idx0 = 2 * i;
767 const int idx1 = idx0 + 1;
768 float d0 = d_out_row[idx0];
769 float d1 = d_out_row[idx1];
770 float c = cos_row[i];
771 float s = sin_row[i];
772 d_x_row[idx0] = d0 * c + d1 * s;
773 d_x_row[idx1] = -d0 * s + d1 * c;
776 for (
int i = rotary_even; i < head_dim; ++i) {
777 d_x_row[i] = d_out_row[i];
779 for (
int i = head_dim; i < aligned_head_dim; ++i) {
797 const float *cos_cache,
798 const float *sin_cache,
802 int aligned_head_dim,
806 head_dim, aligned_head_dim, pos_offset, head_dim);
810 const float *cos_cache,
811 const float *sin_cache,
815 int aligned_head_dim,
819 size_t head_stride = (size_t)num_tokens * (
size_t)aligned_head_dim;
821 for (
int h = 0; h < num_heads; ++h) {
823 cos_cache, sin_cache,
824 num_tokens, head_dim, aligned_head_dim, pos_offset, rotary_dim);
838 const float *cos_cache,
839 const float *sin_cache,
843 int aligned_head_dim,
845 int head_stride_tokens)
848 head_dim, aligned_head_dim, pos_offset,
849 head_stride_tokens, head_dim);
853 const float *cos_cache,
854 const float *sin_cache,
858 int aligned_head_dim,
860 int head_stride_tokens,
863 size_t head_stride = (size_t)head_stride_tokens * (
size_t)aligned_head_dim;
865 for (
int h = 0; h < num_heads; ++h) {
867 cos_cache, sin_cache,
868 num_tokens, head_dim, aligned_head_dim, pos_offset, rotary_dim);
886 const float *cos_cache,
887 const float *sin_cache,
891 int aligned_head_dim,
894 size_t head_stride = (size_t)num_tokens * (
size_t)aligned_head_dim;
895 int half_dim = head_dim / 2;
897 for (
int h = 0; h < num_heads; ++h) {
898 for (
int t = 0; t < num_tokens; ++t) {
899 int pos = pos_offset + t;
900 const float *cos_row = cos_cache + pos * half_dim;
901 const float *sin_row = sin_cache + pos * half_dim;
903 size_t idx = h * head_stride + (size_t)t * (
size_t)aligned_head_dim;
904 const float *d_out_row = d_out + idx;
905 float *d_x_row = d_x + idx;
907#if defined(__AVX512F__)
909 for (; i + 16 <= half_dim; i += 16) {
910 __m512 d0 = _mm512_loadu_ps(&d_out_row[i]);
911 __m512 d1 = _mm512_loadu_ps(&d_out_row[i + half_dim]);
912 __m512 c = _mm512_loadu_ps(&cos_row[i]);
913 __m512 s = _mm512_loadu_ps(&sin_row[i]);
916 __m512 r0 = _mm512_fmadd_ps(d0, c, _mm512_mul_ps(d1, s));
918 __m512 r1 = _mm512_fmsub_ps(d1, c, _mm512_mul_ps(d0, s));
920 _mm512_storeu_ps(&d_x_row[i], r0);
921 _mm512_storeu_ps(&d_x_row[i + half_dim], r1);
923 for (; i < half_dim; ++i) {
924 float d0 = d_out_row[i];
925 float d1 = d_out_row[i + half_dim];
926 float c = cos_row[i];
927 float s = sin_row[i];
928 d_x_row[i] = d0 * c + d1 * s;
929 d_x_row[i + half_dim] = -d0 * s + d1 * c;
932#elif defined(__AVX__)
934 for (; i + 8 <= half_dim; i += 8) {
935 __m256 d0 = _mm256_loadu_ps(&d_out_row[i]);
936 __m256 d1 = _mm256_loadu_ps(&d_out_row[i + half_dim]);
937 __m256 c = _mm256_loadu_ps(&cos_row[i]);
938 __m256 s = _mm256_loadu_ps(&sin_row[i]);
941 __m256 d0c = _mm256_mul_ps(d0, c);
942 __m256 d1s = _mm256_mul_ps(d1, s);
943 __m256 r0 = _mm256_add_ps(d0c, d1s);
946 __m256 d1c = _mm256_mul_ps(d1, c);
947 __m256 d0s = _mm256_mul_ps(d0, s);
948 __m256 r1 = _mm256_sub_ps(d1c, d0s);
950 _mm256_storeu_ps(&d_x_row[i], r0);
951 _mm256_storeu_ps(&d_x_row[i + half_dim], r1);
953 for (; i < half_dim; ++i) {
954 float d0 = d_out_row[i];
955 float d1 = d_out_row[i + half_dim];
956 float c = cos_row[i];
957 float s = sin_row[i];
958 d_x_row[i] = d0 * c + d1 * s;
959 d_x_row[i + half_dim] = -d0 * s + d1 * c;
963 for (
int i = 0; i < half_dim; ++i) {
964 float d0 = d_out_row[i];
965 float d1 = d_out_row[i + half_dim];
966 float c = cos_row[i];
967 float s = sin_row[i];
970 d_x_row[i] = d0 * c + d1 * s;
971 d_x_row[i + half_dim] = -d0 * s + d1 * c;
975 for (
int i = head_dim; i < aligned_head_dim; ++i) {
992 const float *cos_cache,
993 const float *sin_cache,
997 int aligned_head_dim,
1000 size_t head_stride = (size_t)num_tokens * (
size_t)aligned_head_dim;
1001 int half_dim = head_dim / 2;
1003 for (
int h = 0; h < num_heads; ++h) {
1004 for (
int t = 0; t < num_tokens; ++t) {
1005 int pos = pos_offset + t;
1006 const float *cos_row = cos_cache + pos * half_dim;
1007 const float *sin_row = sin_cache + pos * half_dim;
1009 float *d_row = d_x + h * head_stride + (size_t)t * (
size_t)aligned_head_dim;
1011#if defined(__AVX512F__)
1013 for (; i + 16 <= half_dim; i += 16) {
1014 __m512 d0 = _mm512_loadu_ps(&d_row[i]);
1015 __m512 d1 = _mm512_loadu_ps(&d_row[i + half_dim]);
1016 __m512 c = _mm512_loadu_ps(&cos_row[i]);
1017 __m512 s = _mm512_loadu_ps(&sin_row[i]);
1019 __m512 r0 = _mm512_fmadd_ps(d0, c, _mm512_mul_ps(d1, s));
1020 __m512 r1 = _mm512_fmsub_ps(d1, c, _mm512_mul_ps(d0, s));
1022 _mm512_storeu_ps(&d_row[i], r0);
1023 _mm512_storeu_ps(&d_row[i + half_dim], r1);
1025 for (; i < half_dim; ++i) {
1026 float d0 = d_row[i];
1027 float d1 = d_row[i + half_dim];
1028 float c = cos_row[i];
1029 float s = sin_row[i];
1030 d_row[i] = d0 * c + d1 * s;
1031 d_row[i + half_dim] = -d0 * s + d1 * c;
1034#elif defined(__AVX__)
1036 for (; i + 8 <= half_dim; i += 8) {
1037 __m256 d0 = _mm256_loadu_ps(&d_row[i]);
1038 __m256 d1 = _mm256_loadu_ps(&d_row[i + half_dim]);
1039 __m256 c = _mm256_loadu_ps(&cos_row[i]);
1040 __m256 s = _mm256_loadu_ps(&sin_row[i]);
1042 __m256 d0c = _mm256_mul_ps(d0, c);
1043 __m256 d1s = _mm256_mul_ps(d1, s);
1044 __m256 r0 = _mm256_add_ps(d0c, d1s);
1046 __m256 d1c = _mm256_mul_ps(d1, c);
1047 __m256 d0s = _mm256_mul_ps(d0, s);
1048 __m256 r1 = _mm256_sub_ps(d1c, d0s);
1050 _mm256_storeu_ps(&d_row[i], r0);
1051 _mm256_storeu_ps(&d_row[i + half_dim], r1);
1053 for (; i < half_dim; ++i) {
1054 float d0 = d_row[i];
1055 float d1 = d_row[i + half_dim];
1056 float c = cos_row[i];
1057 float s = sin_row[i];
1058 d_row[i] = d0 * c + d1 * s;
1059 d_row[i + half_dim] = -d0 * s + d1 * c;
1063 for (
int i = 0; i < half_dim; ++i) {
1064 float d0 = d_row[i];
1065 float d1 = d_row[i + half_dim];
1066 float c = cos_row[i];
1067 float s = sin_row[i];
1070 d_row[i] = d0 * c + d1 * s;
1071 d_row[i + half_dim] = -d0 * s + d1 * c;
1075 for (
int i = head_dim; i < aligned_head_dim; ++i) {
1096 const float *cos_cache,
1097 const float *sin_cache,
1102 int aligned_head_dim,
1106 num_tokens, head_dim, aligned_head_dim, pos_offset, head_dim);
1111 const float *cos_cache,
1112 const float *sin_cache,
1117 int aligned_head_dim,
1122 head_dim, aligned_head_dim, pos_offset, rotary_dim);
1124 head_dim, aligned_head_dim, pos_offset, rotary_dim);
1129 const float *freq_factors,
1130 int use_freq_factors,
1134 int aligned_head_dim,
1139 if (!x || num_heads <= 0 || num_tokens <= 0 || head_dim <= 0 || aligned_head_dim <= 0) {
1142 if (rotary_dim <= 0 || rotary_dim > head_dim) {
1143 rotary_dim = head_dim;
1145 if (freq_base <= 0.0f) {
1146 freq_base = 10000.0f;
1155 const int rotary_half = rotary_dim / 2;
1156 const size_t head_stride = (size_t)num_tokens * (
size_t)aligned_head_dim;
1157 const float theta_scale = powf(freq_base, -2.0f / (
float)rotary_dim);
1159 for (
int h = 0; h < num_heads; ++h) {
1160 float *head = x + (size_t)h * head_stride;
1161 for (
int t = 0; t < num_tokens; ++t) {
1162 const float pos = (float)(pos_offset + t);
1163 float *x_row = head + (size_t)t * (
size_t)aligned_head_dim;
1164 for (
int i = 0; i < rotary_half; ++i) {
1166 const int idx1 = i + rotary_half;
1167 const float ff = (use_freq_factors && freq_factors) ? freq_factors[i] : 1.0f;
1168 const float theta = pos * powf(theta_scale, (
float)i) / ff;
1169 const float c = cosf(theta);
1170 const float sv = sinf(theta);
1171 const float x0 = x_row[idx0];
1172 const float x1 = x_row[idx1];
1173 x_row[idx0] = x0 * c - x1 * sv;
1174 x_row[idx1] = x1 * c + x0 * sv;
1182 const float *freq_factors,
1183 int use_freq_factors,
1188 int aligned_head_dim,
1194 num_heads, num_tokens, head_dim, aligned_head_dim,
1195 pos_offset, rotary_dim, freq_base);
1197 num_kv_heads, num_tokens, head_dim, aligned_head_dim,
1198 pos_offset, rotary_dim, freq_base);
1206 int aligned_head_dim,
1211 if (!x || heads <= 0 || tokens <= 0 || head_dim <= 0 ||
1212 aligned_head_dim < head_dim) {
1215 if (rotary_dim <= 0 || rotary_dim > head_dim) rotary_dim = head_dim;
1216 if (freq_base <= 0.0f) freq_base = 10000.0f;
1218 const int half = rotary_dim / 2;
1219 const size_t head_stride = (size_t)tokens * (
size_t)aligned_head_dim;
1221 const float position = (float)(pos_offset +
token);
1222 for (
int index = 0; index < half; ++index) {
1223 const float exponent = (float)(2 * index) / (float)rotary_dim;
1224 const float inv_freq = 1.0f / powf(freq_base, exponent);
1225 const float angle = position * inv_freq;
1228 for (
int head = 0; head < heads; ++head) {
1229 float *row = x + (size_t)head * head_stride +
1230 (
size_t)
token * (size_t)aligned_head_dim;
1233 const float first_cos =
1235 const float second_sin =
1237 const float second_cos =
1239 const float first_sin =
1253 const float *freq_factors,
1254 int use_freq_factors,
1259 int aligned_head_dim,
1265 (void)use_freq_factors;
1267 q, num_heads, num_tokens, head_dim, aligned_head_dim,
1268 pos_offset, rotary_dim, freq_base);
1270 k, num_kv_heads, num_tokens, head_dim, aligned_head_dim,
1271 pos_offset, rotary_dim, freq_base);
1277 const float *freq_factors,
1278 int use_freq_factors,
1283 int aligned_head_dim,
1290 if ((!q && !k) || num_tokens <= 0 || head_dim <= 0 ||
1291 aligned_head_dim <= 0 || token_begin < 0 ||
1292 token_begin >= token_end || token_end > num_tokens) {
1295 if (rotary_dim <= 0 || rotary_dim > head_dim) {
1296 rotary_dim = head_dim;
1298 if (freq_base <= 0.0f) {
1299 freq_base = 10000.0f;
1302 const int rotary_half = rotary_dim / 2;
1303 const size_t head_stride =
1304 (size_t)num_tokens * (
size_t)aligned_head_dim;
1305 const float theta_scale = powf(freq_base, -2.0f / (
float)rotary_dim);
1307 for (
int t = token_begin; t < token_end; ++t) {
1308 const float pos = (float)(pos_offset + t);
1309 for (
int i = 0; i < rotary_half; ++i) {
1311 const int idx1 = i + rotary_half;
1313 (use_freq_factors && freq_factors) ? freq_factors[i] : 1.0f;
1314 const float theta = pos * powf(theta_scale, (
float)i) / ff;
1315 const float c = cosf(theta);
1316 const float sv = sinf(theta);
1318 for (
int h = 0; q && h < num_heads; ++h) {
1319 float *row = q + (size_t)h * head_stride +
1320 (
size_t)t * (size_t)aligned_head_dim;
1321 const float x0 = row[idx0];
1322 const float x1 = row[idx1];
1323 row[idx0] = x0 * c - x1 * sv;
1324 row[idx1] = x1 * c + x0 * sv;
1326 for (
int h = 0; k && h < num_kv_heads; ++h) {
1327 float *row = k + (size_t)h * head_stride +
1328 (
size_t)t * (size_t)aligned_head_dim;
1329 const float x0 = row[idx0];
1330 const float x1 = row[idx1];
1331 row[idx0] = x0 * c - x1 * sv;
1332 row[idx1] = x1 * c + x0 * sv;
1339 float *q,
float *k,
const float *freq_factors,
int use_freq_factors,
1340 int num_heads,
int num_kv_heads,
int num_tokens,
int head_dim,
1341 int aligned_head_dim,
int pos_offset,
int rotary_dim,
float freq_base,
1342 int token_begin,
int token_end)
1344 if ((!q && !k) || num_tokens <= 0 || head_dim <= 0 ||
1345 aligned_head_dim < head_dim || token_begin < 0 ||
1346 token_begin >= token_end || token_end > num_tokens)
return;
1347 if (rotary_dim <= 0 || rotary_dim > head_dim) rotary_dim = head_dim;
1348 if (freq_base <= 0.0f) freq_base = 10000.0f;
1349 const int half = rotary_dim / 2;
1350 const size_t stride = (size_t)num_tokens * aligned_head_dim;
1352 for (
int t = token_begin; t < token_end; ++t) {
1354 volatile float theta = (float)(pos_offset + t);
1355 for (
int i = 0; i < half; ++i) {
1356 const float ff = use_freq_factors && freq_factors ? freq_factors[i] : 1.0f;
1357 const float angle = theta / ff;
1360 for (
int h = 0; h < num_heads + num_kv_heads; ++h) {
1361 float *base = h < num_heads ? q : k;
1362 if (!base)
continue;
1363 const int head = h < num_heads ? h : h - num_heads;
1364 float *row = base + (size_t)head * stride + (
size_t)t * aligned_head_dim;
1365 const float x0 = row[i], x1 = row[i + half];
1366 row[i] = fmaf(x0, c, -(x1 * s));
1367 row[i + half] = fmaf(x0, s, x1 * c);
1375 const float *freq_factors,
1376 int use_freq_factors,
1380 int aligned_head_dim,
1386 num_heads, num_tokens, head_dim, aligned_head_dim,
1387 pos_offset, rotary_dim, freq_base);
1391 const float *freq_factors,
1392 int use_freq_factors,
1396 int aligned_head_dim,
1402 q, NULL, freq_factors, use_freq_factors,
1403 num_heads, 0, num_tokens, head_dim, aligned_head_dim,
1404 pos_offset, rotary_dim, freq_base, 0, num_tokens);
1409 const float *freq_factors,
1410 int use_freq_factors,
1415 int aligned_head_dim,
1421 num_heads, num_kv_heads, num_tokens,
1422 head_dim, aligned_head_dim, pos_offset,
1423 rotary_dim, freq_base);
1431 int aligned_head_dim,
1436 if (!x || num_heads <= 0 || num_tokens <= 0 || head_dim <= 0 || aligned_head_dim <= 0) {
1440 grid_w = num_tokens;
1442 if (rotary_dim <= 0 || rotary_dim > head_dim) {
1443 rotary_dim = head_dim;
1445 if (freq_base <= 0.0f) {
1453 const int half_span = rotary_dim / 2;
1454 const int segment_half = half_span / 2;
1455 if (segment_half <= 0) {
1458 const size_t head_stride = (size_t)num_tokens * (
size_t)aligned_head_dim;
1459 const float theta_scale = powf(freq_base, -2.0f / (
float)half_span);
1461 for (
int h = 0; h < num_heads; ++h) {
1462 float *head = x + (size_t)h * head_stride;
1463 for (
int t = 0; t < num_tokens; ++t) {
1464 const int pos_x = t % grid_w;
1465 const int pos_y = t / grid_w;
1466 float *row = head + (size_t)t * (
size_t)aligned_head_dim;
1467 for (
int i = 0; i < segment_half; ++i) {
1468 const float inv_freq = powf(theta_scale, (
float)i);
1470 const float theta_x = (float)pos_x * inv_freq;
1471 const float cx = cosf(theta_x);
1472 const float sx = sinf(theta_x);
1474 const int x1i = i + segment_half;
1475 const float x0 = row[x0i];
1476 const float x1 = row[x1i];
1477 row[x0i] = x0 * cx - x1 * sx;
1478 row[x1i] = x1 * cx + x0 * sx;
1480 const float theta_y = (float)pos_y * inv_freq;
1481 const float cy = cosf(theta_y);
1482 const float sy = sinf(theta_y);
1483 const int y0i = half_span + i;
1484 const int y1i = half_span + i + segment_half;
1485 const float y0 = row[y0i];
1486 const float y1 = row[y1i];
1487 row[y0i] = y0 * cy - y1 * sy;
1488 row[y1i] = y1 * cy + y0 * sy;
1500 int aligned_head_dim,
1511 const float *cos_cache,
1512 const float *sin_cache,
1517 int aligned_head_dim,
1520 int cache_rotary_dim)
1522 if (rotary_dim <= 0 || rotary_dim > head_dim) {
1523 rotary_dim = head_dim;
1525 if (cache_rotary_dim < rotary_dim) {
1526 cache_rotary_dim = rotary_dim;
1528 const int rotary_half = rotary_dim / 2;
1529 const int cache_half = cache_rotary_dim / 2;
1530 const size_t head_stride = (size_t)num_tokens * (
size_t)aligned_head_dim;
1532 for (
int h = 0; h < num_heads; ++h) {
1533 float *head = q + (size_t)h * head_stride;
1534 for (
int t = 0; t < num_tokens; ++t) {
1535 const int pos = pos_offset + t;
1536 const float *cos_row = cos_cache + (size_t)pos * (
size_t)cache_half;
1537 const float *sin_row = sin_cache + (size_t)pos * (
size_t)cache_half;
1538 float *x_row = head + (size_t)t * (
size_t)aligned_head_dim;
1539 for (
int i = 0; i < rotary_half; ++i) {
1540 const int idx0 = 2 * i;
1541 const int idx1 = idx0 + 1;
1542 const float x0 = x_row[idx0];
1543 const float x1 = x_row[idx1];
1544 const float c = cos_row[i];
1545 const float sv = sin_row[i];
1546 x_row[idx0] = x0 * c - x1 * sv;
1547 x_row[idx1] = x0 * sv + x1 * c;
1552 for (
int h = 0; h < num_kv_heads; ++h) {
1553 float *head = k + (size_t)h * head_stride;
1554 for (
int t = 0; t < num_tokens; ++t) {
1555 const int pos = pos_offset + t;
1556 const float *cos_row = cos_cache + (size_t)pos * (
size_t)cache_half;
1557 const float *sin_row = sin_cache + (size_t)pos * (
size_t)cache_half;
1558 float *x_row = head + (size_t)t * (
size_t)aligned_head_dim;
1559 for (
int i = 0; i < rotary_half; ++i) {
1560 const int idx0 = 2 * i;
1561 const int idx1 = idx0 + 1;
1562 const float x0 = x_row[idx0];
1563 const float x1 = x_row[idx1];
1564 const float c = cos_row[i];
1565 const float sv = sin_row[i];
1566 x_row[idx0] = x0 * c - x1 * sv;
1567 x_row[idx1] = x0 * sv + x1 * c;
1575 const float *cos_cache,
1576 const float *sin_cache,
1581 int aligned_head_dim,
1585 size_t q_head_stride = (size_t)num_tokens * (
size_t)aligned_head_dim;
1586 size_t k_head_stride = (size_t)num_tokens * (
size_t)aligned_head_dim;
1588 for (
int h = 0; h < num_heads; ++h) {
1590 cos_cache, sin_cache,
1591 num_tokens, head_dim, aligned_head_dim, pos_offset, rotary_dim);
1594 for (
int h = 0; h < num_kv_heads; ++h) {
1596 cos_cache, sin_cache,
1597 num_tokens, head_dim, aligned_head_dim, pos_offset, rotary_dim);
1606#if defined(__GNUC__) || defined(__clang__)
1610 const float *cos_row,
1611 const float *sin_row,
1613 int aligned_head_dim,
1616 for (
int head = 0; head < num_heads; ++head) {
1617 float *row = rows + (size_t)head * (
size_t)aligned_head_dim;
1618 for (
int i = 0; i < rotary_dim; i += 2) {
1619 const int pair = i / 2;
1620 const float x0 = row[i];
1621 const float x1 = row[i + 1];
1622 const float cosine = cos_row[pair];
1623 const float sine = sin_row[pair];
1624 row[i] = fmaf(x0, cosine, -x1 * sine);
1625 row[i + 1] = fmaf(x0, sine, x1 * cosine);
1632 const float *cos_cache,
1633 const float *sin_cache,
1638 int aligned_head_dim,
1642 if (!q || !k || !cos_cache || !sin_cache || num_tokens <= 0) {
1645 if (rotary_dim <= 0 || rotary_dim > head_dim) {
1646 rotary_dim = head_dim;
1648 const int cache_half = rotary_dim / 2;
1649 const size_t head_stride =
1650 (size_t)num_tokens * (
size_t)aligned_head_dim;
1651 if (num_tokens == 1) {
1652 const float *cos_row =
1653 cos_cache + (size_t)pos_offset * (
size_t)cache_half;
1654 const float *sin_row =
1655 sin_cache + (size_t)pos_offset * (
size_t)cache_half;
1657 q, cos_row, sin_row, num_heads, aligned_head_dim, rotary_dim);
1659 k, cos_row, sin_row, num_kv_heads, aligned_head_dim, rotary_dim);
1663 const int pos = pos_offset +
token;
1664 const float *cos_row =
1665 cos_cache + (size_t)pos * (
size_t)cache_half;
1666 const float *sin_row =
1667 sin_cache + (size_t)pos * (
size_t)cache_half;
1668 for (
int head = 0; head < num_heads; ++head) {
1670 q + (
size_t)head * head_stride
1671 + (
size_t)
token * (
size_t)aligned_head_dim,
1678 for (
int head = 0; head < num_kv_heads; ++head) {
1680 k + (
size_t)head * head_stride
1681 + (
size_t)
token * (
size_t)aligned_head_dim,
1692 return n_dims * logf((
float) n_ctx_orig / (n_rot * 2.0f * (
float)
M_PI)) / (2.0f * logf(base));
1706 dims[1] =
end > (float) (n_dims - 1) ? (float) (n_dims - 1) :
end;
1710 const float y = ((float) chan - low) / fmaxf(0.001f, high - low);
1711 return 1.0f - fminf(1.0f, fmaxf(0.0f, y));
1717 const float corr_dims[2],
1724 float theta_interp = freq_scale * theta_extrap;
1725 float theta = theta_interp;
1726 float mscale = attn_factor;
1728 if (ext_factor != 0.0f) {
1730 theta = theta_interp * (1.0f - ramp_mix) + theta_extrap * ramp_mix;
1731 mscale *= 1.0f + 0.1f * logf(1.0f / fmaxf(freq_scale, 1e-6f));
1741 const float corr_dims[2],
1748 float theta_interp = freq_scale * theta_extrap;
1749 float theta = theta_interp;
1750 float mscale = attn_factor;
1752 if (ext_factor != 0.0f) {
1753 const float ramp_mix =
1755 theta = theta_interp * (1.0f - ramp_mix) + theta_extrap * ramp_mix;
1756 mscale *= 1.0f + 0.1f * logf(1.0f / fmaxf(freq_scale, 1e-6f));
1771 const float x1_sin = x1 * sin_theta;
1772 const float x1_cos = x1 * cos_theta;
1773 *out0 = fmaf(x0, cos_theta, -x1_sin);
1774 *out1 = fmaf(x0, sin_theta, x1_cos);
1779 const int32_t *positions,
1782 int aligned_head_dim,
1784 const int sections[4],
1793 if (!x || !positions || num_tokens <= 0 || head_dim <= 0 || aligned_head_dim < head_dim || n_dims <= 0) {
1797 int rotary_width = n_dims;
1798 if (rotary_width > head_dim) {
1799 rotary_width = head_dim;
1801 if (rotary_width <= 0 || (rotary_width & 1) != 0 || rotary_width > aligned_head_dim) {
1804 const int rope_pairs = rotary_width / 2;
1806 const int axis_y_pairs = sections[0];
1807 const int axis_x_pairs = sections[1];
1808 if (axis_y_pairs <= 0 || axis_x_pairs <= 0 || axis_y_pairs + axis_x_pairs > rope_pairs) {
1812 const int num_pos = num_tokens;
1814 float corr_dims[2] = {0.0f, (float) (rope_pairs - 1)};
1817 for (
int tok = 0; tok < num_tokens; ++tok) {
1818 float theta_y = (float) positions[tok];
1819 float theta_x = (float) positions[tok + num_pos];
1820 float *row = x + (size_t) tok * (
size_t) aligned_head_dim;
1822 for (
int pair = 0; pair < rope_pairs; ++pair) {
1823 const int is_x_axis = pair >= axis_y_pairs && pair < axis_y_pairs + axis_x_pairs;
1824 if (pair == axis_y_pairs) {
1825 theta_x = (float) positions[tok + num_pos];
1827 const float theta = is_x_axis ? theta_x : theta_y;
1829 float cos_theta = 0.0f;
1830 float sin_theta = 0.0f;
1842 const float x0 = row[pair];
1843 const float x1 = row[pair + rope_pairs];
1850 &row[pair + rope_pairs]
1853 theta_y *= theta_scale;
1854 theta_x *= theta_scale;
1863static void vision_mrope_apply_pytorch_bf16(
1865 const int32_t *positions,
1869 int aligned_head_dim,
1871 const int sections[4],
1875 if (!x || !positions || num_heads <= 0 || num_tokens <= 0 || head_dim <= 0 ||
1876 aligned_head_dim < head_dim || n_dims <= 0) {
1880 const int rotary_width = n_dims < head_dim ? n_dims : head_dim;
1881 if ((rotary_width & 1) != 0 || rotary_width <= 0) {
1884 const int rope_pairs = rotary_width / 2;
1885 const int axis_pairs = sections[0];
1886 if (axis_pairs <= 0 || sections[1] != axis_pairs || axis_pairs * 2 != rope_pairs ||
1887 sections[2] != 0 || sections[3] != 0) {
1892 for (
int tok = 0; tok < num_tokens; ++tok) {
1893 if (positions[tok] > max_pos) max_pos = positions[tok];
1894 if (positions[tok + num_tokens] > max_pos) max_pos = positions[tok + num_tokens];
1896 if (max_pos < 0 || max_pos > 65535 || axis_pairs > 256) {
1900 float inv_freq[256];
1901 for (
int i = 0; i < axis_pairs; ++i) {
1902 const float exponent = (2.0f * (float)i) / (float)rope_pairs;
1906 const size_t table_count = (size_t)(max_pos + 1) * (size_t)axis_pairs;
1907 float angles[table_count];
1908 float cos_table[table_count];
1909 float sin_table[table_count];
1910 for (
int pos = 0; pos <= max_pos; ++pos) {
1911 for (
int i = 0; i < axis_pairs; ++i) {
1912 angles[(size_t)pos * (
size_t)axis_pairs + (size_t)i] =
1913 ((
float)pos * inv_freq[i]) * freq_scale;
1916 vsCos((MKL_INT)table_count, angles, cos_table);
1917 vsSin((MKL_INT)table_count, angles, sin_table);
1919 const size_t head_stride = (size_t)num_tokens * (
size_t)aligned_head_dim;
1920 for (
int h = 0; h < num_heads; ++h) {
1921 float *head = x + (size_t)h * head_stride;
1922 for (
int tok = 0; tok < num_tokens; ++tok) {
1923 const int pos_y = positions[tok];
1924 const int pos_x = positions[tok + num_tokens];
1925 float *row = head + (size_t)tok * (
size_t)aligned_head_dim;
1926 for (
int pair = 0; pair < rope_pairs; ++pair) {
1927 const int local_pair = pair < axis_pairs ? pair : pair - axis_pairs;
1928 const int pos = pair < axis_pairs ? pos_y : pos_x;
1929 const size_t table_idx = (size_t)pos * (
size_t)axis_pairs + (size_t)local_pair;
1930 const float cosine = cos_table[table_idx];
1931 const float sine = sin_table[table_idx];
1932 const float x0 = row[pair];
1933 const float x1 = row[pair + rope_pairs];
1935 volatile float x0_cos = x0 * cosine;
1936 volatile float x1_sin = x1 * sine;
1937 volatile float x0_sin = x0 * sine;
1938 volatile float x1_cos = x1 * cosine;
1949 const int32_t *positions,
1953 int aligned_head_dim,
1955 const int sections[4],
1976 if (!x || !positions || num_heads <= 0 || num_tokens <= 0 || head_dim <= 0 || aligned_head_dim < head_dim) {
1979 if (!ggml_cpu_init_fn || !ggml_init_fn || !ggml_free_fn || !ggml_new_tensor_1d_fn ||
1980 !ggml_view_3d_fn || !ggml_rope_multi_inplace_fn || !ggml_new_graph_fn ||
1981 !ggml_build_forward_expand_fn || !ggml_graph_compute_with_ctx_fn || !ggml_get_data_fn) {
1987 const size_t row_bytes = (size_t) aligned_head_dim *
sizeof(
float);
1988 const size_t head_bytes = (size_t) num_tokens * row_bytes;
1989 const int64_t total_elems = (int64_t) num_heads * (int64_t) num_tokens * (int64_t) aligned_head_dim;
1990 const size_t mem_size =
1991 (size_t) 16 * 1024 * 1024 +
1992 (
size_t) total_elems *
sizeof(float) +
1993 (
size_t) 4 * (size_t) num_tokens *
sizeof(int32_t);
2000 struct ggml_context *ctx = ggml_init_fn(params);
2006 struct ggml_tensor *x_base = ggml_new_tensor_1d_fn(ctx,
GGML_TYPE_F32, total_elems);
2007 struct ggml_tensor *pos_base = ggml_new_tensor_1d_fn(ctx,
GGML_TYPE_I32, (int64_t) 4 * (int64_t) num_tokens);
2008 if (!x_base || !pos_base) {
2013 void *x_base_data = ggml_get_data_fn(x_base);
2014 void *pos_base_data = ggml_get_data_fn(pos_base);
2015 if (!x_base_data || !pos_base_data) {
2020 memcpy(x_base_data, x, (
size_t) total_elems *
sizeof(
float));
2021 memcpy(pos_base_data, positions, (
size_t) 4 * (
size_t) num_tokens *
sizeof(int32_t));
2023 struct ggml_tensor *x_view = ggml_view_3d_fn(ctx,
2037 sections[0], sections[1], sections[2], sections[3]
2048 struct ggml_tensor *rope = ggml_rope_multi_inplace_fn(ctx,
2067 struct ggml_cgraph *gf = ggml_new_graph_fn(ctx);
2072 ggml_build_forward_expand_fn(gf, rope);
2078 memcpy(x, x_base_data, (
size_t) total_elems *
sizeof(
float));
2086 const int32_t *positions,
2089 int aligned_head_dim,
2091 const int sections[4],
2101 if (!x || !positions || num_tokens <= 0 || head_dim <= 0 || aligned_head_dim < head_dim || n_dims <= 0) {
2105 int rope_dims = n_dims;
2106 if (rope_dims > head_dim) {
2107 rope_dims = head_dim;
2110 if (rope_dims <= 0) {
2113 const int rope_pairs = rope_dims / 2;
2115 const int num_pos = num_tokens;
2116 const int sec_w = sections[0] + sections[1];
2117 const int sec_e = sec_w + sections[2];
2118 const int sect_dims = sections[0] + sections[1] + sections[2] + sections[3];
2119 const float theta_scale =
2121 float corr_dims[2] = {0.0f, (float) (rope_dims - 1)};
2124 for (
int tok = 0; tok < num_tokens; ++tok) {
2125 float theta_t = (float) positions[tok];
2126 float theta_h = (float) positions[tok + num_pos];
2127 float theta_w = (float) positions[tok + 2 * num_pos];
2128 float theta_e = (float) positions[tok + 3 * num_pos];
2129 float *row = x + (size_t) tok * (
size_t) aligned_head_dim;
2131 for (
int pair = 0; pair < rope_pairs; ++pair) {
2132 const int sector = sect_dims > 0 ? (pair % sect_dims) : pair;
2135 theta_t = (float) positions[tok];
2136 }
else if (sector == sections[0]) {
2137 theta_h = (float) positions[tok + num_pos];
2138 }
else if (sector == sec_w) {
2139 theta_w = (float) positions[tok + 2 * num_pos];
2140 }
else if (sector == sec_e) {
2141 theta_e = (float) positions[tok + 3 * num_pos];
2145 float theta = theta_t;
2147 if (sector % 3 == 1 && sector < 3 * sections[1]) {
2149 }
else if (sector % 3 == 2 && sector < 3 * sections[2]) {
2151 }
else if (sector % 3 == 0 && sector < 3 * sections[0]) {
2156 }
else if (sector >= sections[0] && sector < sec_w) {
2158 }
else if (sector >= sec_w && sector < sec_e) {
2160 }
else if (sector >= sec_e) {
2164 float cos_theta = 0.0f;
2165 float sin_theta = 0.0f;
2177 const float x0 = row[pair];
2178 const float x1 = row[pair + rope_pairs];
2185 &row[pair + rope_pairs]
2188 theta_t *= theta_scale;
2189 theta_h *= theta_scale;
2190 theta_w *= theta_scale;
2191 theta_e *= theta_scale;
2200 int aligned_head_dim,
2203 const int sections[4],
2213 if (!x || num_tokens <= 0 || head_dim <= 0 || aligned_head_dim < head_dim || n_dims <= 0) {
2217 int rope_dims = n_dims;
2218 if (rope_dims > head_dim) {
2219 rope_dims = head_dim;
2222 if (rope_dims <= 0) {
2225 const int rope_pairs = rope_dims / 2;
2227 const int sec_w = sections[0] + sections[1];
2228 const int sec_e = sec_w + sections[2];
2229 const int sect_dims = sections[0] + sections[1] + sections[2] + sections[3];
2230 const float theta_scale = powf(freq_base, -2.0f / (
float) rope_dims);
2231 float corr_dims[2] = {0.0f, (float) (rope_dims - 1)};
2234 for (
int tok = 0; tok < num_tokens; ++tok) {
2235 const float base_pos = (float) (pos_offset + tok);
2236 float theta_t = base_pos;
2237 float theta_h = base_pos;
2238 float theta_w = base_pos;
2239 float theta_e = 0.0f;
2240 float *row = x + (size_t) tok * (
size_t) aligned_head_dim;
2242 for (
int pair = 0; pair < rope_pairs; ++pair) {
2243 const int sector = sect_dims > 0 ? (pair % sect_dims) : pair;
2244 float theta = theta_t;
2245 if (is_imrope && sector % 3 == 1 && sector < 3 * sections[1]) {
2247 }
else if (is_imrope && sector % 3 == 2 && sector < 3 * sections[2]) {
2249 }
else if (is_imrope && sector % 3 == 0 && sector < 3 * sections[0]) {
2251 }
else if (is_imrope) {
2253 }
else if (sector >= sections[0] && sector < sec_w) {
2255 }
else if (sector >= sec_w && sector < sec_e) {
2257 }
else if (sector >= sec_e) {
2261 float cos_theta = 0.0f;
2262 float sin_theta = 0.0f;
2274 const float x0 = row[pair];
2275 const float x1 = row[pair + rope_pairs];
2282 &row[pair + rope_pairs]
2285 theta_t *= theta_scale;
2286 theta_h *= theta_scale;
2287 theta_w *= theta_scale;
2288 theta_e *= theta_scale;
2299 int aligned_head_dim,
2314 if (!q || !k || num_heads <= 0 || num_kv_heads <= 0 || num_tokens <= 0) {
2318 const int sections[4] = {section_0, section_1, section_2, section_3};
2319 const size_t q_head_stride = (size_t) num_tokens * (
size_t) aligned_head_dim;
2320 const size_t k_head_stride = (size_t) num_tokens * (
size_t) aligned_head_dim;
2322 for (
int h = 0; h < num_heads; ++h) {
2324 q + (
size_t) h * q_head_stride,
2342 for (
int h = 0; h < num_kv_heads; ++h) {
2344 k + (
size_t) h * k_head_stride,
2369 int aligned_head_dim,
2384 if (!q || !k || num_heads <= 0 || num_kv_heads <= 0 || num_tokens <= 0) {
2388 const int sections[4] = {section_0, section_1, section_2, section_3};
2389 const size_t q_head_stride = (size_t) num_tokens * (
size_t) aligned_head_dim;
2390 const size_t k_head_stride = (size_t) num_tokens * (
size_t) aligned_head_dim;
2392 for (
int h = 0; h < num_heads; ++h) {
2394 q + (
size_t) h * q_head_stride,
2412 for (
int h = 0; h < num_kv_heads; ++h) {
2414 k + (
size_t) h * k_head_stride,
2437 int aligned_head_dim,
2443 if (!x || num_heads <= 0 || num_tokens <= 0 || head_dim <= 0 ||
2444 aligned_head_dim < head_dim || n_dims <= 0) {
2447 int rope_dims = n_dims < head_dim ? n_dims : head_dim;
2449 if (rope_dims <= 0)
return;
2450 const int pairs = rope_dims / 2;
2451 const size_t head_stride = (size_t)num_tokens * (
size_t)aligned_head_dim;
2453 for (
int h = 0; h < num_heads; ++h) {
2454 float *head = x + (size_t)h * head_stride;
2455 for (
int tok = 0; tok < num_tokens; ++tok) {
2456 float *row = head + (size_t)tok * (
size_t)aligned_head_dim;
2457 const float position = (float)(pos_offset + tok);
2458 for (
int pair = 0; pair < pairs; ++pair) {
2459 const float exponent = (2.0f * (float)pair) / (float)rope_dims;
2461 const float angle = (position * inv_freq) * freq_scale;
2464 const float x0 = row[pair];
2465 const float x1 = row[pair + pairs];
2468 volatile uint16_t x1_sin_bits =
float_to_bf16((-x1) * sine);
2475 volatile uint16_t out0_bits =
float_to_bf16(x0_cos + x1_sin);
2476 volatile uint16_t out1_bits =
float_to_bf16(x1_cos + x0_sin);
2484#if defined(__clang__)
2485#pragma float_control(precise, on, push)
2489 const int32_t *positions,
2493 int aligned_head_dim,
2495 const int sections[4],
2499 if (!x || !positions || num_heads <= 0 || num_tokens <= 0 || head_dim <= 0 ||
2500 aligned_head_dim < head_dim || n_dims <= 0) {
2503 int rope_dims = n_dims < head_dim ? n_dims : head_dim;
2505 if (rope_dims <= 0)
return;
2506 const int pairs = rope_dims / 2;
2507 if (sections[0] <= 0 || sections[1] < 0 || sections[2] < 0 ||
2508 sections[3] != 0 || sections[0] + sections[1] + sections[2] != pairs) {
2511 const size_t head_stride = (size_t)num_tokens * (
size_t)aligned_head_dim;
2513 for (
int h = 0; h < num_heads; ++h) {
2514 float *head = x + (size_t)h * head_stride;
2515 for (
int tok = 0; tok < num_tokens; ++tok) {
2516 float *row = head + (size_t)tok * (
size_t)aligned_head_dim;
2517 for (
int pair = 0; pair < pairs; ++pair) {
2519 if (pair < sections[1] * 3 && pair % 3 == 1) axis = 1;
2520 if (pair < sections[2] * 3 && pair % 3 == 2) axis = 2;
2521 const float position = (float)positions[(
size_t)axis * (size_t)num_tokens + (
size_t)tok];
2522 const float exponent = (2.0f * (float)pair) / (float)rope_dims;
2524 const float angle = (position * inv_freq) * freq_scale;
2527 const float x0 = row[pair];
2528 const float x1 = row[pair + pairs];
2531 volatile uint16_t x1_sin_bits =
float_to_bf16((-x1) * sine);
2538 volatile uint16_t out0_bits =
float_to_bf16(x0_cos + x1_sin);
2539 volatile uint16_t out1_bits =
float_to_bf16(x1_cos + x0_sin);
2546#if defined(__clang__)
2547#pragma float_control(pop)
2553 const int32_t *positions,
2558 int aligned_head_dim,
2577 const int sections[4] = {section_0, section_1, section_2, section_3};
2579 q, positions, num_heads, num_tokens, head_dim, aligned_head_dim, n_dims,
2580 sections, freq_base, freq_scale);
2582 k, positions, num_kv_heads, num_tokens, head_dim, aligned_head_dim, n_dims,
2583 sections, freq_base, freq_scale);
2592 int aligned_head_dim,
2617 aligned_head_dim, pos_offset, n_dims,
2618 freq_base, freq_scale);
2620 aligned_head_dim, pos_offset, n_dims,
2621 freq_base, freq_scale);
2626 const int32_t *positions,
2631 int aligned_head_dim,
2645 if (!q || !k || !positions || num_heads <= 0 || num_kv_heads <= 0 || num_tokens <= 0) {
2649 const int sections[4] = {section_0, section_1, section_2, section_3};
2653 q, positions, num_heads, num_tokens, head_dim, aligned_head_dim, n_dims, sections,
2654 n_ctx_orig, freq_base, freq_scale, ext_factor, attn_factor, beta_fast, beta_slow,
GGML_ROPE_TYPE_VISION) &&
2656 k, positions, num_kv_heads, num_tokens, head_dim, aligned_head_dim, n_dims, sections,
2657 n_ctx_orig, freq_base, freq_scale, ext_factor, attn_factor, beta_fast, beta_slow,
GGML_ROPE_TYPE_VISION)) {
2662 const size_t q_head_stride = (size_t) num_tokens * (
size_t) aligned_head_dim;
2663 const size_t k_head_stride = (size_t) num_tokens * (
size_t) aligned_head_dim;
2665 for (
int h = 0; h < num_heads; ++h) {
2667 q + (
size_t) h * q_head_stride,
2684 for (
int h = 0; h < num_kv_heads; ++h) {
2686 k + (
size_t) h * k_head_stride,
2708 for (
size_t i = 0; i <
count; ++i) {
2709 if (storage_kind == 1) {
2711 }
else if (storage_kind == 2) {
2717#define CK_DEFINE_MROPE_STORAGE_WRAPPER(NAME, STORAGE_KIND) \
2718void NAME(float *q, float *k, const int32_t *positions, \
2719 int num_heads, int num_kv_heads, int num_tokens, \
2720 int head_dim, int aligned_head_dim, int n_dims, \
2721 int section_0, int section_1, int section_2, int section_3, \
2722 int n_ctx_orig, float freq_base, float freq_scale, \
2723 float ext_factor, float attn_factor, float beta_fast, float beta_slow) \
2725 mrope_qk_vision(q, k, positions, num_heads, num_kv_heads, num_tokens, \
2726 head_dim, aligned_head_dim, n_dims, section_0, section_1, \
2727 section_2, section_3, n_ctx_orig, freq_base, freq_scale, \
2728 ext_factor, attn_factor, beta_fast, beta_slow); \
2729 const size_t q_count = (size_t) num_heads * (size_t) num_tokens * (size_t) aligned_head_dim; \
2730 const size_t k_count = (size_t) num_kv_heads * (size_t) num_tokens * (size_t) aligned_head_dim; \
2731 ck_mrope_round_storage(q, q_count, STORAGE_KIND); \
2732 ck_mrope_round_storage(k, k_count, STORAGE_KIND); \
2741 const int32_t *positions,
2746 int aligned_head_dim,
2765 if (!q || !k || !positions || num_heads <= 0 || num_kv_heads <= 0 || num_tokens <= 0) {
2768 const int sections[4] = {section_0, section_1, section_2, section_3};
2769 vision_mrope_apply_pytorch_bf16(q, positions, num_heads, num_tokens, head_dim,
2770 aligned_head_dim, n_dims, sections, freq_base, freq_scale);
2771 vision_mrope_apply_pytorch_bf16(k, positions, num_kv_heads, num_tokens, head_dim,
2772 aligned_head_dim, n_dims, sections, freq_base, freq_scale);
2778 const int32_t *positions,
2783 int aligned_head_dim,
2797 if (!q || !k || !positions || num_heads <= 0 || num_kv_heads <= 0 || num_tokens <= 0) {
2801 const int sections[4] = {section_0, section_1, section_2, section_3};
2805 q, positions, num_heads, num_tokens, head_dim, aligned_head_dim, n_dims, sections,
2806 n_ctx_orig, freq_base, freq_scale, ext_factor, attn_factor, beta_fast, beta_slow,
GGML_ROPE_TYPE_IMROPE);
2808 k, positions, num_kv_heads, num_tokens, head_dim, aligned_head_dim, n_dims, sections,
2809 n_ctx_orig, freq_base, freq_scale, ext_factor, attn_factor, beta_fast, beta_slow,
GGML_ROPE_TYPE_IMROPE);
2815 const size_t q_head_stride = (size_t) num_tokens * (
size_t) aligned_head_dim;
2816 const size_t k_head_stride = (size_t) num_tokens * (
size_t) aligned_head_dim;
2818 for (
int h = 0; h < num_heads; ++h) {
2820 q + (
size_t) h * q_head_stride,
2838 for (
int h = 0; h < num_kv_heads; ++h) {
2840 k + (
size_t) h * k_head_stride,
2870 const float *cos_cache,
2871 const float *sin_cache,
2876 int aligned_head_dim,
2878 int q_stride_tokens,
2879 int k_stride_tokens)
2882 num_tokens, head_dim, aligned_head_dim, pos_offset,
2883 q_stride_tokens, k_stride_tokens, head_dim);
2888 const float *cos_cache,
2889 const float *sin_cache,
2894 int aligned_head_dim,
2896 int q_stride_tokens,
2897 int k_stride_tokens,
2901 head_dim, aligned_head_dim, pos_offset,
2902 q_stride_tokens, rotary_dim);
2904 head_dim, aligned_head_dim, pos_offset,
2905 k_stride_tokens, rotary_dim);
2917 const float *d_k_out,
2920 const float *cos_cache,
2921 const float *sin_cache,
2926 int aligned_head_dim,
2929 rope_backward(d_q_out, d_q, cos_cache, sin_cache, num_heads, num_tokens, head_dim, aligned_head_dim, pos_offset);
2930 rope_backward(d_k_out, d_k, cos_cache, sin_cache, num_kv_heads, num_tokens, head_dim, aligned_head_dim, pos_offset);
2934 const float *d_k_out,
2937 const float *cos_cache,
2938 const float *sin_cache,
2943 int aligned_head_dim,
2947 size_t q_head_stride = (size_t)num_tokens * (
size_t)aligned_head_dim;
2948 size_t k_head_stride = (size_t)num_tokens * (
size_t)aligned_head_dim;
2950 for (
int h = 0; h < num_heads; ++h) {
2952 d_q_out + (
size_t)h * q_head_stride,
2953 d_q + (
size_t)h * q_head_stride,
2964 for (
int h = 0; h < num_kv_heads; ++h) {
2966 d_k_out + (
size_t)h * k_head_stride,
2967 d_k + (
size_t)h * k_head_stride,
2991 if (!positions || total_tokens <= 0 || prefix_tokens <= 0) {
2994 if (grid_x <= 0 || grid_y <= 0 || grid_x * grid_y != prefix_tokens) {
2997 if (prefix_start < 0 || prefix_start > total_tokens) {
3000 if (prefix_tokens > total_tokens - prefix_start) {
3004 const int prefix_end = prefix_start + prefix_tokens;
3005 const int grid_extent = grid_x > grid_y ? grid_x : grid_y;
3006 const int resolved_text_pos = text_pos > 0
3008 : prefix_start + grid_extent;
3014 if (
token < prefix_start) {
3015 pos0 = pos1 = pos2 = (int32_t)
token;
3016 }
else if (
token < prefix_end) {
3017 const int local_token =
token - prefix_start;
3018 pos0 = (int32_t)position_base;
3019 pos1 = (int32_t)(position_base + local_token / grid_x);
3020 pos2 = (int32_t)(position_base + local_token % grid_x);
3022 pos0 = pos1 = pos2 = (int32_t)(resolved_text_pos +
token - prefix_end);
3024 positions[
token] = pos0;
3025 positions[
token + total_tokens] = pos1;
3026 positions[
token + 2 * total_tokens] = pos2;
3027 positions[
token + 3 * total_tokens] = 0;
3029 return resolved_text_pos;
static uint16_t float_to_bf16(float f)
static float bf16_to_float(uint16_t v)
void mrope_qk_vision_bf16_pytorch_storage(float *q, float *k, const int32_t *positions, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int n_dims, int section_0, int section_1, int section_2, int section_3, int n_ctx_orig, float freq_base, float freq_scale, float ext_factor, float attn_factor, float beta_fast, float beta_slow)
int ck_strict_parity_enabled(void)
Quantization block structures for weight-only quantization.
static ck_half ck_fp32_to_fp16(float f)
static float ck_fp16_to_fp32(ck_half h)
#define GGML_ROPE_TYPE_IMROPE
#define GGML_MROPE_SECTIONS
#define GGML_ROPE_TYPE_VISION
void rope_backward_qk_pairwise_with_rotary_dim(const float *d_q_out, const float *d_k_out, float *d_q, float *d_k, const float *cos_cache, const float *sin_cache, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int rotary_dim)
static void text_mrope_apply_positions_pytorch_bf16_storage(float *x, const int32_t *positions, int num_heads, int num_tokens, int head_dim, int aligned_head_dim, int n_dims, const int sections[4], float freq_base, float freq_scale)
static ck_ggml_rope_multi_inplace_fn ck_resolve_ggml_rope_multi_inplace(void)
void rope_forward_qk_split_llama_token_range_f32(float *q, float *k, const float *freq_factors, int use_freq_factors, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int rotary_dim, float freq_base, int token_begin, int token_end)
void rope_forward_qk_strided(float *q, float *k, const float *cos_cache, const float *sin_cache, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int q_stride_tokens, int k_stride_tokens)
void(* ck_ggml_cpu_init_fn)(void)
static int explicit_mrope_apply_ggml_exact(float *x, const int32_t *positions, int num_heads, int num_tokens, int head_dim, int aligned_head_dim, int n_dims, const int sections[4], int n_ctx_orig, float freq_base, float freq_scale, float ext_factor, float attn_factor, float beta_fast, float beta_slow, int rope_type)
void rope_forward_qk_gemma4v_vision_xy(float *q, float *k, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int grid_w, int rotary_dim, float freq_base)
struct ggml_tensor *(* ck_ggml_view_3d_fn)(struct ggml_context *, struct ggml_tensor *, int64_t, int64_t, int64_t, size_t, size_t, size_t)
void rope_forward_qk_split_direct_muse_pytorch_bf16_storage(float *q, float *k, const float *freq_factors, int use_freq_factors, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int rotary_dim, float freq_base)
struct ggml_cgraph *(* ck_ggml_new_graph_fn)(struct ggml_context *)
void mrope_qk_vision(float *q, float *k, const int32_t *positions, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int n_dims, int section_0, int section_1, int section_2, int section_3, int n_ctx_orig, float freq_base, float freq_scale, float ext_factor, float attn_factor, float beta_fast, float beta_slow)
static void explicit_mrope_apply_head(float *x, const int32_t *positions, int num_tokens, int head_dim, int aligned_head_dim, int n_dims, const int sections[4], int n_ctx_orig, float freq_base, float freq_scale, float ext_factor, float attn_factor, float beta_fast, float beta_slow, int is_imrope)
void mrope_qk_imrope_positions(float *q, float *k, const int32_t *positions, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int n_dims, int section_0, int section_1, int section_2, int section_3, int n_ctx_orig, float freq_base, float freq_scale, float ext_factor, float attn_factor, float beta_fast, float beta_slow)
static void rope_forward_gemma4v_vision_xy_one(float *x, int num_heads, int num_tokens, int head_dim, int aligned_head_dim, int grid_w, int rotary_dim, float freq_base)
static void rope_backward_apply_head_pairwise(const float *d_out, float *d_x, const float *cos_cache, const float *sin_cache, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int rotary_dim)
static void ck_mrope_round_storage(float *data, size_t count, int storage_kind)
static ck_ggml_view_3d_fn ck_resolve_ggml_view_3d(void)
static void rope_apply_head_pairwise(float *x, const float *cos_cache, const float *sin_cache, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int rotary_dim)
#define CK_DEFINE_MROPE_STORAGE_WRAPPER(NAME, STORAGE_KIND)
float(* ck_rope_math_f32_binary_fn)(float, float)
static ck_ggml_new_tensor_1d_fn ck_resolve_ggml_new_tensor_1d(void)
static void text_mrope_apply_head(float *x, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int n_dims, const int sections[4], int n_ctx_orig, float freq_base, float freq_scale, float ext_factor, float attn_factor, float beta_fast, float beta_slow, int is_imrope)
void rope_forward(float *x, const float *cos_cache, const float *sin_cache, int num_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset)
static void rope_forward_split_direct_one(float *x, const float *freq_factors, int use_freq_factors, int num_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int rotary_dim, float freq_base)
enum ggml_status(* ck_ggml_graph_compute_with_ctx_fn)(struct ggml_context *, struct ggml_cgraph *, int)
void yarn_rope_cache_explicit_positions_bf16(uint16_t *cos_cache, uint16_t *sin_cache, const int32_t *positions, int num_tokens, int rotary_dim, float freq_base, float factor, int original_context, float beta_fast, float beta_slow, float mscale, float mscale_all_dim)
void rope_forward_strided_with_rotary_dim(float *x, const float *cos_cache, const float *sin_cache, int num_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int head_stride_tokens, int rotary_dim)
void rope_backward_qk(const float *d_q_out, const float *d_k_out, float *d_q, float *d_k, const float *cos_cache, const float *sin_cache, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset)
void rope_forward_qk_strided_with_rotary_dim(float *q, float *k, const float *cos_cache, const float *sin_cache, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int q_stride_tokens, int k_stride_tokens, int rotary_dim)
static ck_ggml_build_forward_expand_fn ck_resolve_ggml_build_forward_expand(void)
void mrope_qk_text(float *q, float *k, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int n_dims, int section_0, int section_1, int section_2, int section_3, int n_ctx_orig, float freq_base, float freq_scale, float ext_factor, float attn_factor, float beta_fast, float beta_slow)
static ck_ggml_get_data_fn ck_resolve_ggml_get_data(void)
void rope_precompute_cache_llama_cpu(float *cos_cache, float *sin_cache, int max_seq_len, int head_dim, float base, int rotary_dim, const char *scaling_type, float scaling_factor)
static void ck_rope_ensure_ggml_loaded(void)
static void rope_apply_head(float *x, const float *cos_cache, const float *sin_cache, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int rotary_dim)
void rope_forward_qk_with_rotary_dim_cache_stride(float *q, float *k, const float *cos_cache, const float *sin_cache, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int rotary_dim, int cache_rotary_dim)
void rope_forward_qk_pairwise_llama_cpu(float *q, float *k, const float *cos_cache, const float *sin_cache, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int rotary_dim)
static void yarn_rope_cache_explicit_positions_impl(float *cos_f32, float *sin_f32, uint16_t *cos_bf16, uint16_t *sin_bf16, const int32_t *positions, int num_tokens, int rotary_dim, float freq_base, float factor, int original_context, float beta_fast, float beta_slow, float mscale, float mscale_all_dim)
void(* ck_ggml_free_fn)(struct ggml_context *)
static float ck_rope_reference_sinf(float value)
static void vision_mrope_apply_head(float *x, const int32_t *positions, int num_tokens, int head_dim, int aligned_head_dim, int n_dims, const int sections[4], int n_ctx_orig, float freq_base, float freq_scale, float ext_factor, float attn_factor, float beta_fast, float beta_slow)
static void rope_forward_split_direct_muse_bf16_one(float *x, int heads, int tokens, int head_dim, int aligned_head_dim, int pos_offset, int rotary_dim, float freq_base)
void rope_backward_inplace(float *d_x, const float *cos_cache, const float *sin_cache, int num_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset)
static float ck_rope_reference_powf(float base, float exponent)
void(* ck_ggml_build_forward_expand_fn)(struct ggml_cgraph *, struct ggml_tensor *)
static ck_ggml_graph_compute_with_ctx_fn ck_resolve_ggml_graph_compute_with_ctx(void)
static void * ck_rope_resolve_ggml_symbol(const char *name)
struct ggml_tensor *(* ck_ggml_rope_multi_inplace_fn)(struct ggml_context *, struct ggml_tensor *, struct ggml_tensor *, struct ggml_tensor *, int, int[4], int, int, float, float, float, float, float, float)
float(* ck_rope_math_f32_fn)(float)
void rope_forward_qk_pairwise_with_rotary_dim(float *q, float *k, const float *cos_cache, const float *sin_cache, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int rotary_dim)
static ck_rope_math_f32_fn ck_rope_resolve_system_math_f32(const char *name)
static void vision_mrope_yarn(float theta_extrap, float freq_scale, const float corr_dims[2], int chan, float ext_factor, float attn_factor, float *cos_theta, float *sin_theta)
void yarn_rope_cache_contiguous_positions_f32(float *cos_cache, float *sin_cache, int num_tokens, int rotary_dim, float freq_base, float factor, int original_context, float beta_fast, float beta_slow, float mscale, float mscale_all_dim)
void mrope_qk_text_imrope(float *q, float *k, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int n_dims, int section_0, int section_1, int section_2, int section_3, int n_ctx_orig, float freq_base, float freq_scale, float ext_factor, float attn_factor, float beta_fast, float beta_slow)
void rope_forward_qk_split_direct_token_range_f32(float *q, float *k, const float *freq_factors, int use_freq_factors, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int rotary_dim, float freq_base, int token_begin, int token_end)
void rope_precompute_cache(float *cos_cache, float *sin_cache, int max_seq_len, int head_dim, float base, int rotary_dim, const char *scaling_type, float scaling_factor)
static ck_ggml_new_graph_fn ck_resolve_ggml_new_graph(void)
static float ck_rope_reference_cosf(float value)
static void text_mrope_apply_pytorch_bf16_storage(float *x, int num_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int n_dims, float freq_base, float freq_scale)
static ck_ggml_free_fn ck_resolve_ggml_free(void)
static void vision_mrope_yarn_corr_dims(int n_dims, int n_ctx_orig, float freq_base, float beta_fast, float beta_slow, float dims[2])
struct ggml_tensor *(* ck_ggml_new_tensor_1d_fn)(struct ggml_context *, enum ggml_type, int64_t)
static void rope_apply_decode_pairwise_llama_cpu(float *rows, const float *cos_row, const float *sin_row, int num_heads, int aligned_head_dim, int rotary_dim)
static void text_mrope_yarn(float theta_extrap, float freq_scale, const float corr_dims[2], int chan, float ext_factor, float attn_factor, float *cos_theta, float *sin_theta)
void mrope_qk_text_imrope_positions_bf16_pytorch_storage(float *q, float *k, const int32_t *positions, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int n_dims, int section_0, int section_1, int section_2, int section_3, int n_ctx_orig, float freq_base, float freq_scale, float ext_factor, float attn_factor, float beta_fast, float beta_slow)
void rope_forward_qk(float *q, float *k, const float *cos_cache, const float *sin_cache, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset)
static float yarn_mscale(float factor, float scale)
struct ggml_context *(* ck_ggml_init_fn)(struct ggml_init_params)
static float vision_mrope_yarn_corr_dim(int n_dims, int n_ctx_orig, float n_rot, float base)
void mrope_qk_vision_bf16_storage(float *q, float *k, const int32_t *positions, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int n_dims, int section_0, int section_1, int section_2, int section_3, int n_ctx_orig, float freq_base, float freq_scale, float ext_factor, float attn_factor, float beta_fast, float beta_slow)
void rope_forward_with_rotary_dim(float *x, const float *cos_cache, const float *sin_cache, int num_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int rotary_dim)
void rope_forward_q_split_direct_f32(float *q, const float *freq_factors, int use_freq_factors, int num_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int rotary_dim, float freq_base)
void rope_forward_q_split_llama_f32(float *q, const float *freq_factors, int use_freq_factors, int num_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int rotary_dim, float freq_base)
int ck_multimodal_mrope_positions_2d(int32_t *positions, int total_tokens, int prefix_start, int position_base, int prefix_tokens, int grid_x, int grid_y, int text_pos)
void yarn_rope_cache_explicit_positions_f32(float *cos_cache, float *sin_cache, const int32_t *positions, int num_tokens, int rotary_dim, float freq_base, float factor, int original_context, float beta_fast, float beta_slow, float mscale, float mscale_all_dim)
void mrope_qk_text_imrope_bf16_pytorch_storage(float *q, float *k, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int n_dims, int section_0, int section_1, int section_2, int section_3, int n_ctx_orig, float freq_base, float freq_scale, float ext_factor, float attn_factor, float beta_fast, float beta_slow)
void rope_forward_qk_with_rotary_dim(float *q, float *k, const float *cos_cache, const float *sin_cache, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int rotary_dim)
void mrope_qk_vision_fp16_storage(float *q, float *k, const int32_t *positions, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int n_dims, int section_0, int section_1, int section_2, int section_3, int n_ctx_orig, float freq_base, float freq_scale, float ext_factor, float attn_factor, float beta_fast, float beta_slow)
void rope_forward_qk_split_direct_f32(float *q, float *k, const float *freq_factors, int use_freq_factors, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int rotary_dim, float freq_base)
static float yarn_correction_dim(float rotations, int rotary_dim, float freq_base, int original_context)
void rope_forward_qk_gemma4_direct(float *q, float *k, const float *freq_factors, int use_freq_factors, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int rotary_dim, float freq_base)
void *(* ck_ggml_get_data_fn)(const struct ggml_tensor *)
static ck_ggml_init_fn ck_resolve_ggml_init(void)
static ck_ggml_cpu_init_fn ck_resolve_ggml_cpu_init(void)
void rope_precompute_cache_split(float *cos_cache, float *sin_cache, int max_seq_len, int head_dim, float base)
static void mrope_rotate_pair(float x0, float x1, float cos_theta, float sin_theta, float *out0, float *out1)
void rope_backward(const float *d_out, float *d_x, const float *cos_cache, const float *sin_cache, int num_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset)
void rope_forward_strided(float *x, const float *cos_cache, const float *sin_cache, int num_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset, int head_stride_tokens)
static float vision_mrope_yarn_ramp(float low, float high, int chan)
__attribute__((visibility("default"))) CKTokenizer *ck_tokenizer_create(CKTokenizerType type)
const uint8_t size_t count