yum-archive/TaSTT-Whisper
High-performance GPGPU inference of OpenAI's Whisper automatic speech recognition (ASR) model
git clone https://git.yummers.dev/yum-archive/TaSTT-Whisper
8c4603c
master
1#include "ggml.h" 2 3#if defined(_MSC_VER )|| defined(__MINGW32__ ) 4#include <malloc.h> // using malloc.h with MSC/MINGW 5#elif !defined(__FreeBSD__ ) 6#include <alloca.h> 7#endif 8 9#include <assert.h> 10#include <time.h> 11#include <math.h> 12#include <stdlib.h> 13#include <string.h> 14#include <stdint.h> 15#include <stdio.h> 16 17// if C99 - static_assert is noop 18// ref: https://stackoverflow.com/a/53923785/4039976 19#ifndef static_assert 20#define static_assert (cond ,msg ) struct global_scope_noop_trick 21#endif 22 23#if defined_MSC_VER || defined(__MINGW32__ ) 24 25#if !defined(__MINGW32__ ) 26#include <Windows.h> 27#else 28// ref: https://github.com/ggerganov/whisper.cpp/issues/168 29#include <windows.h> 30#include <errno.h> 31#endif 32 33typedef volatile LONG atomic_int ; 34typedef atomic_int atomic_bool ; 35 36static void atomic_store (atomic_int * ptr ,LONG val ) { 37InterlockedExchange (ptr ,val ); 38} 39static LONG atomic_load (atomic_int * ptr ) { 40return InterlockedCompareExchange (ptr ,0 ,0 ); 41} 42static LONG atomic_fetch_add (atomic_int * ptr ,LONG inc ) { 43return InterlockedExchangeAdd (ptr ,inc ); 44} 45static LONG atomic_fetch_sub (atomic_int * ptr ,LONG dec ) { 46return atomic_fetch_add (ptr ,- (dec )); 47} 48 49typedef HANDLE pthread_t ; 50 51typedef DWORD thread_ret_t ; 52static int pthread_create (pthread_t * out ,void * unused ,thread_ret_t (* func )(void * ),void * arg ) { 53HANDLE handle = CreateThread (NULL ,0 , (LPTHREAD_START_ROUTINE )func ,arg ,0 ,NULL ); 54if (handle == NULL ) 55 { 56return EAGAIN ; 57 } 58 59* out = handle ; 60return 0 ; 61} 62 63static int pthread_join (pthread_t thread ,void * unused ) { 64return (int )WaitForSingleObject (thread ,INFINITE ); 65} 66 67static int sched_yield (void ) { 68Sleep (0 ); 69return 0 ; 70} 71#else 72#include <pthread.h> 73#include <stdatomic.h> 74 75typedef void * thread_ret_t ; 76#endif 77 78#ifdef __HAIKU__ 79#define static_assert (cond ,msg ) _Static_assert(cond, msg) 80#endif 81 82#define GGML_DEBUG 0 83#define GGML_GELU_FP16 84 85#if UINTPTR_MAX == 0xFFFFFFFF 86#define GGML_MEM_ALIGN 4 87#else 88#define GGML_MEM_ALIGN 16 89#endif 90 91#define MAX (a ,b ) ((a) > (b) ? (a) : (b)) 92#define MIN (a ,b ) ((a) < (b) ? (a) : (b)) 93 94#define UNUSED (x ) (void)(x) 95#define SWAP (x ,y ,T ) do { T SWAP = x; x = y; y = SWAP; } while (0) 96 97#define GGML_ASSERT (x ) \ 98 do { \ 99 if (!(x)) { \ 100 logError( u8"GGML_ASSERT: %s:%d: %s", __FILE__, __LINE__, #x); \ 101 abort(); \ 102 } \ 103 } while (0) 104 105#ifdef GGML_USE_ACCELERATE 106#include <Accelerate/Accelerate.h> 107#elif GGML_USE_OPENBLAS 108#include <cblas.h> 109#endif 110 111// floating point type used to accumulate sums 112typedef double ggml_float ; 113 114// 16-bit float 115// on Arm, we use __fp16 116// on x86, we use uint16_t 117#ifdef __ARM_NEON 118 119// if YCM cannot find <arm_neon.h>, make a symbolic link to it, for example: 120// 121// $ ln -sfn /Library/Developer/CommandLineTools/usr/lib/clang/13.1.6/include/arm_neon.h ./src/ 122// 123#include <arm_neon.h> 124 125float ggml_fp16_to_fp32 (ggml_fp16_t x ) { 126return x ; 127} 128 129ggml_fp16_t ggml_fp32_to_fp16 (float x ) { 130return x ; 131} 132 133#define GGML_FP16_TO_FP32 (x ) (x) 134#define GGML_FP32_TO_FP16 (x ) (x) 135 136#else 137 138#ifdef __wasm_simd128__ 139#include <wasm_simd128.h> 140#else 141#ifdef __POWER9_VECTOR__ 142#include <altivec.h> 143#undef bool 144#define bool _Bool 145#else 146#include <immintrin.h> 147#endif 148#endif 149 150#ifdef __F16C__ 151float ggml_fp16_to_fp32 (ggml_fp16_t h ) { 152return _cvtsh_ss (h ); 153} 154ggml_fp16_t ggml_fp32_to_fp16 (float f ) { 155return _cvtss_sh (f ,0 ); 156} 157 158#define GGML_FP16_TO_FP32 (x ) _cvtsh_ss(x) 159#define GGML_FP32_TO_FP16 (x ) _cvtss_sh(x, 0) 160 161#else 162 163// FP16 <-> FP32 164// ref: https://github.com/Maratyszcza/FP16 165 166static inline float fp32_from_bits (uint32_t w ) { 167union { 168uint32_t as_bits ; 169float as_value ; 170 }fp32 ; 171fp32 .as_bits = w ; 172return fp32 .as_value ; 173} 174 175static inline uint32_t fp32_to_bits (float f ) { 176union { 177float as_value ; 178uint32_t as_bits ; 179 }fp32 ; 180fp32 .as_value = f ; 181return fp32 .as_bits ; 182} 183 184float ggml_fp16_to_fp32 (ggml_fp16_t h ) { 185const uint32_t w = (uint32_t )h <<16 ; 186const uint32_t sign = w & UINT32_C (0x80000000 ); 187const uint32_t two_w = w + w ; 188 189const uint32_t exp_offset = UINT32_C (0xE0 ) <<23 ; 190#if defined(__STDC_VERSION__ )&& (__STDC_VERSION__ >=199901L )|| defined(__GNUC__ )&& !defined(__STRICT_ANSI__ ) 191const float exp_scale = 0x1.0p-112f ; 192#else 193const float exp_scale = fp32_from_bits (UINT32_C (0x7800000 )); 194#endif 195const float normalized_value = fp32_from_bits ((two_w >>4 )+ exp_offset )* exp_scale ; 196 197const uint32_t magic_mask = UINT32_C (126 ) <<23 ; 198const float magic_bias = 0.5f ; 199const float denormalized_value = fp32_from_bits ((two_w >>17 ) |magic_mask )- magic_bias ; 200 201const uint32_t denormalized_cutoff = UINT32_C (1 ) <<27 ; 202const uint32_t result = sign | 203 (two_w < denormalized_cutoff ?fp32_to_bits (denormalized_value ) :fp32_to_bits (normalized_value )); 204return fp32_from_bits (result ); 205} 206 207ggml_fp16_t ggml_fp32_to_fp16 (float f ) { 208#if defined(__STDC_VERSION__ )&& (__STDC_VERSION__ >=199901L )|| defined(__GNUC__ )&& !defined(__STRICT_ANSI__ ) 209const float scale_to_inf = 0x1.0p+112f ; 210const float scale_to_zero = 0x1.0p-110f ; 211#else 212const float scale_to_inf = fp32_from_bits (UINT32_C (0x77800000 )); 213const float scale_to_zero = fp32_from_bits (UINT32_C (0x08800000 )); 214#endif 215float base = (fabsf (f )* scale_to_inf )* scale_to_zero ; 216 217const uint32_t w = fp32_to_bits (f ); 218const uint32_t shl1_w = w + w ; 219const uint32_t sign = w & UINT32_C (0x80000000 ); 220uint32_t bias = shl1_w & UINT32_C (0xFF000000 ); 221if (bias < UINT32_C (0x71000000 )) { 222bias = UINT32_C (0x71000000 ); 223 } 224 225base = fp32_from_bits ((bias >>1 )+ UINT32_C (0x07800000 ))+ base ; 226const uint32_t bits = fp32_to_bits (base ); 227const uint32_t exp_bits = (bits >>13 )& UINT32_C (0x00007C00 ); 228const uint32_t mantissa_bits = bits & UINT32_C (0x00000FFF ); 229const uint32_t nonsign = exp_bits + mantissa_bits ; 230return (sign >>16 ) | (shl1_w > UINT32_C (0xFF000000 ) ?UINT16_C (0x7E00 ) :nonsign ); 231} 232 233#define GGML_FP16_TO_FP32 (x ) ggml_fp16_to_fp32(x) 234#define GGML_FP32_TO_FP16 (x ) ggml_fp32_to_fp16(x) 235 236#endif // __F16C__ 237 238#endif // __ARM_NEON 239 240// 241// global data 242// 243 244// precomputed gelu table for f16 (128 KB) 245static ggml_fp16_t table_gelu_f16 [1 <<16 ]; 246 247// precomputed exp table for f16 (128 KB) 248static ggml_fp16_t table_exp_f16 [1 <<16 ]; 249 250// 251// timing 252// 253 254#if defined(_MSC_VER )|| defined(__MINGW32__ ) 255static int64_t timer_freq ; 256void ggml_time_init (void ) { 257LARGE_INTEGER frequency ; 258QueryPerformanceFrequency (& frequency ); 259timer_freq = frequency .QuadPart ; 260} 261int64_t ggml_time_ms (void ) { 262LARGE_INTEGER t ; 263QueryPerformanceCounter (& t ); 264return (t .QuadPart * 1000 ) /timer_freq ; 265} 266int64_t ggml_time_us (void ) { 267LARGE_INTEGER t ; 268QueryPerformanceCounter (& t ); 269return (t .QuadPart * 1000000 ) /timer_freq ; 270} 271#else 272void ggml_time_init (void ) {} 273int64_t ggml_time_ms (void ) { 274struct timespec ts ; 275clock_gettime (CLOCK_MONOTONIC ,& ts ); 276return (int64_t )ts .tv_sec * 1000 + (int64_t )ts .tv_nsec /1000000 ; 277} 278 279int64_t ggml_time_us (void ) { 280struct timespec ts ; 281clock_gettime (CLOCK_MONOTONIC ,& ts ); 282return (int64_t )ts .tv_sec * 1000000 + (int64_t )ts .tv_nsec /1000 ; 283} 284#endif 285 286int64_t ggml_cycles (void ) { 287return clock (); 288} 289 290int64_t ggml_cycles_per_ms (void ) { 291return CLOCKS_PER_SEC /1000 ; 292} 293 294#ifdef GGML_PERF 295#define ggml_perf_time_ms () ggml_time_ms() 296#define ggml_perf_time_us () ggml_time_us() 297#define ggml_perf_cycles () ggml_cycles() 298#define ggml_perf_cycles_per_ms () ggml_cycles_per_ms() 299#else 300#define ggml_perf_time_ms () 0 301#define ggml_perf_time_us () 0 302#define ggml_perf_cycles () 0 303#define ggml_perf_cycles_per_ms () 0 304#endif 305 306// 307// cache line 308// 309 310#if defined(__cpp_lib_hardware_interference_size ) 311#define CACHE_LINE_SIZE hardware_destructive_interference_size 312#else 313#define CACHE_LINE_SIZE 64 314#endif 315 316static const size_t CACHE_LINE_SIZE_F32 = CACHE_LINE_SIZE /sizeof (float ); 317 318// 319// simd mappings 320// 321 322// we define a common set of C macros which map to specific intrinsics based on the current architecture 323// we then implement the fundamental computation operations below using only these macros 324// adding support for new architectures requires to define the corresponding SIMD macros 325// 326// GGML_F32_STEP / GGML_F16_STEP 327// number of elements to process in a single step 328// 329// GGML_F32_EPR / GGML_F16_EPR 330// number of elements to fit in a single register 331// 332 333#if defined(__ARM_NEON )&& defined(__ARM_FEATURE_FMA ) 334 335#define GGML_SIMD 336 337// F32 NEON 338 339#define GGML_F32_STEP 16 340#define GGML_F32_EPR 4 341 342#define GGML_F32x4 float32x4_t 343#define GGML_F32x4_ZERO vdupq_n_f32(0.0f) 344#define GGML_F32x4_SET1 (x ) vdupq_n_f32(x) 345#define GGML_F32x4_LOAD vld1q_f32 346#define GGML_F32x4_STORE vst1q_f32 347#define GGML_F32x4_FMA (a ,b ,c ) vfmaq_f32(a, b, c) 348#define GGML_F32x4_ADD vaddq_f32 349#define GGML_F32x4_MUL vmulq_f32 350#if defined(__ARM_FEATURE_QRDMX ) 351#define GGML_F32x4_REDUCE_ONE (x ) vaddvq_f32(x) 352#else 353#define GGML_F32x4_REDUCE_ONE (x ) \ 354 (vgetq_lane_f32(x, 0) + \ 355 vgetq_lane_f32(x, 1) + \ 356 vgetq_lane_f32(x, 2) + \ 357 vgetq_lane_f32(x, 3)) 358#endif 359#define GGML_F32x4_REDUCE (res ,x ) \ 360{ \ 361 for (int i = 0; i < GGML_F32_ARR/2; ++i) { \ 362 x[2*i] = vaddq_f32(x[2*i], x[2*i+1]); \ 363 } \ 364 for (int i = 0; i < GGML_F32_ARR/4; ++i) { \ 365 x[4*i] = vaddq_f32(x[4*i], x[4*i+2]); \ 366 } \ 367 for (int i = 0; i < GGML_F32_ARR/8; ++i) { \ 368 x[8*i] = vaddq_f32(x[8*i], x[8*i+4]); \ 369 } \ 370 res = GGML_F32x4_REDUCE_ONE(x[0]); \ 371} 372 373#define GGML_F32_VEC GGML_F32x4 374#define GGML_F32_VEC_ZERO GGML_F32x4_ZERO 375#define GGML_F32_VEC_SET1 GGML_F32x4_SET1 376#define GGML_F32_VEC_LOAD GGML_F32x4_LOAD 377#define GGML_F32_VEC_STORE GGML_F32x4_STORE 378#define GGML_F32_VEC_FMA GGML_F32x4_FMA 379#define GGML_F32_VEC_ADD GGML_F32x4_ADD 380#define GGML_F32_VEC_MUL GGML_F32x4_MUL 381#define GGML_F32_VEC_REDUCE GGML_F32x4_REDUCE 382 383// F16 NEON 384 385#if defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC ) 386#define GGML_F16_STEP 32 387#define GGML_F16_EPR 8 388 389#define GGML_F16x8 float16x8_t 390#define GGML_F16x8_ZERO vdupq_n_f16(0.0f) 391#define GGML_F16x8_SET1 (x ) vdupq_n_f16(x) 392#define GGML_F16x8_LOAD vld1q_f16 393#define GGML_F16x8_STORE vst1q_f16 394#define GGML_F16x8_FMA (a ,b ,c ) vfmaq_f16(a, b, c) 395#define GGML_F16x8_ADD vaddq_f16 396#define GGML_F16x8_MUL vmulq_f16 397#define GGML_F16x8_REDUCE (res ,x ) \ 398 { \ 399 for (int i = 0; i < GGML_F16_ARR/2; ++i) { \ 400 x[2*i] = vaddq_f16(x[2*i], x[2*i+1]); \ 401 } \ 402 for (int i = 0; i < GGML_F16_ARR/4; ++i) { \ 403 x[4*i] = vaddq_f16(x[4*i], x[4*i+2]); \ 404 } \ 405 for (int i = 0; i < GGML_F16_ARR/8; ++i) { \ 406 x[8*i] = vaddq_f16(x[8*i], x[8*i+4]); \ 407 } \ 408 const float32x4_t t0 = vcvt_f32_f16(vget_low_f16 (x[0])); \ 409 const float32x4_t t1 = vcvt_f32_f16(vget_high_f16(x[0])); \ 410 res = vaddvq_f32(vaddq_f32(t0, t1)); \ 411 } 412 413#define GGML_F16_VEC GGML_F16x8 414#define GGML_F16_VEC_ZERO GGML_F16x8_ZERO 415#define GGML_F16_VEC_SET1 GGML_F16x8_SET1 416#define GGML_F16_VEC_LOAD GGML_F16x8_LOAD 417#define GGML_F16_VEC_STORE GGML_F16x8_STORE 418#define GGML_F16_VEC_FMA GGML_F16x8_FMA 419#define GGML_F16_VEC_ADD GGML_F16x8_ADD 420#define GGML_F16_VEC_MUL GGML_F16x8_MUL 421#define GGML_F16_VEC_REDUCE GGML_F16x8_REDUCE 422#else 423// if FP16 vector arithmetic is not supported, we use FP32 instead 424// and take advantage of the vcvt_ functions to convert to/from FP16 425 426#define GGML_F16_STEP 16 427#define GGML_F16_EPR 4 428 429#define GGML_F32Cx4 float32x4_t 430#define GGML_F32Cx4_ZERO vdupq_n_f32(0.0f) 431#define GGML_F32Cx4_SET1 (x ) vdupq_n_f32(x) 432#define GGML_F32Cx4_LOAD (x ) vcvt_f32_f16(vld1_f16(x)) 433#define GGML_F32Cx4_STORE (x ,y ) vst1_f16(x, vcvt_f16_f32(y)) 434#define GGML_F32Cx4_FMA (a ,b ,c ) vfmaq_f32(a, b, c) 435#define GGML_F32Cx4_ADD vaddq_f32 436#define GGML_F32Cx4_MUL vmulq_f32 437#define GGML_F32Cx4_REDUCE GGML_F32x4_REDUCE 438 439#define GGML_F16_VEC GGML_F32Cx4 440#define GGML_F16_VEC_ZERO GGML_F32Cx4_ZERO 441#define GGML_F16_VEC_SET1 GGML_F32Cx4_SET1 442#define GGML_F16_VEC_LOAD GGML_F32Cx4_LOAD 443#define GGML_F16_VEC_STORE GGML_F32Cx4_STORE 444#define GGML_F16_VEC_FMA GGML_F32Cx4_FMA 445#define GGML_F16_VEC_ADD GGML_F32Cx4_ADD 446#define GGML_F16_VEC_MUL GGML_F32Cx4_MUL 447#define GGML_F16_VEC_REDUCE GGML_F32Cx4_REDUCE 448#endif 449 450#elif defined(__AVX__ ) 451 452#define GGML_SIMD 453 454// F32 AVX 455 456#define GGML_F32_STEP 32 457#define GGML_F32_EPR 8 458 459#define GGML_F32x8 __m256 460#define GGML_F32x8_ZERO _mm256_setzero_ps() 461#define GGML_F32x8_SET1 (x ) _mm256_set1_ps(x) 462#define GGML_F32x8_LOAD _mm256_loadu_ps 463#define GGML_F32x8_STORE _mm256_storeu_ps 464#if defined(__FMA__ ) 465#define GGML_F32x8_FMA (a ,b ,c ) _mm256_fmadd_ps(b, c, a) 466#else 467#define GGML_F32x8_FMA (a ,b ,c ) _mm256_add_ps(_mm256_mul_ps(b, c), a) 468#endif 469#define GGML_F32x8_ADD _mm256_add_ps 470#define GGML_F32x8_MUL _mm256_mul_ps 471#define GGML_F32x8_REDUCE (res ,x ) \ 472{ \ 473 for (int i = 0; i < GGML_F32_ARR/2; ++i) { \ 474 x[2*i] = _mm256_add_ps(x[2*i], x[2*i+1]); \ 475 } \ 476 for (int i = 0; i < GGML_F32_ARR/4; ++i) { \ 477 x[4*i] = _mm256_add_ps(x[4*i], x[4*i+2]); \ 478 } \ 479 for (int i = 0; i < GGML_F32_ARR/8; ++i) { \ 480 x[8*i] = _mm256_add_ps(x[8*i], x[8*i+4]); \ 481 } \ 482 const __m128 t0 = _mm_add_ps(_mm256_castps256_ps128(x[0]), \ 483 _mm256_extractf128_ps(x[0], 1)); \ 484 const __m128 t1 = _mm_hadd_ps(t0, t0); \ 485 res = _mm_cvtss_f32(_mm_hadd_ps(t1, t1)); \ 486} 487// TODO: is this optimal ? 488 489#define GGML_F32_VEC GGML_F32x8 490#define GGML_F32_VEC_ZERO GGML_F32x8_ZERO 491#define GGML_F32_VEC_SET1 GGML_F32x8_SET1 492#define GGML_F32_VEC_LOAD GGML_F32x8_LOAD 493#define GGML_F32_VEC_STORE GGML_F32x8_STORE 494#define GGML_F32_VEC_FMA GGML_F32x8_FMA 495#define GGML_F32_VEC_ADD GGML_F32x8_ADD 496#define GGML_F32_VEC_MUL GGML_F32x8_MUL 497#define GGML_F32_VEC_REDUCE GGML_F32x8_REDUCE 498 499// F16 AVX 500 501#define GGML_F16_STEP 32 502#define GGML_F16_EPR 8 503 504// F16 arithmetic is not supported by AVX, so we use F32 instead 505// we take advantage of the _mm256_cvt intrinsics to convert F16 <-> F32 506 507#define GGML_F32Cx8 __m256 508#define GGML_F32Cx8_ZERO _mm256_setzero_ps() 509#define GGML_F32Cx8_SET1 (x ) _mm256_set1_ps(x) 510#define GGML_F32Cx8_LOAD (x ) _mm256_cvtph_ps(_mm_loadu_si128((__m128i *)(x))) 511#define GGML_F32Cx8_STORE (x ,y ) _mm_storeu_si128((__m128i *)(x), _mm256_cvtps_ph(y, 0)) 512#define GGML_F32Cx8_FMA GGML_F32x8_FMA 513#define GGML_F32Cx8_ADD _mm256_add_ps 514#define GGML_F32Cx8_MUL _mm256_mul_ps 515#define GGML_F32Cx8_REDUCE GGML_F32x8_REDUCE 516 517#define GGML_F16_VEC GGML_F32Cx8 518#define GGML_F16_VEC_ZERO GGML_F32Cx8_ZERO 519#define GGML_F16_VEC_SET1 GGML_F32Cx8_SET1 520#define GGML_F16_VEC_LOAD GGML_F32Cx8_LOAD 521#define GGML_F16_VEC_STORE GGML_F32Cx8_STORE 522#define GGML_F16_VEC_FMA GGML_F32Cx8_FMA 523#define GGML_F16_VEC_ADD GGML_F32Cx8_ADD 524#define GGML_F16_VEC_MUL GGML_F32Cx8_MUL 525#define GGML_F16_VEC_REDUCE GGML_F32Cx8_REDUCE 526 527#elif defined(__POWER9_VECTOR__ ) 528 529// TODO: uncomment this when it works 530//#define GGML_SIMD 531 532// F32 POWER9 533 534#define GGML_F32_STEP 32 535#define GGML_F32_EPR 8 536 537// TODO: not tested !! 538#define GGML_F32x4 __vector float 539#define GGML_F32x4_ZERO (__vector float){0.0f, 0.0f, 0.0f, 0.0f} 540#define GGML_F32x4_SET1 (x ) (__vector float){x, x, x, x} 541#define GGML_F32x4_LOAD vec_vsx_ld 542#define GGML_F32x4_STORE vec_vsx_st 543#define GGML_F32x4_FMA (a ,b ,c ) vec_madd(b, c, a) 544#define GGML_F32x4_ADD vec_add 545#define GGML_F32x4_MUL vec_mul 546#define GGML_F32x4_REDUCE (res ,x ) \ 547{ \ 548 for (int i = 0; i < GGML_F32_ARR/2; ++i) { \ 549 x[2*i] = vec_add(x[2*i], x[2*i+1]); \ 550 } \ 551 for (int i = 0; i < GGML_F32_ARR/4; ++i) { \ 552 x[4*i] = vec_add(x[4*i], x[4*i+2]); \ 553 } \ 554 for (int i = 0; i < GGML_F32_ARR/8; ++i) { \ 555 x[8*i] = vec_add(x[8*i], x[8*i+4]); \ 556 } \ 557 res = vec_extract(x[0], 0) + \ 558 vec_extract(x[0], 1) + \ 559 vec_extract(x[0], 2) + \ 560 vec_extract(x[0], 3); \ 561} 562 563#define GGML_F32_VEC GGML_F32x4 564#define GGML_F32_VEC_ZERO GGML_F32x4_ZERO 565#define GGML_F32_VEC_SET1 GGML_F32x4_SET1 566#define GGML_F32_VEC_LOAD GGML_F32x4_LOAD 567#define GGML_F32_VEC_STORE GGML_F32x4_STORE 568#define GGML_F32_VEC_FMA GGML_F32x4_FMA 569#define GGML_F32_VEC_ADD GGML_F32x4_ADD 570#define GGML_F32_VEC_MUL GGML_F32x4_MUL 571#define GGML_F32_VEC_REDUCE GGML_F32x4_REDUCE 572 573// F16 POWER9 574// TODO: implement here 575// ... 576 577#elif defined(__wasm_simd128__ ) 578 579#define GGML_SIMD 580 581// F32 WASM 582 583#define GGML_F32_STEP 16 584#define GGML_F32_EPR 4 585 586#define GGML_F32x4 v128_t 587#define GGML_F32x4_ZERO wasm_f32x4_splat(0.0f) 588#define GGML_F32x4_SET1 (x ) wasm_f32x4_splat(x) 589#define GGML_F32x4_LOAD wasm_v128_load 590#define GGML_F32x4_STORE wasm_v128_store 591#define GGML_F32x4_FMA (a ,b ,c ) wasm_f32x4_add(wasm_f32x4_mul(b, c), a) 592#define GGML_F32x4_ADD wasm_f32x4_add 593#define GGML_F32x4_MUL wasm_f32x4_mul 594#define GGML_F32x4_REDUCE (res ,x ) \ 595{ \ 596 for (int i = 0; i < GGML_F32_ARR/2; ++i) { \ 597 x[2*i] = wasm_f32x4_add(x[2*i], x[2*i+1]); \ 598 } \ 599 for (int i = 0; i < GGML_F32_ARR/4; ++i) { \ 600 x[4*i] = wasm_f32x4_add(x[4*i], x[4*i+2]); \ 601 } \ 602 for (int i = 0; i < GGML_F32_ARR/8; ++i) { \ 603 x[8*i] = wasm_f32x4_add(x[8*i], x[8*i+4]); \ 604 } \ 605 res = wasm_f32x4_extract_lane(x[0], 0) + \ 606 wasm_f32x4_extract_lane(x[0], 1) + \ 607 wasm_f32x4_extract_lane(x[0], 2) + \ 608 wasm_f32x4_extract_lane(x[0], 3); \ 609} 610 611#define GGML_F32_VEC GGML_F32x4 612#define GGML_F32_VEC_ZERO GGML_F32x4_ZERO 613#define GGML_F32_VEC_SET1 GGML_F32x4_SET1 614#define GGML_F32_VEC_LOAD GGML_F32x4_LOAD 615#define GGML_F32_VEC_STORE GGML_F32x4_STORE 616#define GGML_F32_VEC_FMA GGML_F32x4_FMA 617#define GGML_F32_VEC_ADD GGML_F32x4_ADD 618#define GGML_F32_VEC_MUL GGML_F32x4_MUL 619#define GGML_F32_VEC_REDUCE GGML_F32x4_REDUCE 620 621// F16 WASM 622 623#define GGML_F16_STEP 16 624#define GGML_F16_EPR 4 625 626inline static v128_t __wasm_f16x4_load (const ggml_fp16_t * p ) { 627float tmp [4 ]; 628 629tmp [0 ]= GGML_FP16_TO_FP32 (p [0 ]); 630tmp [1 ]= GGML_FP16_TO_FP32 (p [1 ]); 631tmp [2 ]= GGML_FP16_TO_FP32 (p [2 ]); 632tmp [3 ]= GGML_FP16_TO_FP32 (p [3 ]); 633 634return wasm_v128_load (tmp ); 635} 636 637inline static void __wasm_f16x4_store (ggml_fp16_t * p ,v128_t x ) { 638float tmp [4 ]; 639 640wasm_v128_store (tmp ,x ); 641 642p [0 ]= GGML_FP32_TO_FP16 (tmp [0 ]); 643p [1 ]= GGML_FP32_TO_FP16 (tmp [1 ]); 644p [2 ]= GGML_FP32_TO_FP16 (tmp [2 ]); 645p [3 ]= GGML_FP32_TO_FP16 (tmp [3 ]); 646} 647 648#define GGML_F16x4 v128_t 649#define GGML_F16x4_ZERO wasm_f32x4_splat(0.0f) 650#define GGML_F16x4_SET1 (x ) wasm_f32x4_splat(x) 651#define GGML_F16x4_LOAD (x ) __wasm_f16x4_load(x) 652#define GGML_F16x4_STORE (x ,y ) __wasm_f16x4_store(x, y) 653#define GGML_F16x4_FMA GGML_F32x4_FMA 654#define GGML_F16x4_ADD wasm_f32x4_add 655#define GGML_F16x4_MUL wasm_f32x4_mul 656#define GGML_F16x4_REDUCE (res ,x ) \ 657{ \ 658 for (int i = 0; i < GGML_F16_ARR/2; ++i) { \ 659 x[2*i] = wasm_f32x4_add(x[2*i], x[2*i+1]); \ 660 } \ 661 for (int i = 0; i < GGML_F16_ARR/4; ++i) { \ 662 x[4*i] = wasm_f32x4_add(x[4*i], x[4*i+2]); \ 663 } \ 664 for (int i = 0; i < GGML_F16_ARR/8; ++i) { \ 665 x[8*i] = wasm_f32x4_add(x[8*i], x[8*i+4]); \ 666 } \ 667 res = wasm_f32x4_extract_lane(x[0], 0) + \ 668 wasm_f32x4_extract_lane(x[0], 1) + \ 669 wasm_f32x4_extract_lane(x[0], 2) + \ 670 wasm_f32x4_extract_lane(x[0], 3); \ 671} 672 673#define GGML_F16_VEC GGML_F16x4 674#define GGML_F16_VEC_ZERO GGML_F16x4_ZERO 675#define GGML_F16_VEC_SET1 GGML_F16x4_SET1 676#define GGML_F16_VEC_LOAD GGML_F16x4_LOAD 677#define GGML_F16_VEC_STORE GGML_F16x4_STORE 678#define GGML_F16_VEC_FMA GGML_F16x4_FMA 679#define GGML_F16_VEC_ADD GGML_F16x4_ADD 680#define GGML_F16_VEC_MUL GGML_F16x4_MUL 681#define GGML_F16_VEC_REDUCE GGML_F16x4_REDUCE 682 683#endif 684 685// GGML_F32_ARR / GGML_F16_ARR 686// number of registers to use per step 687#ifdef GGML_SIMD 688#define GGML_F32_ARR (GGML_F32_STEP/GGML_F32_EPR) 689#define GGML_F16_ARR (GGML_F16_STEP/GGML_F16_EPR) 690#endif 691 692// 693// fundamental operations 694// 695 696inline static void ggml_vec_set_i8 (const int n ,int8_t * x ,const int8_t v ) {for (int i = 0 ;i < n ;++ i )x [i ]= v ; } 697 698inline static void ggml_vec_set_i16 (const int n ,int16_t * x ,const int16_t v ) {for (int i = 0 ;i < n ;++ i )x [i ]= v ; } 699 700inline static void ggml_vec_set_i32 (const int n ,int32_t * x ,const int32_t v ) {for (int i = 0 ;i < n ;++ i )x [i ]= v ; } 701 702inline static void ggml_vec_set_f16 (const int n ,ggml_fp16_t * x ,const int32_t v ) {for (int i = 0 ;i < n ;++ i )x [i ]= v ; } 703 704inline static void ggml_vec_add_f32 (const int n ,float * z ,const float * x ,const float * y ) {for (int i = 0 ;i < n ;++ i )z [i ]= x [i ]+ y [i ]; } 705inline static void ggml_vec_acc_f32 (const int n ,float * y ,const float * x ) {for (int i = 0 ;i < n ;++ i )y [i ]+= x [i ]; } 706inline static void ggml_vec_acc1_f32 (const int n ,float * y ,const float v ) {for (int i = 0 ;i < n ;++ i )y [i ]+= v ; } 707inline static void ggml_vec_sub_f32 (const int n ,float * z ,const float * x ,const float * y ) {for (int i = 0 ;i < n ;++ i )z [i ]= x [i ]- y [i ]; } 708inline static void ggml_vec_set_f32 (const int n ,float * x ,const float v ) {for (int i = 0 ;i < n ;++ i )x [i ]= v ; } 709inline static void ggml_vec_cpy_f32 (const int n ,float * y ,const float * x ) {for (int i = 0 ;i < n ;++ i )y [i ]= x [i ]; } 710inline static void ggml_vec_neg_f32 (const int n ,float * y ,const float * x ) {for (int i = 0 ;i < n ;++ i )y [i ]= - x [i ]; } 711inline static void ggml_vec_mul_f32 (const int n ,float * z ,const float * x ,const float * y ) {for (int i = 0 ;i < n ;++ i )z [i ]= x [i ]* y [i ]; } 712inline static void ggml_vec_div_f32 (const int n ,float * z ,const float * x ,const float * y ) {for (int i = 0 ;i < n ;++ i )z [i ]= x [i ]/y [i ]; } 713 714inline static void ggml_vec_dot_f32 (const int n ,float * restricts ,const float * restrictx ,const float * restricty ) { 715ggml_float sumf = 0.0 ; 716 717#ifdef GGML_SIMD 718const int np = (n & ~(GGML_F32_STEP - 1 )); 719 720GGML_F32_VEC sum [GGML_F32_ARR ]= {GGML_F32_VEC_ZERO }; 721 722GGML_F32_VEC ax [GGML_F32_ARR ]; 723GGML_F32_VEC ay [GGML_F32_ARR ]; 724 725for (int i = 0 ;i < np ;i += GGML_F32_STEP ) { 726for (int j = 0 ;j < GGML_F32_ARR ;j ++ ) { 727ax [j ]= GGML_F32_VEC_LOAD (x + i + j * GGML_F32_EPR ); 728ay [j ]= GGML_F32_VEC_LOAD (y + i + j * GGML_F32_EPR ); 729 730sum [j ]= GGML_F32_VEC_FMA (sum [j ],ax [j ],ay [j ]); 731 } 732 } 733 734// reduce sum0..sum3 to sum0 735GGML_F32_VEC_REDUCE (sumf ,sum ); 736 737// leftovers 738for (int i = np ;i < n ;++ i ) { 739sumf += x [i ]* y [i ]; 740 } 741#else 742// scalar 743for (int i = 0 ;i < n ;++ i ) { 744sumf += x [i ]* y [i ]; 745 } 746#endif 747 748* s = sumf ; 749} 750 751inline static void ggml_vec_dot_f16 (const int n ,float * restricts ,ggml_fp16_t * restrictx ,ggml_fp16_t * restricty ) { 752ggml_float sumf = 0.0 ; 753 754#if defined(GGML_SIMD ) 755const int np = (n & ~(GGML_F16_STEP - 1 )); 756 757GGML_F16_VEC sum [GGML_F16_ARR ]= {GGML_F16_VEC_ZERO }; 758 759GGML_F16_VEC ax [GGML_F16_ARR ]; 760GGML_F16_VEC ay [GGML_F16_ARR ]; 761 762for (int i = 0 ;i < np ;i += GGML_F16_STEP ) { 763for (int j = 0 ;j < GGML_F16_ARR ;j ++ ) { 764ax [j ]= GGML_F16_VEC_LOAD (x + i + j * GGML_F16_EPR ); 765ay [j ]= GGML_F16_VEC_LOAD (y + i + j * GGML_F16_EPR ); 766 767sum [j ]= GGML_F16_VEC_FMA (sum [j ],ax [j ],ay [j ]); 768 } 769 } 770 771// reduce sum0..sum3 to sum0 772GGML_F16_VEC_REDUCE (sumf ,sum ); 773 774// leftovers 775for (int i = np ;i < n ;++ i ) { 776sumf += GGML_FP16_TO_FP32 (x [i ])* GGML_FP16_TO_FP32 (y [i ]); 777 } 778#elif defined(__POWER9_VECTOR__ ) 779// TODO: this is temporary because I cannot fit it in the GGML_SIMD pattern like all other architectures without 780// being able to test it. hoping someone with access to a POWER9 machine can help out here. 781const int n32 = (n & ~31 ); 782 783vector float sum0 = vec_splats (0.0f ); 784 785for (int i = 0 ;i < n32 ;i += 32 ) { 786// Use vec_xl, not vec_ld, because x is sometimes unaligned. 787vector unsigned short x0 = vec_xl (i * 2 + 0 ,x ); 788vector unsigned short x1 = vec_xl (i * 2 + 16 ,x ); 789vector unsigned short x2 = vec_xl (i * 2 + 32 ,x ); 790vector unsigned short x3 = vec_xl (i * 2 + 48 ,x ); 791 792vector unsigned short y0 = vec_xl (i * 2 + 0 ,y ); 793vector unsigned short y1 = vec_xl (i * 2 + 16 ,y ); 794vector unsigned short y2 = vec_xl (i * 2 + 32 ,y ); 795vector unsigned short y3 = vec_xl (i * 2 + 48 ,y ); 796 797vector float fx0l = vec_extract_fp32_from_shortl (x0 ); 798vector float fx0h = vec_extract_fp32_from_shorth (x0 ); 799vector float fx1l = vec_extract_fp32_from_shortl (x1 ); 800vector float fx1h = vec_extract_fp32_from_shorth (x1 ); 801vector float fx2l = vec_extract_fp32_from_shortl (x2 ); 802vector float fx2h = vec_extract_fp32_from_shorth (x2 ); 803vector float fx3l = vec_extract_fp32_from_shortl (x3 ); 804vector float fx3h = vec_extract_fp32_from_shorth (x3 ); 805 806vector float fy0l = vec_extract_fp32_from_shortl (y0 ); 807vector float fy0h = vec_extract_fp32_from_shorth (y0 ); 808vector float fy1l = vec_extract_fp32_from_shortl (y1 ); 809vector float fy1h = vec_extract_fp32_from_shorth (y1 ); 810vector float fy2l = vec_extract_fp32_from_shortl (y2 ); 811vector float fy2h = vec_extract_fp32_from_shorth (y2 ); 812vector float fy3l = vec_extract_fp32_from_shortl (y3 ); 813vector float fy3h = vec_extract_fp32_from_shorth (y3 ); 814 815sum0 = vec_add (sum0 ,vec_mul (fx0l ,fy0l )); 816sum0 = vec_add (sum0 ,vec_mul (fx0h ,fy0h )); 817sum0 = vec_add (sum0 ,vec_mul (fx1l ,fy1l )); 818sum0 = vec_add (sum0 ,vec_mul (fx1h ,fy1h )); 819sum0 = vec_add (sum0 ,vec_mul (fx2l ,fy2l )); 820sum0 = vec_add (sum0 ,vec_mul (fx2h ,fy2h )); 821sum0 = vec_add (sum0 ,vec_mul (fx3l ,fy3l )); 822sum0 = vec_add (sum0 ,vec_mul (fx3h ,fy3h )); 823 } 824 825sumf = vec_extract (sum0 ,0 )+ vec_extract (sum0 ,1 ) 826+ vec_extract (sum0 ,2 )+ vec_extract (sum0 ,3 ); 827 828for (int i = n32 ;i < n ;++ i ) { 829sumf += GGML_FP16_TO_FP32 (x [i ])* GGML_FP16_TO_FP32 (y [i ]); 830 } 831#else 832for (int i = 0 ;i < n ;++ i ) { 833sumf += GGML_FP16_TO_FP32 (x [i ])* GGML_FP16_TO_FP32 (y [i ]); 834 } 835#endif 836 837* s = sumf ; 838} 839 840inline static void ggml_vec_mad_f32 (const int n ,float * restricty ,const float * restrictx ,const float v ) { 841#if defined(GGML_SIMD ) 842const int np = (n & ~(GGML_F32_STEP - 1 )); 843 844GGML_F32_VEC vx = GGML_F32_VEC_SET1 (v ); 845 846GGML_F32_VEC ax [GGML_F32_ARR ]; 847GGML_F32_VEC ay [GGML_F32_ARR ]; 848 849for (int i = 0 ;i < np ;i += GGML_F32_STEP ) { 850for (int j = 0 ;j < GGML_F32_ARR ;j ++ ) { 851ax [j ]= GGML_F32_VEC_LOAD (x + i + j * GGML_F32_EPR ); 852ay [j ]= GGML_F32_VEC_LOAD (y + i + j * GGML_F32_EPR ); 853ay [j ]= GGML_F32_VEC_FMA (ay [j ],ax [j ],vx ); 854 855GGML_F32_VEC_STORE (y + i + j * GGML_F32_EPR ,ay [j ]); 856 } 857 } 858 859// leftovers 860for (int i = np ;i < n ;++ i ) { 861y [i ]+= x [i ]* v ; 862 } 863#else 864// scalar 865for (int i = 0 ;i < n ;++ i ) { 866y [i ]+= x [i ]* v ; 867 } 868#endif 869} 870 871inline static void ggml_vec_mad_f16 (const int n ,ggml_fp16_t * restricty ,ggml_fp16_t * restrictx ,const float v ) { 872#if defined(GGML_SIMD ) 873const int np = (n & ~(GGML_F16_STEP - 1 )); 874 875GGML_F16_VEC vx = GGML_F16_VEC_SET1 (v ); 876 877GGML_F16_VEC ax [GGML_F16_ARR ]; 878GGML_F16_VEC ay [GGML_F16_ARR ]; 879 880for (int i = 0 ;i < np ;i += GGML_F16_STEP ) { 881for (int j = 0 ;j < GGML_F16_ARR ;j ++ ) { 882ax [j ]= GGML_F16_VEC_LOAD (x + i + j * GGML_F16_EPR ); 883ay [j ]= GGML_F16_VEC_LOAD (y + i + j * GGML_F16_EPR ); 884ay [j ]= GGML_F16_VEC_FMA (ay [j ],ax [j ],vx ); 885 886GGML_F16_VEC_STORE (y + i + j * GGML_F16_EPR ,ay [j ]); 887 } 888 } 889 890// leftovers 891for (int i = np ;i < n ;++ i ) { 892GGML_ASSERT (false); 893y [i ]= GGML_FP32_TO_FP16 (GGML_FP16_TO_FP32 (y [i ])+ GGML_FP16_TO_FP32 (x [i ])* v ); 894 } 895#elif defined(__POWER9_VECTOR__ ) 896// TODO: this is temporary because I cannot fit it in the GGML_SIMD pattern like all other architectures without 897// being able to test it. hoping someone with access to a POWER9 machine can help out here. 898const int n32 = (n & ~31 ); 899for (int i = 0 ;i < n32 ;i += 32 ) { 900// Use vec_xl, not vec_ld, because x is sometimes unaligned! 901vector unsigned short x0 = vec_xl (i * 2 + 0 ,x ); 902vector unsigned short x1 = vec_xl (i * 2 + 16 ,x ); 903vector unsigned short x2 = vec_xl (i * 2 + 32 ,x ); 904vector unsigned short x3 = vec_xl (i * 2 + 48 ,x ); 905 906vector unsigned short y0 = vec_xl (i * 2 + 0 ,y ); 907vector unsigned short y1 = vec_xl (i * 2 + 16 ,y ); 908vector unsigned short y2 = vec_xl (i * 2 + 32 ,y ); 909vector unsigned short y3 = vec_xl (i * 2 + 48 ,y ); 910 911vector float v4 = vec_splats (v ); 912 913vector float fx0l = vec_extract_fp32_from_shortl (x0 ); 914vector float fx0h = vec_extract_fp32_from_shorth (x0 ); 915vector float fx1l = vec_extract_fp32_from_shortl (x1 ); 916vector float fx1h = vec_extract_fp32_from_shorth (x1 ); 917vector float fx2l = vec_extract_fp32_from_shortl (x2 ); 918vector float fx2h = vec_extract_fp32_from_shorth (x2 ); 919vector float fx3l = vec_extract_fp32_from_shortl (x3 ); 920vector float fx3h = vec_extract_fp32_from_shorth (x3 ); 921 922vector float fy0l = vec_extract_fp32_from_shortl (y0 ); 923vector float fy0h = vec_extract_fp32_from_shorth (y0 ); 924vector float fy1l = vec_extract_fp32_from_shortl (y1 ); 925vector float fy1h = vec_extract_fp32_from_shorth (y1 ); 926vector float fy2l = vec_extract_fp32_from_shortl (y2 ); 927vector float fy2h = vec_extract_fp32_from_shorth (y2 ); 928vector float fy3l = vec_extract_fp32_from_shortl (y3 ); 929vector float fy3h = vec_extract_fp32_from_shorth (y3 ); 930 931fy0l = vec_madd (fx0l ,v4 ,fy0l ); 932fy0h = vec_madd (fx0h ,v4 ,fy0h ); 933fy1l = vec_madd (fx1l ,v4 ,fy1l ); 934fy1h = vec_madd (fx1h ,v4 ,fy1h ); 935fy2l = vec_madd (fx2l ,v4 ,fy2l ); 936fy2h = vec_madd (fx2h ,v4 ,fy2h ); 937fy3l = vec_madd (fx3l ,v4 ,fy3l ); 938fy3h = vec_madd (fx3h ,v4 ,fy3h ); 939 940y0 = vec_pack_to_short_fp32 (fy0h ,fy0l ); 941y1 = vec_pack_to_short_fp32 (fy1h ,fy1l ); 942y2 = vec_pack_to_short_fp32 (fy2h ,fy2l ); 943y3 = vec_pack_to_short_fp32 (fy3h ,fy3l ); 944 945vec_xst (y0 ,i * 2 + 0 ,y ); 946vec_xst (y1 ,i * 2 + 16 ,y ); 947vec_xst (y2 ,i * 2 + 32 ,y ); 948vec_xst (y3 ,i * 2 + 48 ,y ); 949 } 950 951for (int i = n32 ;i < n ;++ i ) { 952y [i ]= GGML_FP32_TO_FP16 (GGML_FP16_TO_FP32 (y [i ])+ GGML_FP16_TO_FP32 (x [i ])* v ); 953 } 954#else 955for (int i = 0 ;i < n ;++ i ) { 956y [i ]= GGML_FP32_TO_FP16 (GGML_FP16_TO_FP32 (y [i ])+ GGML_FP16_TO_FP32 (x [i ])* v ); 957 } 958#endif 959} 960 961//inline static void ggml_vec_scale_f32(const int n, float * y, const float v) { for (int i = 0; i < n; ++i) y[i] *= v; } 962inline static void ggml_vec_scale_f32 (const int n ,float * y ,const float v ) { 963#if defined(GGML_SIMD ) 964const int np = (n & ~(GGML_F32_STEP - 1 )); 965 966GGML_F32_VEC vx = GGML_F32_VEC_SET1 (v ); 967 968GGML_F32_VEC ay [GGML_F32_ARR ]; 969 970for (int i = 0 ;i < np ;i += GGML_F32_STEP ) { 971for (int j = 0 ;j < GGML_F32_ARR ;j ++ ) { 972ay [j ]= GGML_F32_VEC_LOAD (y + i + j * GGML_F32_EPR ); 973ay [j ]= GGML_F32_VEC_MUL (ay [j ],vx ); 974 975GGML_F32_VEC_STORE (y + i + j * GGML_F32_EPR ,ay [j ]); 976 } 977 } 978 979// leftovers 980for (int i = np ;i < n ;++ i ) { 981y [i ] *=v ; 982 } 983#else 984// scalar 985for (int i = 0 ;i < n ;++ i ) { 986y [i ] *=v ; 987 } 988#endif 989} 990 991inline static void ggml_vec_norm_f32 (const int n ,float * s ,const float * x ) {ggml_vec_dot_f32 (n ,s ,x ,x );* s = sqrt (* s ); } 992inline static void ggml_vec_sqr_f32 (const int n ,float * y ,const float * x ) {for (int i = 0 ;i < n ;++ i )y [i ]= x [i ]* x [i ]; } 993inline static void ggml_vec_sqrt_f32 (const int n ,float * y ,const float * x ) {for (int i = 0 ;i < n ;++ i )y [i ]= sqrt (x [i ]); } 994inline static void ggml_vec_abs_f32 (const int n ,float * y ,const float * x ) {for (int i = 0 ;i < n ;++ i )y [i ]= fabsf (x [i ]); } 995inline static void ggml_vec_sgn_f32 (const int n ,float * y ,const float * x ) {for (int i = 0 ;i < n ;++ i )y [i ]= (x [i ]> 0.f ) ?1.f : ((x [i ]< 0.f ) ?-1.f :0.f ); } 996inline static void ggml_vec_step_f32 (const int n ,float * y ,const float * x ) {for (int i = 0 ;i < n ;++ i )y [i ]= (x [i ]> 0.f ) ?1.f :0.f ; } 997inline static void ggml_vec_relu_f32 (const int n ,float * y ,const float * x ) {for (int i = 0 ;i < n ;++ i )y [i ]= (x [i ]> 0.f ) ?x [i ] :0.f ; } 998 999static const ggml_float GELU_COEF_A = 0.044715 ; 1000static const ggml_float SQRT_2_OVER_PI = 0.79788456080286535587989211986876 ; 1001 1002inline static float ggml_gelu_f32 (float x ) { 1003return 0.5 * x * (1.0 + tanh (SQRT_2_OVER_PI * x * (1.0 + GELU_COEF_A * x * x ))); 1004} 1005 1006inline static void ggml_vec_gelu_f16 (const int n ,ggml_fp16_t * y ,const ggml_fp16_t * x ) { 1007const uint16_t * i16 = (const uint16_t * )x ; 1008for (int i = 0 ;i < n ;++ i ) { 1009y [i ]= table_gelu_f16 [i16 [i ]]; 1010 } 1011} 1012 1013#ifdef GGML_GELU_FP16 1014inline static void ggml_vec_gelu_f32 (const int n ,float * y ,const float * x ) { 1015uint16_t t ; 1016for (int i = 0 ;i < n ;++ i ) { 1017ggml_fp16_t fp16 = GGML_FP32_TO_FP16 (x [i ]); 1018memcpy (& t ,& fp16 ,sizeof (uint16_t )); 1019y [i ]= GGML_FP16_TO_FP32 (table_gelu_f16 [t ]); 1020 } 1021} 1022#else 1023inline static void ggml_vec_gelu_f32 (const int n ,float * y ,const float * x ) { 1024for (int i = 0 ;i < n ;++ i ) { 1025y [i ]= ggml_gelu_f32 (x [i ]); 1026 } 1027} 1028#endif 1029 1030inline static void ggml_vec_sum_f32 (const int n ,float * s ,const float * x ) {ggml_float sum = 0.0 ;for (int i = 0 ;i < n ;++ i )sum += x [i ];* s += sum ; } 1031inline static void ggml_vec_norm_inv_f32 (const int n ,float * s ,const float * x ) {ggml_vec_norm_f32 (n ,s ,x );* s = 1. /(* s ); } 1032 1033// 1034// logging 1035// 1036 1037#if (GGML_DEBUG >=1 ) 1038#define GGML_PRINT_DEBUG (...) printf(__VA_ARGS__) 1039#else 1040#define GGML_PRINT_DEBUG (...) 1041#endif 1042 1043#if (GGML_DEBUG >=5 ) 1044#define GGML_PRINT_DEBUG_5 (...) printf(__VA_ARGS__) 1045#else 1046#define GGML_PRINT_DEBUG_5 (...) 1047#endif 1048 1049#if (GGML_DEBUG >=10 ) 1050#define GGML_PRINT_DEBUG_10 (...) printf(__VA_ARGS__) 1051#else 1052#define GGML_PRINT_DEBUG_10 (...) 1053#endif 1054 1055#define GGML_PRINT (...) logDebug( __VA_ARGS__ ) 1056 1057// 1058// data types 1059// 1060 1061static const size_t GGML_TYPE_SIZE [GGML_TYPE_COUNT ]= { 1062sizeof (int8_t ), 1063sizeof (int16_t ), 1064sizeof (int32_t ), 1065sizeof (ggml_fp16_t ), 1066sizeof (float ), 1067}; 1068 1069static const char * GGML_OP_LABEL [GGML_OP_COUNT ]= { 1070"NONE" , 1071 1072"DUP" , 1073"ADD" , 1074"SUB" , 1075"MUL" , 1076"DIV" , 1077"SQR" , 1078"SQRT" , 1079"SUM" , 1080"MEAN" , 1081"REPEAT" , 1082"ABS" , 1083"SGN" , 1084"NEG" , 1085"STEP" , 1086"RELU" , 1087"GELU" , 1088"NORM" , 1089 1090"MUL_MAT" , 1091 1092"SCALE" , 1093"CPY" , 1094"RESHAPE" , 1095"VIEW" , 1096"PERMUTE" , 1097"TRANSPOSE" , 1098"GET_ROWS" , 1099"DIAG_MASK_INF" , 1100"SOFT_MAX" , 1101"ROPE" , 1102"CONV_1D_1S" , 1103"CONV_1D_2S" , 1104 1105"FLASH_ATTN" , 1106"FLASH_FF" , 1107}; 1108 1109static const char * GGML_OP_SYMBOL [GGML_OP_COUNT ]= { 1110"none" , 1111 1112"x" , 1113"x+y" , 1114"x-y" , 1115"x*y" , 1116"x/y" , 1117"x^2" , 1118"√x" , 1119"Σx" , 1120"Σx/n" , 1121"repeat(x)" , 1122"abs(x)" , 1123"sgn(x)" , 1124"-x" , 1125"step(x)" , 1126"relu(x)" , 1127"gelu(x)" , 1128"norm(x)" , 1129 1130"X*Y" , 1131 1132"x*v" , 1133"x-\\>y" , 1134"reshape(x)" , 1135"view(x)" , 1136"permute(x)" , 1137"transpose(x)" , 1138"get_rows(x)" , 1139"diag_mask_inf(x)" , 1140"soft_max(x)" , 1141"rope(x)" , 1142"conv_1d_1s(x)" , 1143"conv_1d_2s(x)" , 1144 1145"flash_attn(x)" , 1146"flash_ff(x)" , 1147}; 1148 1149// 1150// ggml object 1151// 1152 1153struct ggml_object { 1154size_t offset ; 1155size_t size ; 1156 1157struct ggml_object * next ; 1158 1159char padding [8 ]; 1160}; 1161 1162static const size_t GGML_OBJECT_SIZE = sizeof (struct ggml_object ); 1163 1164static_assert (sizeof (struct ggml_object )%GGML_MEM_ALIGN == 0 ,"ggml_object size must be a multiple of GGML_MEM_ALIGN" ); 1165static_assert (sizeof (struct ggml_tensor )%GGML_MEM_ALIGN == 0 ,"ggml_tensor size must be a multiple of GGML_MEM_ALIGN" ); 1166 1167// 1168// ggml context 1169// 1170 1171struct ggml_context { 1172size_t mem_size ; 1173void * mem_buffer ; 1174bool mem_buffer_owned ; 1175 1176int n_objects ; 1177 1178struct ggml_object * objects_begin ; 1179struct ggml_object * objects_end ; 1180}; 1181 1182struct ggml_context_container { 1183bool used ; 1184 1185struct ggml_context context ; 1186}; 1187 1188// 1189// compute types 1190// 1191 1192enum ggml_task_type { 1193GGML_TASK_INIT = 0 , 1194GGML_TASK_COMPUTE , 1195GGML_TASK_FINALIZE , 1196}; 1197 1198struct ggml_compute_params { 1199enum ggml_task_type type ; 1200 1201int ith ,nth ; 1202 1203// work buffer for all threads 1204size_t wsize ; 1205void * wdata ; 1206}; 1207 1208// 1209// ggml state 1210// 1211 1212struct ggml_state { 1213struct ggml_context_container contexts [GGML_MAX_CONTEXTS ]; 1214}; 1215 1216// global state 1217static struct ggml_state g_state ; 1218static atomic_int g_state_barrier = 0 ; 1219 1220// barrier via spin lock 1221inline static void ggml_critical_section_start () { 1222int processing = atomic_fetch_add (& g_state_barrier ,1 ); 1223 1224while (processing > 0 ) { 1225// wait for other threads to finish 1226atomic_fetch_sub (& g_state_barrier ,1 ); 1227sched_yield ();// TODO: reconsider this 1228processing = atomic_fetch_add (& g_state_barrier ,1 ); 1229 } 1230} 1231 1232// TODO: make this somehow automatically executed 1233// some sort of "sentry" mechanism 1234inline static void ggml_critical_section_end () { 1235atomic_fetch_sub (& g_state_barrier ,1 ); 1236} 1237 1238//////////////////////////////////////////////////////////////////////////////// 1239 1240void ggml_print_object (const struct ggml_object * obj ) { 1241GGML_PRINT (" - ggml_object: offset = %zu, size = %zu, next = %p\n" , 1242obj -> offset ,obj -> size , (const void * )obj -> next ); 1243} 1244 1245void ggml_print_objects (const struct ggml_context * ctx ) { 1246struct ggml_object * obj = ctx -> objects_begin ; 1247 1248GGML_PRINT ("%s: objects in context %p:\n" ,__func__ , (const void * )ctx ); 1249 1250while (obj != NULL ) { 1251ggml_print_object (obj ); 1252obj = obj -> next ; 1253 } 1254 1255GGML_PRINT ("%s: --- end ---\n" ,__func__ ); 1256} 1257 1258int ggml_nelements (const struct ggml_tensor * tensor ) { 1259static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 1260 1261return tensor -> ne [0 ]* tensor -> ne [1 ]* tensor -> ne [2 ]* tensor -> ne [3 ]; 1262} 1263 1264int ggml_nrows (const struct ggml_tensor * tensor ) { 1265static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 1266 1267return tensor -> ne [1 ]* tensor -> ne [2 ]* tensor -> ne [3 ]; 1268} 1269 1270size_t ggml_nbytes (const struct ggml_tensor * tensor ) { 1271static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 1272 1273return ggml_nelements (tensor )* GGML_TYPE_SIZE [tensor -> type ]; 1274} 1275 1276size_t ggml_type_size (enum ggml_type type ) { 1277return GGML_TYPE_SIZE [type ]; 1278} 1279 1280size_t ggml_element_size (const struct ggml_tensor * tensor ) { 1281return GGML_TYPE_SIZE [tensor -> type ]; 1282} 1283 1284bool ggml_is_scalar (const struct ggml_tensor * tensor ) { 1285static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 1286 1287return tensor -> ne [0 ]== 1 && tensor -> ne [1 ]== 1 && tensor -> ne [2 ]== 1 && tensor -> ne [3 ]== 1 ; 1288} 1289 1290bool ggml_is_vector (const struct ggml_tensor * tensor ) { 1291static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 1292 1293return tensor -> ne [1 ]== 1 && tensor -> ne [2 ]== 1 && tensor -> ne [3 ]== 1 ; 1294} 1295 1296bool ggml_is_matrix (const struct ggml_tensor * tensor ) { 1297static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 1298 1299return tensor -> ne [2 ]== 1 && tensor -> ne [3 ]== 1 ; 1300} 1301 1302bool ggml_can_mul_mat (const struct ggml_tensor * t0 ,const struct ggml_tensor * t1 ) { 1303static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 1304 1305return 1306 (t0 -> ne [0 ]== t1 -> ne [0 ])&& 1307 (t0 -> ne [2 ]== t1 -> ne [2 ])&& 1308 (t0 -> ne [3 ]== t1 -> ne [3 ]); 1309} 1310 1311bool ggml_is_contiguous (const struct ggml_tensor * tensor ) { 1312static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 1313 1314return 1315tensor -> nb [0 ]== GGML_TYPE_SIZE [tensor -> type ]&& 1316tensor -> nb [1 ]== tensor -> nb [0 ]* tensor -> ne [0 ]&& 1317tensor -> nb [2 ]== tensor -> nb [1 ]* tensor -> ne [1 ]&& 1318tensor -> nb [3 ]== tensor -> nb [2 ]* tensor -> ne [2 ]; 1319} 1320 1321bool ggml_is_padded_1d (const struct ggml_tensor * tensor ) { 1322static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 1323 1324return 1325tensor -> nb [0 ]== GGML_TYPE_SIZE [tensor -> type ]&& 1326tensor -> nb [2 ]== tensor -> nb [1 ]* tensor -> ne [1 ]&& 1327tensor -> nb [3 ]== tensor -> nb [2 ]* tensor -> ne [2 ]; 1328} 1329 1330bool ggml_are_same_shape (const struct ggml_tensor * t0 ,const struct ggml_tensor * t1 ) { 1331static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 1332 1333return 1334 (t0 -> ne [0 ]== t1 -> ne [0 ] )&& 1335 (t0 -> ne [1 ]== t1 -> ne [1 ] )&& 1336 (t0 -> ne [2 ]== t1 -> ne [2 ] )&& 1337 (t0 -> ne [3 ]== t1 -> ne [3 ] ); 1338} 1339 1340// check if t1 can be represented as a repeatition of t0 1341bool ggml_can_repeat (const struct ggml_tensor * t0 ,const struct ggml_tensor * t1 ) { 1342static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 1343 1344return 1345 (t1 -> ne [0 ]%t0 -> ne [0 ]== 0 )&& 1346 (t1 -> ne [1 ]%t0 -> ne [1 ]== 0 )&& 1347 (t1 -> ne [2 ]%t0 -> ne [2 ]== 0 )&& 1348 (t1 -> ne [3 ]%t0 -> ne [3 ]== 0 ); 1349} 1350 1351int ggml_up32 (int n ) { 1352return (n + 31 )& ~31 ; 1353} 1354 1355int ggml_up64 (int n ) { 1356return (n + 63 )& ~63 ; 1357} 1358 1359// assert that pointer is aligned to GGML_MEM_ALIGN 1360#define ggml_assert_aligned (ptr ) \ 1361 assert(((uintptr_t) (ptr))%GGML_MEM_ALIGN == 0) 1362 1363//////////////////////////////////////////////////////////////////////////////// 1364 1365struct ggml_context * ggml_init (struct ggml_init_params params ) { 1366// make this function thread safe 1367ggml_critical_section_start (); 1368 1369static bool is_first_call = true; 1370 1371if (is_first_call ) { 1372// initialize GELU and EXP tables 1373 { 1374const uint64_t t_start = ggml_time_us ();UNUSED (t_start ); 1375 1376ggml_fp16_t ii ; 1377for (int i = 0 ;i < (1 <<16 );++ i ) { 1378uint16_t ui = i ; 1379memcpy (& ii ,& ui ,sizeof (ii )); 1380const float f = GGML_FP16_TO_FP32 (ii ); 1381table_gelu_f16 [i ]= GGML_FP32_TO_FP16 (ggml_gelu_f32 (f )); 1382table_exp_f16 [i ]= GGML_FP32_TO_FP16 (exp (f )); 1383 } 1384 1385const uint64_t t_end = ggml_time_us ();UNUSED (t_end ); 1386 1387GGML_PRINT_DEBUG ("%s: GELU and EXP tables initialized in %f ms\n" ,__func__ , (t_end - t_start )/1000.0f ); 1388 } 1389 1390// initialize g_state 1391 { 1392const uint64_t t_start = ggml_time_us ();UNUSED (t_start ); 1393 1394g_state = (struct ggml_state ) { 1395/*.contexts =*/ {0 }, 1396 }; 1397 1398for (int i = 0 ;i < GGML_MAX_CONTEXTS ;++ i ) { 1399g_state .contexts [i ].used = false; 1400 } 1401 1402const uint64_t t_end = ggml_time_us ();UNUSED (t_end ); 1403 1404GGML_PRINT_DEBUG ("%s: g_state initialized in %f ms\n" ,__func__ , (t_end - t_start )/1000.0f ); 1405 } 1406 1407is_first_call = false; 1408 } 1409 1410// find non-used context in g_state 1411struct ggml_context * ctx = NULL ; 1412 1413for (int i = 0 ;i < GGML_MAX_CONTEXTS ;i ++ ) { 1414if (!g_state .contexts [i ].used ) { 1415g_state .contexts [i ].used = true; 1416ctx = & g_state .contexts [i ].context ; 1417 1418GGML_PRINT_DEBUG ("%s: found unused context %d\n" ,__func__ ,i ); 1419break ; 1420 } 1421 } 1422 1423if (ctx == NULL ) { 1424GGML_PRINT_DEBUG ("%s: no unused context found\n" ,__func__ ); 1425 1426ggml_critical_section_end (); 1427 1428return NULL ; 1429 } 1430 1431* ctx = (struct ggml_context ) { 1432 .mem_size = params .mem_size , 1433 .mem_buffer = params .mem_buffer ?params .mem_buffer :malloc (params .mem_size ), 1434 .mem_buffer_owned = params .mem_buffer ? false : true, 1435 .n_objects = 0 , 1436 .objects_begin = NULL , 1437 .objects_end = NULL , 1438 }; 1439 1440ggml_assert_aligned (ctx -> mem_buffer ); 1441 1442GGML_PRINT_DEBUG ("%s: context initialized\n" ,__func__ ); 1443 1444ggml_critical_section_end (); 1445 1446return ctx ; 1447} 1448 1449void ggml_free (struct ggml_context * ctx ) { 1450// make this function thread safe 1451ggml_critical_section_start (); 1452 1453bool found = false; 1454 1455for (int i = 0 ;i < GGML_MAX_CONTEXTS ;i ++ ) { 1456if (& g_state .contexts [i ].context == ctx ) { 1457g_state .contexts [i ].used = false; 1458 1459GGML_PRINT_DEBUG ("%s: context %d with %d objects has been freed. memory used = %zu\n" , 1460__func__ ,i ,ctx -> n_objects ,ctx -> objects_end -> offset + ctx -> objects_end -> size ); 1461 1462if (ctx -> mem_buffer_owned ) { 1463free (ctx -> mem_buffer ); 1464 } 1465 1466found = true; 1467break ; 1468 } 1469 } 1470 1471if (!found ) { 1472GGML_PRINT_DEBUG ("%s: context not found\n" ,__func__ ); 1473 } 1474 1475ggml_critical_section_end (); 1476} 1477 1478size_t ggml_used_mem (const struct ggml_context * ctx ) { 1479return ctx -> objects_end -> offset + ctx -> objects_end -> size ; 1480} 1481 1482//////////////////////////////////////////////////////////////////////////////// 1483 1484struct ggml_tensor * ggml_new_tensor_impl ( 1485struct ggml_context * ctx , 1486enum ggml_type type , 1487int n_dims , 1488const int * ne , 1489void * data ) { 1490// always insert objects at the end of the context's memory pool 1491struct ggml_object * obj_cur = ctx -> objects_end ; 1492 1493const size_t cur_offset = obj_cur == NULL ?0 :obj_cur -> offset ; 1494const size_t cur_size = obj_cur == NULL ?0 :obj_cur -> size ; 1495const size_t cur_end = cur_offset + cur_size ; 1496 1497size_t size_needed = 0 ; 1498 1499if (data == NULL ) { 1500size_needed += GGML_TYPE_SIZE [type ]; 1501for (int i = 0 ;i < n_dims ;i ++ ) { 1502size_needed *=ne [i ]; 1503 } 1504// align to GGML_MEM_ALIGN 1505size_needed = ((size_needed + GGML_MEM_ALIGN - 1 )/GGML_MEM_ALIGN )* GGML_MEM_ALIGN ; 1506 1507 } 1508size_needed += sizeof (struct ggml_tensor ); 1509 1510if (cur_end + size_needed + GGML_OBJECT_SIZE > ctx -> mem_size ) { 1511GGML_PRINT ("%s: not enough space in the context's memory pool\n" ,__func__ ); 1512assert (false); 1513return NULL ; 1514 } 1515 1516char * const mem_buffer = ctx -> mem_buffer ; 1517 1518struct ggml_object * const obj_new = (struct ggml_object * )(mem_buffer + cur_end ); 1519 1520* obj_new = (struct ggml_object ) { 1521 .offset = cur_end + GGML_OBJECT_SIZE , 1522 .size = size_needed , 1523 .next = NULL , 1524 }; 1525 1526if (obj_cur != NULL ) { 1527obj_cur -> next = obj_new ; 1528 }else { 1529// this is the first object in this context 1530ctx -> objects_begin = obj_new ; 1531 } 1532 1533ctx -> objects_end = obj_new ; 1534 1535//GGML_PRINT_DEBUG("%s: inserted new object at %zu\n", __func__, cur_end); 1536 1537struct ggml_tensor * const result = (struct ggml_tensor * )(mem_buffer + obj_new -> offset ); 1538 1539ggml_assert_aligned (result ); 1540 1541* result = (struct ggml_tensor ) { 1542/*.type =*/ type , 1543/*.n_dims =*/ n_dims , 1544/*.ne =*/ {1 ,1 ,1 ,1 }, 1545/*.nb =*/ {0 ,0 ,0 ,0 }, 1546/*.op =*/ GGML_OP_NONE , 1547/*.is_param =*/ false, 1548/*.grad =*/ NULL , 1549/*.src0 =*/ NULL , 1550/*.src1 =*/ NULL , 1551/*.opt =*/ {NULL }, 1552/*.n_tasks =*/ 0 , 1553/*.perf_runs =*/ 0 , 1554/*.perf_cycles =*/ 0 , 1555/*.perf_time_us =*/ 0 , 1556/*.data =*/ data == NULL ? (void * )(result + 1 ) :data , 1557/*.pad =*/ {0 }, 1558 }; 1559 1560ggml_assert_aligned (result -> data ); 1561 1562for (int i = 0 ;i < n_dims ;i ++ ) { 1563result -> ne [i ]= ne [i ]; 1564 } 1565 1566result -> nb [0 ]= GGML_TYPE_SIZE [type ]; 1567for (int i = 1 ;i < GGML_MAX_DIMS ;i ++ ) { 1568result -> nb [i ]= result -> nb [i - 1 ]* result -> ne [i - 1 ]; 1569 } 1570 1571ctx -> n_objects ++ ; 1572 1573return result ; 1574} 1575 1576struct ggml_tensor * ggml_new_tensor ( 1577struct ggml_context * ctx , 1578enum ggml_type type , 1579int n_dims , 1580const int * ne ) { 1581return ggml_new_tensor_impl (ctx ,type ,n_dims ,ne ,NULL ); 1582} 1583 1584struct ggml_tensor * ggml_new_tensor_1d ( 1585struct ggml_context * ctx , 1586enum ggml_type type , 1587int ne0 ) { 1588return ggml_new_tensor (ctx ,type ,1 ,& ne0 ); 1589} 1590 1591struct ggml_tensor * ggml_new_tensor_2d ( 1592struct ggml_context * ctx , 1593enum ggml_type type , 1594int ne0 , 1595int ne1 ) { 1596const int ne [2 ]= {ne0 ,ne1 }; 1597return ggml_new_tensor (ctx ,type ,2 ,ne ); 1598} 1599 1600struct ggml_tensor * ggml_new_tensor_3d ( 1601struct ggml_context * ctx , 1602enum ggml_type type , 1603int ne0 , 1604int ne1 , 1605int ne2 ) { 1606const int ne [3 ]= {ne0 ,ne1 ,ne2 }; 1607return ggml_new_tensor (ctx ,type ,3 ,ne ); 1608} 1609 1610struct ggml_tensor * ggml_new_tensor_4d ( 1611struct ggml_context * ctx , 1612enum ggml_type type , 1613int ne0 , 1614int ne1 , 1615int ne2 , 1616int ne3 ) { 1617const int ne [4 ]= {ne0 ,ne1 ,ne2 ,ne3 }; 1618return ggml_new_tensor (ctx ,type ,4 ,ne ); 1619} 1620 1621struct ggml_tensor * ggml_new_i32 (struct ggml_context * ctx ,int32_t value ) { 1622struct ggml_tensor * result = ggml_new_tensor_1d (ctx ,GGML_TYPE_I32 ,1 ); 1623 1624ggml_set_i32 (result ,value ); 1625 1626return result ; 1627} 1628 1629struct ggml_tensor * ggml_new_f32 (struct ggml_context * ctx ,float value ) { 1630struct ggml_tensor * result = ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,1 ); 1631 1632ggml_set_f32 (result ,value ); 1633 1634return result ; 1635} 1636 1637struct ggml_tensor * ggml_dup_tensor (struct ggml_context * ctx ,const struct ggml_tensor * src ) { 1638return ggml_new_tensor_impl (ctx ,src -> type ,src -> n_dims ,src -> ne ,NULL ); 1639} 1640 1641struct ggml_tensor * ggml_set_zero (struct ggml_tensor * tensor ) { 1642memset (tensor -> data ,0 ,ggml_nbytes (tensor )); 1643return tensor ; 1644} 1645 1646struct ggml_tensor * ggml_set_i32 (struct ggml_tensor * tensor ,int32_t value ) { 1647const int n = ggml_nrows (tensor ); 1648const int nc = tensor -> ne [0 ]; 1649const size_t n1 = tensor -> nb [1 ]; 1650 1651char * const data = tensor -> data ; 1652 1653switch (tensor -> type ) { 1654case GGML_TYPE_I8 : 1655 { 1656assert (tensor -> nb [0 ]== sizeof (int8_t )); 1657for (int i = 0 ;i < n ;i ++ ) { 1658ggml_vec_set_i8 (nc , (int8_t * )(data + i * n1 ),value ); 1659 } 1660 }break ; 1661case GGML_TYPE_I16 : 1662 { 1663assert (tensor -> nb [0 ]== sizeof (int16_t )); 1664for (int i = 0 ;i < n ;i ++ ) { 1665ggml_vec_set_i16 (nc , (int16_t * )(data + i * n1 ),value ); 1666 } 1667 }break ; 1668case GGML_TYPE_I32 : 1669 { 1670assert (tensor -> nb [0 ]== sizeof (int32_t )); 1671for (int i = 0 ;i < n ;i ++ ) { 1672ggml_vec_set_i32 (nc , (int32_t * )(data + i * n1 ),value ); 1673 } 1674 }break ; 1675case GGML_TYPE_F16 : 1676 { 1677assert (tensor -> nb [0 ]== sizeof (ggml_fp16_t )); 1678for (int i = 0 ;i < n ;i ++ ) { 1679ggml_vec_set_f16 (nc , (ggml_fp16_t * )(data + i * n1 ),value ); 1680 } 1681 }break ; 1682case GGML_TYPE_F32 : 1683 { 1684assert (tensor -> nb [0 ]== sizeof (float )); 1685for (int i = 0 ;i < n ;i ++ ) { 1686ggml_vec_set_f32 (nc , (float * )(data + i * n1 ),value ); 1687 } 1688 }break ; 1689case GGML_TYPE_COUNT : 1690 { 1691assert (false); 1692 }break ; 1693 } 1694 1695return tensor ; 1696} 1697 1698struct ggml_tensor * ggml_set_f32 (struct ggml_tensor * tensor ,float value ) { 1699const int n = ggml_nrows (tensor ); 1700const int nc = tensor -> ne [0 ]; 1701const size_t n1 = tensor -> nb [1 ]; 1702 1703char * const data = tensor -> data ; 1704 1705switch (tensor -> type ) { 1706case GGML_TYPE_I8 : 1707 { 1708assert (tensor -> nb [0 ]== sizeof (int8_t )); 1709for (int i = 0 ;i < n ;i ++ ) { 1710ggml_vec_set_i8 (nc , (int8_t * )(data + i * n1 ),value ); 1711 } 1712 }break ; 1713case GGML_TYPE_I16 : 1714 { 1715assert (tensor -> nb [0 ]== sizeof (int16_t )); 1716for (int i = 0 ;i < n ;i ++ ) { 1717ggml_vec_set_i16 (nc , (int16_t * )(data + i * n1 ),value ); 1718 } 1719 }break ; 1720case GGML_TYPE_I32 : 1721 { 1722assert (tensor -> nb [0 ]== sizeof (int32_t )); 1723for (int i = 0 ;i < n ;i ++ ) { 1724ggml_vec_set_i32 (nc , (int32_t * )(data + i * n1 ),value ); 1725 } 1726 }break ; 1727case GGML_TYPE_F16 : 1728 { 1729assert (tensor -> nb [0 ]== sizeof (ggml_fp16_t )); 1730for (int i = 0 ;i < n ;i ++ ) { 1731ggml_vec_set_f16 (nc , (ggml_fp16_t * )(data + i * n1 ),value ); 1732 } 1733 }break ; 1734case GGML_TYPE_F32 : 1735 { 1736assert (tensor -> nb [0 ]== sizeof (float )); 1737for (int i = 0 ;i < n ;i ++ ) { 1738ggml_vec_set_f32 (nc , (float * )(data + i * n1 ),value ); 1739 } 1740 }break ; 1741case GGML_TYPE_COUNT : 1742 { 1743assert (false); 1744 }break ; 1745 } 1746 1747return tensor ; 1748} 1749 1750int32_t ggml_get_i32_1d (const struct ggml_tensor * tensor ,int i ) { 1751switch (tensor -> type ) { 1752case GGML_TYPE_I8 : 1753 { 1754GGML_ASSERT (tensor -> nb [0 ]== sizeof (int8_t )); 1755return ((int8_t * )(tensor -> data ))[i ]; 1756 }break ; 1757case GGML_TYPE_I16 : 1758 { 1759GGML_ASSERT (tensor -> nb [0 ]== sizeof (int16_t )); 1760return ((int16_t * )(tensor -> data ))[i ]; 1761 }break ; 1762case GGML_TYPE_I32 : 1763 { 1764GGML_ASSERT (tensor -> nb [0 ]== sizeof (int32_t )); 1765return ((int32_t * )(tensor -> data ))[i ]; 1766 }break ; 1767case GGML_TYPE_F16 : 1768 { 1769GGML_ASSERT (tensor -> nb [0 ]== sizeof (ggml_fp16_t )); 1770return GGML_FP16_TO_FP32 (((ggml_fp16_t * )(tensor -> data ))[i ]); 1771 }break ; 1772case GGML_TYPE_F32 : 1773 { 1774GGML_ASSERT (tensor -> nb [0 ]== sizeof (float )); 1775return ((float * )(tensor -> data ))[i ]; 1776 }break ; 1777case GGML_TYPE_COUNT : 1778 { 1779GGML_ASSERT (false); 1780 }break ; 1781 } 1782 1783return 0.0f ; 1784} 1785 1786void ggml_set_i32_1d (const struct ggml_tensor * tensor ,int i ,int32_t value ) { 1787switch (tensor -> type ) { 1788case GGML_TYPE_I8 : 1789 { 1790GGML_ASSERT (tensor -> nb [0 ]== sizeof (int8_t )); 1791 ((int8_t * )(tensor -> data ))[i ]= value ; 1792 }break ; 1793case GGML_TYPE_I16 : 1794 { 1795GGML_ASSERT (tensor -> nb [0 ]== sizeof (int16_t )); 1796 ((int16_t * )(tensor -> data ))[i ]= value ; 1797 }break ; 1798case GGML_TYPE_I32 : 1799 { 1800GGML_ASSERT (tensor -> nb [0 ]== sizeof (int32_t )); 1801 ((int32_t * )(tensor -> data ))[i ]= value ; 1802 }break ; 1803case GGML_TYPE_F16 : 1804 { 1805GGML_ASSERT (tensor -> nb [0 ]== sizeof (ggml_fp16_t )); 1806 ((ggml_fp16_t * )(tensor -> data ))[i ]= GGML_FP32_TO_FP16 (value ); 1807 }break ; 1808case GGML_TYPE_F32 : 1809 { 1810GGML_ASSERT (tensor -> nb [0 ]== sizeof (float )); 1811 ((float * )(tensor -> data ))[i ]= value ; 1812 }break ; 1813case GGML_TYPE_COUNT : 1814 { 1815GGML_ASSERT (false); 1816 }break ; 1817 } 1818} 1819 1820float ggml_get_f32_1d (const struct ggml_tensor * tensor ,int i ) { 1821switch (tensor -> type ) { 1822case GGML_TYPE_I8 : 1823 { 1824GGML_ASSERT (tensor -> nb [0 ]== sizeof (int8_t )); 1825return ((int8_t * )(tensor -> data ))[i ]; 1826 }break ; 1827case GGML_TYPE_I16 : 1828 { 1829GGML_ASSERT (tensor -> nb [0 ]== sizeof (int16_t )); 1830return ((int16_t * )(tensor -> data ))[i ]; 1831 }break ; 1832case GGML_TYPE_I32 : 1833 { 1834GGML_ASSERT (tensor -> nb [0 ]== sizeof (int32_t )); 1835return ((int32_t * )(tensor -> data ))[i ]; 1836 }break ; 1837case GGML_TYPE_F16 : 1838 { 1839GGML_ASSERT (tensor -> nb [0 ]== sizeof (ggml_fp16_t )); 1840return GGML_FP16_TO_FP32 (((ggml_fp16_t * )(tensor -> data ))[i ]); 1841 }break ; 1842case GGML_TYPE_F32 : 1843 { 1844GGML_ASSERT (tensor -> nb [0 ]== sizeof (float )); 1845return ((float * )(tensor -> data ))[i ]; 1846 }break ; 1847case GGML_TYPE_COUNT : 1848 { 1849GGML_ASSERT (false); 1850 }break ; 1851 } 1852 1853return 0.0f ; 1854} 1855 1856void ggml_set_f32_1d (const struct ggml_tensor * tensor ,int i ,float value ) { 1857switch (tensor -> type ) { 1858case GGML_TYPE_I8 : 1859 { 1860GGML_ASSERT (tensor -> nb [0 ]== sizeof (int8_t )); 1861 ((int8_t * )(tensor -> data ))[i ]= value ; 1862 }break ; 1863case GGML_TYPE_I16 : 1864 { 1865GGML_ASSERT (tensor -> nb [0 ]== sizeof (int16_t )); 1866 ((int16_t * )(tensor -> data ))[i ]= value ; 1867 }break ; 1868case GGML_TYPE_I32 : 1869 { 1870GGML_ASSERT (tensor -> nb [0 ]== sizeof (int32_t )); 1871 ((int32_t * )(tensor -> data ))[i ]= value ; 1872 }break ; 1873case GGML_TYPE_F16 : 1874 { 1875GGML_ASSERT (tensor -> nb [0 ]== sizeof (ggml_fp16_t )); 1876 ((ggml_fp16_t * )(tensor -> data ))[i ]= GGML_FP32_TO_FP16 (value ); 1877 }break ; 1878case GGML_TYPE_F32 : 1879 { 1880GGML_ASSERT (tensor -> nb [0 ]== sizeof (float )); 1881 ((float * )(tensor -> data ))[i ]= value ; 1882 }break ; 1883case GGML_TYPE_COUNT : 1884 { 1885GGML_ASSERT (false); 1886 }break ; 1887 } 1888} 1889 1890void * ggml_get_data (const struct ggml_tensor * tensor ) { 1891return tensor -> data ; 1892} 1893 1894float * ggml_get_data_f32 (const struct ggml_tensor * tensor ) { 1895assert (tensor -> type == GGML_TYPE_F32 ); 1896return (float * )(tensor -> data ); 1897} 1898 1899struct ggml_tensor * ggml_view_tensor ( 1900struct ggml_context * ctx , 1901const struct ggml_tensor * src ) { 1902return ggml_new_tensor_impl (ctx ,src -> type ,src -> n_dims ,src -> ne ,src -> data ); 1903} 1904 1905//////////////////////////////////////////////////////////////////////////////// 1906 1907// ggml_dup 1908 1909struct ggml_tensor * ggml_dup_impl ( 1910struct ggml_context * ctx , 1911struct ggml_tensor * a , 1912bool inplace ) { 1913bool is_node = false; 1914 1915if (!inplace && (a -> grad )) { 1916is_node = true; 1917 } 1918 1919struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 1920 1921result -> op = GGML_OP_DUP ; 1922result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 1923result -> src0 = a ; 1924result -> src1 = NULL ; 1925 1926return result ; 1927} 1928 1929struct ggml_tensor * ggml_dup ( 1930struct ggml_context * ctx , 1931struct ggml_tensor * a ) { 1932return ggml_dup_impl (ctx ,a , false); 1933} 1934 1935struct ggml_tensor * ggml_dup_inplace ( 1936struct ggml_context * ctx , 1937struct ggml_tensor * a ) { 1938return ggml_dup_impl (ctx ,a , true); 1939} 1940 1941// ggml_add 1942 1943struct ggml_tensor * ggml_add_impl ( 1944struct ggml_context * ctx , 1945struct ggml_tensor * a , 1946struct ggml_tensor * b , 1947bool inplace ) { 1948assert (ggml_are_same_shape (a ,b )); 1949 1950bool is_node = false; 1951 1952if (!inplace && (a -> grad || b -> grad )) { 1953is_node = true; 1954 } 1955 1956struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 1957 1958result -> op = GGML_OP_ADD ; 1959result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 1960result -> src0 = a ; 1961result -> src1 = b ; 1962 1963return result ; 1964} 1965 1966struct ggml_tensor * ggml_add ( 1967struct ggml_context * ctx , 1968struct ggml_tensor * a , 1969struct ggml_tensor * b ) { 1970return ggml_add_impl (ctx ,a ,b , false); 1971} 1972 1973struct ggml_tensor * ggml_add_inplace ( 1974struct ggml_context * ctx , 1975struct ggml_tensor * a , 1976struct ggml_tensor * b ) { 1977return ggml_add_impl (ctx ,a ,b , true); 1978} 1979 1980// ggml_sub 1981 1982struct ggml_tensor * ggml_sub_impl ( 1983struct ggml_context * ctx , 1984struct ggml_tensor * a , 1985struct ggml_tensor * b , 1986bool inplace ) { 1987assert (ggml_are_same_shape (a ,b )); 1988 1989bool is_node = false; 1990 1991if (!inplace && (a -> grad || b -> grad )) { 1992is_node = true; 1993 } 1994 1995struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 1996 1997result -> op = GGML_OP_SUB ; 1998result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 1999result -> src0 = a ; 2000result -> src1 = b ; 2001 2002return result ; 2003} 2004 2005struct ggml_tensor * ggml_sub ( 2006struct ggml_context * ctx , 2007struct ggml_tensor * a , 2008struct ggml_tensor * b ) { 2009return ggml_sub_impl (ctx ,a ,b , false); 2010} 2011 2012struct ggml_tensor * ggml_sub_inplace ( 2013struct ggml_context * ctx , 2014struct ggml_tensor * a , 2015struct ggml_tensor * b ) { 2016return ggml_sub_impl (ctx ,a ,b , true); 2017} 2018 2019// ggml_mul 2020 2021struct ggml_tensor * ggml_mul_impl ( 2022struct ggml_context * ctx , 2023struct ggml_tensor * a , 2024struct ggml_tensor * b , 2025bool inplace ) { 2026assert (ggml_are_same_shape (a ,b )); 2027 2028bool is_node = false; 2029 2030if (!inplace && (a -> grad || b -> grad )) { 2031is_node = true; 2032 } 2033 2034if (inplace ) { 2035assert (is_node == false); 2036 } 2037 2038struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2039 2040result -> op = GGML_OP_MUL ; 2041result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2042result -> src0 = a ; 2043result -> src1 = b ; 2044 2045return result ; 2046} 2047 2048struct ggml_tensor * ggml_mul ( 2049struct ggml_context * ctx , 2050struct ggml_tensor * a , 2051struct ggml_tensor * b ) { 2052return ggml_mul_impl (ctx ,a ,b , false); 2053} 2054 2055struct ggml_tensor * ggml_mul_inplace ( 2056struct ggml_context * ctx , 2057struct ggml_tensor * a , 2058struct ggml_tensor * b ) { 2059return ggml_mul_impl (ctx ,a ,b , true); 2060} 2061 2062// ggml_div 2063 2064struct ggml_tensor * ggml_div_impl ( 2065struct ggml_context * ctx , 2066struct ggml_tensor * a , 2067struct ggml_tensor * b , 2068bool inplace ) { 2069assert (ggml_are_same_shape (a ,b )); 2070 2071bool is_node = false; 2072 2073if (!inplace && (a -> grad || b -> grad )) { 2074is_node = true; 2075 } 2076 2077if (inplace ) { 2078assert (is_node == false); 2079 } 2080 2081struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2082 2083result -> op = GGML_OP_DIV ; 2084result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2085result -> src0 = a ; 2086result -> src1 = b ; 2087 2088return result ; 2089} 2090 2091struct ggml_tensor * ggml_div ( 2092struct ggml_context * ctx , 2093struct ggml_tensor * a , 2094struct ggml_tensor * b ) { 2095return ggml_div_impl (ctx ,a ,b , false); 2096} 2097 2098struct ggml_tensor * ggml_div_inplace ( 2099struct ggml_context * ctx , 2100struct ggml_tensor * a , 2101struct ggml_tensor * b ) { 2102return ggml_div_impl (ctx ,a ,b , true); 2103} 2104 2105// ggml_sqr 2106 2107struct ggml_tensor * ggml_sqr_impl ( 2108struct ggml_context * ctx , 2109struct ggml_tensor * a , 2110bool inplace ) { 2111bool is_node = false; 2112 2113if (!inplace && (a -> grad )) { 2114is_node = true; 2115 } 2116 2117struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2118 2119result -> op = GGML_OP_SQR ; 2120result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2121result -> src0 = a ; 2122result -> src1 = NULL ; 2123 2124return result ; 2125} 2126 2127struct ggml_tensor * ggml_sqr ( 2128struct ggml_context * ctx , 2129struct ggml_tensor * a ) { 2130return ggml_sqr_impl (ctx ,a , false); 2131} 2132 2133struct ggml_tensor * ggml_sqr_inplace ( 2134struct ggml_context * ctx , 2135struct ggml_tensor * a ) { 2136return ggml_sqr_impl (ctx ,a , true); 2137} 2138 2139// ggml_sqrt 2140 2141struct ggml_tensor * ggml_sqrt_impl ( 2142struct ggml_context * ctx , 2143struct ggml_tensor * a , 2144bool inplace ) { 2145bool is_node = false; 2146 2147if (!inplace && (a -> grad )) { 2148is_node = true; 2149 } 2150 2151struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2152 2153result -> op = GGML_OP_SQRT ; 2154result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2155result -> src0 = a ; 2156result -> src1 = NULL ; 2157 2158return result ; 2159} 2160 2161struct ggml_tensor * ggml_sqrt ( 2162struct ggml_context * ctx , 2163struct ggml_tensor * a ) { 2164return ggml_sqrt_impl (ctx ,a , false); 2165} 2166 2167struct ggml_tensor * ggml_sqrt_inplace ( 2168struct ggml_context * ctx , 2169struct ggml_tensor * a ) { 2170return ggml_sqrt_impl (ctx ,a , true); 2171} 2172 2173// ggml_sum 2174 2175struct ggml_tensor * ggml_sum ( 2176struct ggml_context * ctx , 2177struct ggml_tensor * a ) { 2178bool is_node = false; 2179 2180if (a -> grad ) { 2181is_node = true; 2182 } 2183 2184struct ggml_tensor * result = ggml_new_tensor_1d (ctx ,a -> type ,1 ); 2185 2186result -> op = GGML_OP_SUM ; 2187result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2188result -> src0 = a ; 2189result -> src1 = NULL ; 2190 2191return result ; 2192} 2193 2194// ggml_mean 2195 2196struct ggml_tensor * ggml_mean ( 2197struct ggml_context * ctx , 2198struct ggml_tensor * a ) { 2199bool is_node = false; 2200 2201if (a -> grad ) { 2202assert (false);// TODO: implement 2203is_node = true; 2204 } 2205 2206int ne [GGML_MAX_DIMS ]= {1 ,a -> ne [1 ],a -> ne [2 ],a -> ne [3 ] }; 2207struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,a -> n_dims ,ne ); 2208 2209result -> op = GGML_OP_MEAN ; 2210result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2211result -> src0 = a ; 2212result -> src1 = NULL ; 2213 2214return result ; 2215} 2216 2217// ggml_repeat 2218 2219struct ggml_tensor * ggml_repeat ( 2220struct ggml_context * ctx , 2221struct ggml_tensor * a , 2222struct ggml_tensor * b ) { 2223assert (ggml_can_repeat (a ,b )); 2224 2225bool is_node = false; 2226 2227if (a -> grad ) { 2228is_node = true; 2229 } 2230 2231if (ggml_are_same_shape (a ,b )&& !is_node ) { 2232return a ; 2233 } 2234 2235struct ggml_tensor * result = ggml_new_tensor (ctx ,a -> type ,b -> n_dims ,b -> ne ); 2236 2237result -> op = GGML_OP_REPEAT ; 2238result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2239result -> src0 = a ; 2240result -> src1 = NULL ; 2241 2242return result ; 2243} 2244 2245// ggml_abs 2246 2247struct ggml_tensor * ggml_abs_impl ( 2248struct ggml_context * ctx , 2249struct ggml_tensor * a , 2250bool inplace ) { 2251bool is_node = false; 2252 2253if (!inplace && (a -> grad )) { 2254is_node = true; 2255 } 2256 2257struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2258 2259result -> op = GGML_OP_ABS ; 2260result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2261result -> src0 = a ; 2262result -> src1 = NULL ; 2263 2264return result ; 2265} 2266 2267struct ggml_tensor * ggml_abs ( 2268struct ggml_context * ctx , 2269struct ggml_tensor * a ) { 2270return ggml_abs_impl (ctx ,a , false); 2271} 2272 2273struct ggml_tensor * ggml_abs_inplace ( 2274struct ggml_context * ctx , 2275struct ggml_tensor * a ) { 2276return ggml_abs_impl (ctx ,a , true); 2277} 2278 2279 2280// ggml_sgn 2281 2282struct ggml_tensor * ggml_sgn_impl ( 2283struct ggml_context * ctx , 2284struct ggml_tensor * a , 2285bool inplace ) { 2286bool is_node = false; 2287 2288if (!inplace && (a -> grad )) { 2289is_node = true; 2290 } 2291 2292struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2293 2294result -> op = GGML_OP_SGN ; 2295result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2296result -> src0 = a ; 2297result -> src1 = NULL ; 2298 2299return result ; 2300} 2301 2302struct ggml_tensor * ggml_sgn ( 2303struct ggml_context * ctx , 2304struct ggml_tensor * a ) { 2305return ggml_sgn_impl (ctx ,a , false); 2306} 2307 2308struct ggml_tensor * ggml_sgn_inplace ( 2309struct ggml_context * ctx , 2310struct ggml_tensor * a ) { 2311return ggml_sgn_impl (ctx ,a , true); 2312} 2313 2314// ggml_neg 2315 2316struct ggml_tensor * ggml_neg_impl ( 2317struct ggml_context * ctx , 2318struct ggml_tensor * a , 2319bool inplace ) { 2320bool is_node = false; 2321 2322if (!inplace && (a -> grad )) { 2323is_node = true; 2324 } 2325 2326struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2327 2328result -> op = GGML_OP_NEG ; 2329result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2330result -> src0 = a ; 2331result -> src1 = NULL ; 2332 2333return result ; 2334} 2335 2336struct ggml_tensor * ggml_neg ( 2337struct ggml_context * ctx , 2338struct ggml_tensor * a ) { 2339return ggml_neg_impl (ctx ,a , false); 2340} 2341 2342struct ggml_tensor * ggml_neg_inplace ( 2343struct ggml_context * ctx , 2344struct ggml_tensor * a ) { 2345return ggml_neg_impl (ctx ,a , true); 2346} 2347 2348// ggml_step 2349 2350struct ggml_tensor * ggml_step_impl ( 2351struct ggml_context * ctx , 2352struct ggml_tensor * a , 2353bool inplace ) { 2354bool is_node = false; 2355 2356if (!inplace && (a -> grad )) { 2357is_node = true; 2358 } 2359 2360struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2361 2362result -> op = GGML_OP_STEP ; 2363result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2364result -> src0 = a ; 2365result -> src1 = NULL ; 2366 2367return result ; 2368} 2369 2370struct ggml_tensor * ggml_step ( 2371struct ggml_context * ctx , 2372struct ggml_tensor * a ) { 2373return ggml_step_impl (ctx ,a , false); 2374} 2375 2376struct ggml_tensor * ggml_step_inplace ( 2377struct ggml_context * ctx , 2378struct ggml_tensor * a ) { 2379return ggml_step_impl (ctx ,a , true); 2380} 2381 2382// ggml_relu 2383 2384struct ggml_tensor * ggml_relu_impl ( 2385struct ggml_context * ctx , 2386struct ggml_tensor * a , 2387bool inplace ) { 2388bool is_node = false; 2389 2390if (!inplace && (a -> grad )) { 2391is_node = true; 2392 } 2393 2394struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2395 2396result -> op = GGML_OP_RELU ; 2397result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2398result -> src0 = a ; 2399result -> src1 = NULL ; 2400 2401return result ; 2402} 2403 2404struct ggml_tensor * ggml_relu ( 2405struct ggml_context * ctx , 2406struct ggml_tensor * a ) { 2407return ggml_relu_impl (ctx ,a , false); 2408} 2409 2410struct ggml_tensor * ggml_relu_inplace ( 2411struct ggml_context * ctx , 2412struct ggml_tensor * a ) { 2413return ggml_relu_impl (ctx ,a , true); 2414} 2415 2416// ggml_gelu 2417 2418struct ggml_tensor * ggml_gelu_impl ( 2419struct ggml_context * ctx , 2420struct ggml_tensor * a , 2421bool inplace ) { 2422bool is_node = false; 2423 2424if (!inplace && (a -> grad )) { 2425is_node = true; 2426 } 2427 2428struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2429 2430result -> op = GGML_OP_GELU ; 2431result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2432result -> src0 = a ; 2433result -> src1 = NULL ; 2434 2435return result ; 2436} 2437 2438struct ggml_tensor * ggml_gelu ( 2439struct ggml_context * ctx , 2440struct ggml_tensor * a ) { 2441return ggml_gelu_impl (ctx ,a , false); 2442} 2443 2444struct ggml_tensor * ggml_gelu_inplace ( 2445struct ggml_context * ctx , 2446struct ggml_tensor * a ) { 2447return ggml_gelu_impl (ctx ,a , true); 2448} 2449 2450// ggml_norm 2451 2452struct ggml_tensor * ggml_norm_impl ( 2453struct ggml_context * ctx , 2454struct ggml_tensor * a , 2455bool inplace ) { 2456bool is_node = false; 2457 2458if (!inplace && (a -> grad )) { 2459assert (false);// TODO: implement backward 2460is_node = true; 2461 } 2462 2463struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2464 2465result -> op = GGML_OP_NORM ; 2466result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2467result -> src0 = a ; 2468result -> src1 = NULL ;// TODO: maybe store epsilon here? 2469 2470return result ; 2471} 2472 2473struct ggml_tensor * ggml_norm ( 2474struct ggml_context * ctx , 2475struct ggml_tensor * a ) { 2476return ggml_norm_impl (ctx ,a , false); 2477} 2478 2479struct ggml_tensor * ggml_norm_inplace ( 2480struct ggml_context * ctx , 2481struct ggml_tensor * a ) { 2482return ggml_norm_impl (ctx ,a , true); 2483} 2484 2485// ggml_mul_mat 2486 2487struct ggml_tensor * ggml_mul_mat ( 2488struct ggml_context * ctx , 2489struct ggml_tensor * a , 2490struct ggml_tensor * b ) { 2491assert (ggml_can_mul_mat (a ,b )); 2492 2493// printUniqueTensorSize( "ggml_mul_mat", a->ne, b->ne ); 2494bool is_node = false; 2495 2496if (a -> grad || b -> grad ) { 2497is_node = true; 2498 } 2499 2500const int ne [4 ]= {a -> ne [1 ],b -> ne [1 ],a -> ne [2 ],b -> ne [3 ] }; 2501struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,MIN (a -> n_dims ,b -> n_dims ),ne ); 2502 2503result -> op = GGML_OP_MUL_MAT ; 2504result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2505result -> src0 = a ; 2506result -> src1 = b ; 2507 2508return result ; 2509} 2510 2511// ggml_scale 2512 2513struct ggml_tensor * ggml_scale_impl ( 2514struct ggml_context * ctx , 2515struct ggml_tensor * a , 2516struct ggml_tensor * b , 2517bool inplace ) { 2518assert (ggml_is_scalar (b )); 2519assert (ggml_is_padded_1d (a )); 2520 2521bool is_node = false; 2522 2523if (!inplace && (a -> grad || b -> grad )) { 2524assert (false);// TODO: implement backward 2525is_node = true; 2526 } 2527 2528// TODO: when implement backward, fix this: 2529//struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a); 2530struct ggml_tensor * result = ggml_view_tensor (ctx ,a ); 2531 2532result -> op = GGML_OP_SCALE ; 2533result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2534result -> src0 = a ; 2535result -> src1 = b ; 2536 2537return result ; 2538} 2539 2540struct ggml_tensor * ggml_scale ( 2541struct ggml_context * ctx , 2542struct ggml_tensor * a , 2543struct ggml_tensor * b ) { 2544return ggml_scale_impl (ctx ,a ,b , false); 2545} 2546 2547struct ggml_tensor * ggml_scale_inplace ( 2548struct ggml_context * ctx , 2549struct ggml_tensor * a , 2550struct ggml_tensor * b ) { 2551return ggml_scale_impl (ctx ,a ,b , true); 2552} 2553 2554// ggml_cpy 2555 2556struct ggml_tensor * ggml_cpy_impl ( 2557struct ggml_context * ctx , 2558struct ggml_tensor * a , 2559struct ggml_tensor * b , 2560bool inplace ) { 2561assert (ggml_nelements (a )== ggml_nelements (b )); 2562 2563bool is_node = false; 2564 2565if (!inplace && (a -> grad || b -> grad )) { 2566assert (false);// TODO: implement backward 2567is_node = true; 2568 } 2569 2570// make a view of the destination 2571struct ggml_tensor * result = ggml_view_tensor (ctx ,b ); 2572 2573result -> op = GGML_OP_CPY ; 2574result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2575result -> src0 = a ; 2576result -> src1 = b ; 2577 2578return result ; 2579} 2580 2581struct ggml_tensor * ggml_cpy ( 2582struct ggml_context * ctx , 2583struct ggml_tensor * a , 2584struct ggml_tensor * b ) { 2585return ggml_cpy_impl (ctx ,a ,b , false); 2586} 2587 2588struct ggml_tensor * ggml_cpy_inplace ( 2589struct ggml_context * ctx , 2590struct ggml_tensor * a , 2591struct ggml_tensor * b ) { 2592return ggml_cpy_impl (ctx ,a ,b , true); 2593} 2594 2595// ggml_reshape 2596 2597struct ggml_tensor * ggml_reshape ( 2598struct ggml_context * ctx , 2599struct ggml_tensor * a , 2600struct ggml_tensor * b ) { 2601assert (ggml_is_contiguous (a )); 2602assert (ggml_is_contiguous (b )); 2603assert (ggml_nelements (a )== ggml_nelements (b )); 2604 2605bool is_node = false; 2606 2607if (a -> grad || b -> grad ) { 2608assert (false);// TODO: implement backward 2609is_node = true; 2610 } 2611 2612struct ggml_tensor * result = ggml_new_tensor_impl (ctx ,a -> type ,b -> n_dims ,b -> ne ,a -> data ); 2613 2614result -> op = GGML_OP_RESHAPE ; 2615result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2616result -> src0 = a ; 2617result -> src1 = NULL ; 2618 2619return result ; 2620} 2621 2622struct ggml_tensor * ggml_reshape_2d ( 2623struct ggml_context * ctx , 2624struct ggml_tensor * a , 2625int ne0 , 2626int ne1 ) { 2627assert (ggml_is_contiguous (a )); 2628assert (ggml_nelements (a )== ne0 * ne1 ); 2629 2630bool is_node = false; 2631 2632if (a -> grad ) { 2633assert (false);// TODO: implement backward 2634is_node = true; 2635 } 2636 2637const int ne [2 ]= {ne0 ,ne1 }; 2638struct ggml_tensor * result = ggml_new_tensor_impl (ctx ,a -> type ,2 ,ne ,a -> data ); 2639 2640result -> op = GGML_OP_RESHAPE ; 2641result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2642result -> src0 = a ; 2643result -> src1 = NULL ; 2644 2645return result ; 2646} 2647 2648struct ggml_tensor * ggml_reshape_3d ( 2649struct ggml_context * ctx , 2650struct ggml_tensor * a , 2651int ne0 , 2652int ne1 , 2653int ne2 ) { 2654assert (ggml_is_contiguous (a )); 2655assert (ggml_nelements (a )== ne0 * ne1 * ne2 ); 2656 2657bool is_node = false; 2658 2659if (a -> grad ) { 2660assert (false);// TODO: implement backward 2661is_node = true; 2662 } 2663 2664const int ne [3 ]= {ne0 ,ne1 ,ne2 }; 2665struct ggml_tensor * result = ggml_new_tensor_impl (ctx ,a -> type ,3 ,ne ,a -> data ); 2666 2667result -> op = GGML_OP_RESHAPE ; 2668result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2669result -> src0 = a ; 2670result -> src1 = NULL ; 2671 2672return result ; 2673} 2674 2675// ggml_view_1d 2676 2677struct ggml_tensor * ggml_view_1d ( 2678struct ggml_context * ctx , 2679struct ggml_tensor * a , 2680int ne0 , 2681size_t offset ) { 2682if (a -> grad ) { 2683assert (false);// gradient propagation is not supported 2684 } 2685 2686struct ggml_tensor * result = ggml_new_tensor_impl (ctx ,a -> type ,1 ,& ne0 , (char * )a -> data + offset ); 2687 2688result -> op = GGML_OP_VIEW ; 2689result -> grad = NULL ; 2690result -> src0 = a ; 2691result -> src1 = NULL ;// TODO: maybe store the offset here? 2692 2693return result ; 2694} 2695 2696// ggml_view_2d 2697 2698struct ggml_tensor * ggml_view_2d ( 2699struct ggml_context * ctx , 2700struct ggml_tensor * a , 2701int ne0 , 2702int ne1 , 2703size_t nb1 , 2704size_t offset ) { 2705if (a -> grad ) { 2706assert (false);// gradient propagation is not supported 2707 } 2708 2709const int ne [GGML_MAX_DIMS ]= {ne0 ,ne1 ,1 ,1 }; 2710 2711struct ggml_tensor * result = ggml_new_tensor_impl (ctx ,a -> type ,2 ,ne , (char * )a -> data + offset ); 2712 2713result -> nb [1 ]= nb1 ; 2714result -> nb [2 ]= result -> nb [1 ]* ne1 ; 2715result -> nb [3 ]= result -> nb [2 ]; 2716 2717result -> op = GGML_OP_VIEW ; 2718result -> grad = NULL ; 2719result -> src0 = a ; 2720result -> src1 = NULL ;// TODO: maybe store the offset here? 2721 2722return result ; 2723} 2724 2725// ggml_permute 2726 2727struct ggml_tensor * ggml_permute ( 2728struct ggml_context * ctx , 2729struct ggml_tensor * a , 2730int axis0 , 2731int axis1 , 2732int axis2 , 2733int axis3 ) { 2734assert (axis0 >=0 && axis0 < GGML_MAX_DIMS ); 2735assert (axis1 >=0 && axis1 < GGML_MAX_DIMS ); 2736assert (axis2 >=0 && axis2 < GGML_MAX_DIMS ); 2737assert (axis3 >=0 && axis3 < GGML_MAX_DIMS ); 2738 2739assert (axis0 != axis1 ); 2740assert (axis0 != axis2 ); 2741assert (axis0 != axis3 ); 2742assert (axis1 != axis2 ); 2743assert (axis1 != axis3 ); 2744assert (axis2 != axis3 ); 2745 2746bool is_node = false; 2747 2748if (a -> grad ) { 2749assert (false);// TODO: implement backward 2750is_node = true; 2751 } 2752 2753struct ggml_tensor * result = ggml_view_tensor (ctx ,a ); 2754 2755int ne [GGML_MAX_DIMS ]; 2756int nb [GGML_MAX_DIMS ]; 2757 2758ne [axis0 ]= a -> ne [0 ]; 2759ne [axis1 ]= a -> ne [1 ]; 2760ne [axis2 ]= a -> ne [2 ]; 2761ne [axis3 ]= a -> ne [3 ]; 2762 2763nb [axis0 ]= a -> nb [0 ]; 2764nb [axis1 ]= a -> nb [1 ]; 2765nb [axis2 ]= a -> nb [2 ]; 2766nb [axis3 ]= a -> nb [3 ]; 2767 2768result -> ne [0 ]= ne [0 ]; 2769result -> ne [1 ]= ne [1 ]; 2770result -> ne [2 ]= ne [2 ]; 2771result -> ne [3 ]= ne [3 ]; 2772 2773result -> nb [0 ]= nb [0 ]; 2774result -> nb [1 ]= nb [1 ]; 2775result -> nb [2 ]= nb [2 ]; 2776result -> nb [3 ]= nb [3 ]; 2777 2778result -> op = GGML_OP_PERMUTE ; 2779result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2780result -> src0 = a ; 2781result -> src1 = NULL ;// TODO: maybe store the permutation here? 2782 2783return result ; 2784} 2785 2786// ggml_transpose 2787 2788struct ggml_tensor * ggml_transpose ( 2789struct ggml_context * ctx , 2790struct ggml_tensor * a ) { 2791bool is_node = false; 2792 2793if (a -> grad ) { 2794assert (false);// TODO: implement backward 2795is_node = true; 2796 } 2797 2798struct ggml_tensor * result = ggml_view_tensor (ctx ,a ); 2799 2800result -> ne [0 ]= a -> ne [1 ]; 2801result -> ne [1 ]= a -> ne [0 ]; 2802 2803result -> nb [0 ]= a -> nb [1 ]; 2804result -> nb [1 ]= a -> nb [0 ]; 2805 2806result -> op = GGML_OP_TRANSPOSE ; 2807result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2808result -> src0 = a ; 2809result -> src1 = NULL ; 2810 2811return result ; 2812} 2813 2814// ggml_get_rows 2815 2816struct ggml_tensor * ggml_get_rows ( 2817struct ggml_context * ctx , 2818struct ggml_tensor * a , 2819struct ggml_tensor * b ) { 2820assert (ggml_is_matrix (a )&& ggml_is_vector (b )&& b -> type == GGML_TYPE_I32 ); 2821 2822bool is_node = false; 2823 2824if (a -> grad || b -> grad ) { 2825assert (false);// TODO: implement backward 2826is_node = true; 2827 } 2828 2829// TODO: implement non F32 return 2830//struct ggml_tensor * result = ggml_new_tensor_2d(ctx, a->type, a->ne[0], b->ne[0]); 2831struct ggml_tensor * result = ggml_new_tensor_2d (ctx ,GGML_TYPE_F32 ,a -> ne [0 ],b -> ne [0 ]); 2832 2833result -> op = GGML_OP_GET_ROWS ; 2834result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2835result -> src0 = a ; 2836result -> src1 = b ; 2837 2838return result ; 2839} 2840 2841// ggml_diag_mask_inf 2842 2843struct ggml_tensor * ggml_diag_mask_inf ( 2844struct ggml_context * ctx , 2845struct ggml_tensor * a , 2846int n_past ) { 2847bool is_node = false; 2848 2849if (a -> grad ) { 2850assert (false);// TODO: implement backward 2851is_node = true; 2852 } 2853 2854// TODO: when implement backward, fix this: 2855//struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a); 2856struct ggml_tensor * result = ggml_view_tensor (ctx ,a ); 2857 2858struct ggml_tensor * b = ggml_new_tensor_1d (ctx ,GGML_TYPE_I32 ,1 ); 2859 ((int32_t * )b -> data )[0 ]= n_past ; 2860 2861result -> op = GGML_OP_DIAG_MASK_INF ; 2862result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2863result -> src0 = a ; 2864result -> src1 = b ; 2865 2866return result ; 2867} 2868 2869// ggml_soft_max 2870 2871struct ggml_tensor * ggml_soft_max ( 2872struct ggml_context * ctx , 2873struct ggml_tensor * a ) { 2874bool is_node = false; 2875 2876if (a -> grad ) { 2877assert (false);// TODO: implement backward 2878is_node = true; 2879 } 2880 2881// TODO: when implement backward, fix this: 2882//struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a); 2883struct ggml_tensor * result = ggml_view_tensor (ctx ,a ); 2884 2885result -> op = GGML_OP_SOFT_MAX ; 2886result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2887result -> src0 = a ; 2888result -> src1 = NULL ; 2889 2890return result ; 2891} 2892 2893// ggml_rope 2894 2895struct ggml_tensor * ggml_rope ( 2896struct ggml_context * ctx , 2897struct ggml_tensor * a , 2898int n_past , 2899int n_dims , 2900int mode ) { 2901assert (n_past >=0 ); 2902bool is_node = false; 2903 2904if (a -> grad ) { 2905assert (false);// TODO: implement backward 2906is_node = true; 2907 } 2908 2909// TODO: when implement backward, fix this: 2910//struct ggml_tensor * result = inplace ? ggml_view_tensor(ctx, a) : ggml_dup_tensor(ctx, a); 2911struct ggml_tensor * result = ggml_view_tensor (ctx ,a ); 2912 2913struct ggml_tensor * b = ggml_new_tensor_1d (ctx ,GGML_TYPE_I32 ,3 ); 2914 ((int32_t * )b -> data )[0 ]= n_past ; 2915 ((int32_t * )b -> data )[1 ]= n_dims ; 2916 ((int32_t * )b -> data )[2 ]= mode ; 2917 2918result -> op = GGML_OP_ROPE ; 2919result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2920result -> src0 = a ; 2921result -> src1 = b ; 2922 2923return result ; 2924} 2925 2926// ggml_conv_1d_1s 2927 2928struct ggml_tensor * ggml_conv_1d_1s ( 2929struct ggml_context * ctx , 2930struct ggml_tensor * a , 2931struct ggml_tensor * b ) { 2932assert (ggml_is_matrix (b )); 2933assert (a -> ne [1 ]== b -> ne [1 ]); 2934assert (a -> ne [3 ]== 1 ); 2935bool is_node = false; 2936 2937if (a -> grad || b -> grad ) { 2938assert (false);// TODO: implement backward 2939is_node = true; 2940 } 2941 2942const int ne [4 ]= {b -> ne [0 ],a -> ne [2 ],1 ,1 , }; 2943struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,2 ,ne ); 2944 2945result -> op = GGML_OP_CONV_1D_1S ; 2946result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2947result -> src0 = a ; 2948result -> src1 = b ; 2949 2950return result ; 2951} 2952 2953// ggml_conv_1d_2s 2954 2955struct ggml_tensor * ggml_conv_1d_2s ( 2956struct ggml_context * ctx , 2957struct ggml_tensor * a , 2958struct ggml_tensor * b ) { 2959assert (ggml_is_matrix (b )); 2960assert (a -> ne [1 ]== b -> ne [1 ]); 2961assert (a -> ne [3 ]== 1 ); 2962bool is_node = false; 2963 2964if (a -> grad || b -> grad ) { 2965assert (false);// TODO: implement backward 2966is_node = true; 2967 } 2968 2969const int ne [4 ]= {b -> ne [0 ]/2 ,a -> ne [2 ],1 ,1 , }; 2970struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,2 ,ne ); 2971 2972result -> op = GGML_OP_CONV_1D_2S ; 2973result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 2974result -> src0 = a ; 2975result -> src1 = b ; 2976 2977return result ; 2978} 2979 2980// ggml_flash_attn 2981 2982struct ggml_tensor * ggml_flash_attn ( 2983struct ggml_context * ctx , 2984struct ggml_tensor * q , 2985struct ggml_tensor * k , 2986struct ggml_tensor * v , 2987bool masked ) { 2988assert (ggml_can_mul_mat (k ,q )); 2989// TODO: check if vT can be multiplied by (k*qT) 2990 2991bool is_node = false; 2992 2993if (q -> grad || k -> grad || v -> grad ) { 2994GGML_ASSERT (false);// TODO: implement backward 2995is_node = true; 2996 } 2997 2998//struct ggml_tensor * result = ggml_dup_tensor(ctx, q); 2999struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,4 ,q -> ne ); 3000 3001result -> op = GGML_OP_FLASH_ATTN ; 3002result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 3003result -> src0 = q ; 3004result -> src1 = k ; 3005result -> opt [0 ]= v ; 3006result -> opt [1 ]= ggml_new_i32 (ctx ,masked ?1 :0 ); 3007 3008return result ; 3009} 3010 3011// ggml_flash_ff 3012 3013struct ggml_tensor * ggml_flash_ff ( 3014struct ggml_context * ctx , 3015struct ggml_tensor * a , 3016struct ggml_tensor * b0 , 3017struct ggml_tensor * b1 , 3018struct ggml_tensor * c0 , 3019struct ggml_tensor * c1 ) { 3020assert (ggml_can_mul_mat (b0 ,a )); 3021// TODO: more checks 3022 3023bool is_node = false; 3024 3025if (a -> grad || b0 -> grad || b1 -> grad || c0 -> grad || c1 -> grad ) { 3026GGML_ASSERT (false);// TODO: implement backward 3027is_node = true; 3028 } 3029 3030//struct ggml_tensor * result = ggml_dup_tensor(ctx, a); 3031struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,4 ,a -> ne ); 3032 3033result -> op = GGML_OP_FLASH_FF ; 3034result -> grad = is_node ?ggml_dup_tensor (ctx ,result ) :NULL ; 3035result -> src0 = a ; 3036result -> src1 = b0 ; 3037result -> opt [0 ]= b1 ; 3038result -> opt [1 ]= c0 ; 3039result -> opt [2 ]= c1 ; 3040 3041return result ; 3042} 3043 3044//////////////////////////////////////////////////////////////////////////////// 3045 3046void ggml_set_param ( 3047struct ggml_context * ctx , 3048struct ggml_tensor * tensor ) { 3049tensor -> is_param = true; 3050 3051assert (tensor -> grad == NULL ); 3052tensor -> grad = ggml_dup_tensor (ctx ,tensor ); 3053} 3054 3055// ggml_compute_forward_dup 3056 3057static void ggml_compute_forward_dup_f16 ( 3058const struct ggml_compute_params * params , 3059const struct ggml_tensor * src0 , 3060struct ggml_tensor * dst ) { 3061assert (params -> ith == 0 ); 3062assert (ggml_is_contiguous (dst )); 3063assert (ggml_nelements (dst )== ggml_nelements (src0 )); 3064 3065if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 3066return ; 3067 } 3068 3069const int ne00 = src0 -> ne [0 ]; 3070const int ne01 = src0 -> ne [1 ]; 3071const int ne02 = src0 -> ne [2 ]; 3072const int ne03 = src0 -> ne [3 ]; 3073 3074const size_t nb00 = src0 -> nb [0 ]; 3075const size_t nb01 = src0 -> nb [1 ]; 3076const size_t nb02 = src0 -> nb [2 ]; 3077const size_t nb03 = src0 -> nb [3 ]; 3078 3079if (ggml_is_contiguous (src0 )&& src0 -> type == dst -> type ) { 3080memcpy (dst -> data ,src0 -> data ,ggml_nelements (dst )* GGML_TYPE_SIZE [src0 -> type ]); 3081return ; 3082 } 3083 3084if (src0 -> nb [0 ]== sizeof (ggml_fp16_t )) { 3085if (dst -> type == GGML_TYPE_F16 ) { 3086int id = 0 ; 3087const size_t rs = ne00 * nb00 ; 3088 3089for (int i03 = 0 ;i03 < ne03 ;i03 ++ ) { 3090for (int i02 = 0 ;i02 < ne02 ;i02 ++ ) { 3091for (int i01 = 0 ;i01 < ne01 ;i01 ++ ) { 3092const char * src0_ptr = (char * )src0 -> data + i01 * nb01 + i02 * nb02 + i03 * nb03 ; 3093char * dst_ptr = (char * )dst -> data + id * rs ; 3094 3095memcpy (dst_ptr ,src0_ptr ,rs ); 3096 3097id ++ ; 3098 } 3099 } 3100 } 3101 }else if (dst -> type == GGML_TYPE_F32 ) { 3102int id = 0 ; 3103float * dst_ptr = (float * )dst -> data ; 3104 3105for (int i03 = 0 ;i03 < ne03 ;i03 ++ ) { 3106for (int i02 = 0 ;i02 < ne02 ;i02 ++ ) { 3107for (int i01 = 0 ;i01 < ne01 ;i01 ++ ) { 3108for (int i00 = 0 ;i00 < ne00 ;i00 ++ ) { 3109const ggml_fp16_t * src0_ptr = (ggml_fp16_t * ) ((char * )src0 -> data + i00 * nb00 + i01 * nb01 + i02 * nb02 + i03 * nb03 ); 3110 3111dst_ptr [id ]= GGML_FP16_TO_FP32 (* src0_ptr ); 3112id ++ ; 3113 } 3114 } 3115 } 3116 } 3117 }else { 3118GGML_ASSERT (false);// TODO: implement 3119 } 3120 }else { 3121//printf("%s: this is not optimal - fix me\n", __func__); 3122 3123if (dst -> type == GGML_TYPE_F32 ) { 3124int id = 0 ; 3125float * dst_ptr = (float * )dst -> data ; 3126 3127for (int i03 = 0 ;i03 < ne03 ;i03 ++ ) { 3128for (int i02 = 0 ;i02 < ne02 ;i02 ++ ) { 3129for (int i01 = 0 ;i01 < ne01 ;i01 ++ ) { 3130for (int i00 = 0 ;i00 < ne00 ;i00 ++ ) { 3131const ggml_fp16_t * src0_ptr = (ggml_fp16_t * ) ((char * )src0 -> data + i00 * nb00 + i01 * nb01 + i02 * nb02 + i03 * nb03 ); 3132 3133dst_ptr [id ]= GGML_FP16_TO_FP32 (* src0_ptr ); 3134id ++ ; 3135 } 3136 } 3137 } 3138 } 3139 }else if (dst -> type == GGML_TYPE_F16 ) { 3140int id = 0 ; 3141ggml_fp16_t * dst_ptr = (ggml_fp16_t * )dst -> data ; 3142 3143for (int i03 = 0 ;i03 < ne03 ;i03 ++ ) { 3144for (int i02 = 0 ;i02 < ne02 ;i02 ++ ) { 3145for (int i01 = 0 ;i01 < ne01 ;i01 ++ ) { 3146for (int i00 = 0 ;i00 < ne00 ;i00 ++ ) { 3147const ggml_fp16_t * src0_ptr = (ggml_fp16_t * ) ((char * )src0 -> data + i00 * nb00 + i01 * nb01 + i02 * nb02 + i03 * nb03 ); 3148 3149dst_ptr [id ]= * src0_ptr ; 3150id ++ ; 3151 } 3152 } 3153 } 3154 } 3155 }else { 3156GGML_ASSERT (false);// TODO: implement 3157 } 3158 } 3159} 3160 3161static void ggml_compute_forward_dup_f32 ( 3162const struct ggml_compute_params * params , 3163const struct ggml_tensor * src0 , 3164struct ggml_tensor * dst ) { 3165GGML_ASSERT (params -> ith == 0 ); 3166GGML_ASSERT (ggml_is_contiguous (dst )); 3167GGML_ASSERT (ggml_nelements (dst )== ggml_nelements (src0 )); 3168 3169if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 3170return ; 3171 } 3172 3173const int ne00 = src0 -> ne [0 ]; 3174const int ne01 = src0 -> ne [1 ]; 3175const int ne02 = src0 -> ne [2 ]; 3176const int ne03 = src0 -> ne [3 ]; 3177 3178const size_t nb00 = src0 -> nb [0 ]; 3179const size_t nb01 = src0 -> nb [1 ]; 3180const size_t nb02 = src0 -> nb [2 ]; 3181const size_t nb03 = src0 -> nb [3 ]; 3182 3183if (ggml_is_contiguous (src0 )&& src0 -> type == dst -> type ) { 3184memcpy (dst -> data ,src0 -> data ,ggml_nelements (dst )* GGML_TYPE_SIZE [src0 -> type ]); 3185return ; 3186 } 3187 3188if (src0 -> nb [0 ]== sizeof (float )) { 3189if (dst -> type == GGML_TYPE_F32 ) { 3190int id = 0 ; 3191const size_t rs = ne00 * nb00 ; 3192 3193for (int i03 = 0 ;i03 < ne03 ;i03 ++ ) { 3194for (int i02 = 0 ;i02 < ne02 ;i02 ++ ) { 3195for (int i01 = 0 ;i01 < ne01 ;i01 ++ ) { 3196const char * src0_ptr = (char * )src0 -> data + i01 * nb01 + i02 * nb02 + i03 * nb03 ; 3197char * dst_ptr = (char * )dst -> data + id * rs ; 3198 3199memcpy (dst_ptr ,src0_ptr ,rs ); 3200 3201id ++ ; 3202 } 3203 } 3204 } 3205 }else if (dst -> type == GGML_TYPE_F16 ) { 3206int id = 0 ; 3207ggml_fp16_t * dst_ptr = (ggml_fp16_t * )dst -> data ; 3208 3209for (int i03 = 0 ;i03 < ne03 ;i03 ++ ) { 3210for (int i02 = 0 ;i02 < ne02 ;i02 ++ ) { 3211for (int i01 = 0 ;i01 < ne01 ;i01 ++ ) { 3212for (int i00 = 0 ;i00 < ne00 ;i00 ++ ) { 3213const float * src0_ptr = (float * ) ((char * )src0 -> data + i00 * nb00 + i01 * nb01 + i02 * nb02 + i03 * nb03 ); 3214 3215dst_ptr [id ]= GGML_FP32_TO_FP16 (* src0_ptr ); 3216id ++ ; 3217 } 3218 } 3219 } 3220 } 3221 }else { 3222GGML_ASSERT (false);// TODO: implement 3223 } 3224 }else { 3225//printf("%s: this is not optimal - fix me\n", __func__); 3226 3227if (dst -> type == GGML_TYPE_F32 ) { 3228int id = 0 ; 3229float * dst_ptr = (float * )dst -> data ; 3230 3231for (int i03 = 0 ;i03 < ne03 ;i03 ++ ) { 3232for (int i02 = 0 ;i02 < ne02 ;i02 ++ ) { 3233for (int i01 = 0 ;i01 < ne01 ;i01 ++ ) { 3234for (int i00 = 0 ;i00 < ne00 ;i00 ++ ) { 3235const float * src0_ptr = (float * ) ((char * )src0 -> data + i00 * nb00 + i01 * nb01 + i02 * nb02 + i03 * nb03 ); 3236 3237dst_ptr [id ]= * src0_ptr ; 3238id ++ ; 3239 } 3240 } 3241 } 3242 } 3243 }else if (dst -> type == GGML_TYPE_F16 ) { 3244int id = 0 ; 3245ggml_fp16_t * dst_ptr = (ggml_fp16_t * )dst -> data ; 3246 3247for (int i03 = 0 ;i03 < ne03 ;i03 ++ ) { 3248for (int i02 = 0 ;i02 < ne02 ;i02 ++ ) { 3249for (int i01 = 0 ;i01 < ne01 ;i01 ++ ) { 3250for (int i00 = 0 ;i00 < ne00 ;i00 ++ ) { 3251const float * src0_ptr = (float * ) ((char * )src0 -> data + i00 * nb00 + i01 * nb01 + i02 * nb02 + i03 * nb03 ); 3252 3253dst_ptr [id ]= GGML_FP32_TO_FP16 (* src0_ptr ); 3254id ++ ; 3255 } 3256 } 3257 } 3258 } 3259 }else { 3260GGML_ASSERT (false);// TODO: implement 3261 } 3262 } 3263} 3264 3265static void ggml_compute_forward_dup ( 3266const struct ggml_compute_params * params , 3267const struct ggml_tensor * src0 , 3268struct ggml_tensor * dst ) { 3269switch (src0 -> type ) { 3270case GGML_TYPE_F16 : 3271 { 3272ggml_compute_forward_dup_f16 (params ,src0 ,dst ); 3273 }break ; 3274case GGML_TYPE_F32 : 3275 { 3276ggml_compute_forward_dup_f32 (params ,src0 ,dst ); 3277 }break ; 3278case GGML_TYPE_I8 : 3279case GGML_TYPE_I16 : 3280case GGML_TYPE_I32 : 3281case GGML_TYPE_COUNT : 3282 { 3283GGML_ASSERT (false); 3284 }break ; 3285 } 3286} 3287 3288// ggml_compute_forward_add 3289 3290static void ggml_compute_forward_add_f32 ( 3291const struct ggml_compute_params * params , 3292const struct ggml_tensor * src0 , 3293const struct ggml_tensor * src1 , 3294struct ggml_tensor * dst ) { 3295GGML_ASSERT (ggml_are_same_shape (src0 ,src1 )&& ggml_are_same_shape (src0 ,dst )); 3296 3297if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 3298return ; 3299 } 3300 3301const int ith = params -> ith ; 3302const int nth = params -> nth ; 3303 3304const int n = ggml_nrows (src0 ); 3305const int nc = src0 -> ne [0 ]; 3306 3307const size_t nb00 = src0 -> nb [0 ]; 3308const size_t nb01 = src0 -> nb [1 ]; 3309 3310const size_t nb10 = src1 -> nb [0 ]; 3311const size_t nb11 = src1 -> nb [1 ]; 3312 3313const size_t nb0 = dst -> nb [0 ]; 3314const size_t nb1 = dst -> nb [1 ]; 3315 3316GGML_ASSERT (nb0 == sizeof (float )); 3317GGML_ASSERT (nb00 == sizeof (float )); 3318 3319if (nb10 == sizeof (float )) { 3320const int j0 = (n /nth )* ith ; 3321const int j1 = ith == nth - 1 ?n : (n /nth )* (ith + 1 ); 3322 3323for (int j = j0 ;j < j1 ;j ++ ) { 3324ggml_vec_add_f32 (nc , 3325 (float * ) ((char * )dst -> data + j * nb1 ), 3326 (float * ) ((char * )src0 -> data + j * nb01 ), 3327 (float * ) ((char * )src1 -> data + j * nb11 )); 3328 } 3329 }else { 3330// src1 is not contiguous 3331for (int j = ith ;j < n ;j += nth ) { 3332float * dst_ptr = (float * ) ((char * )dst -> data + j * nb1 ); 3333float * src0_ptr = (float * ) ((char * )src0 -> data + j * nb01 ); 3334for (int i = 0 ;i < nc ;i ++ ) { 3335float * src1_ptr = (float * ) ((char * )src1 -> data + j * nb11 + i * nb10 ); 3336 3337dst_ptr [i ]= src0_ptr [i ]+ * src1_ptr ; 3338 } 3339 } 3340 } 3341} 3342 3343static void ggml_compute_forward_add ( 3344const struct ggml_compute_params * params , 3345const struct ggml_tensor * src0 , 3346const struct ggml_tensor * src1 , 3347struct ggml_tensor * dst ) { 3348switch (src0 -> type ) { 3349case GGML_TYPE_F32 : 3350 { 3351ggml_compute_forward_add_f32 (params ,src0 ,src1 ,dst ); 3352 }break ; 3353case GGML_TYPE_I8 : 3354case GGML_TYPE_I16 : 3355case GGML_TYPE_I32 : 3356case GGML_TYPE_F16 : 3357case GGML_TYPE_COUNT : 3358 { 3359assert (false); 3360 }break ; 3361 } 3362} 3363 3364// ggml_compute_forward_sub 3365 3366static void ggml_compute_forward_sub_f32 ( 3367const struct ggml_compute_params * params , 3368const struct ggml_tensor * src0 , 3369const struct ggml_tensor * src1 , 3370struct ggml_tensor * dst ) { 3371assert (params -> ith == 0 ); 3372assert (ggml_are_same_shape (src0 ,src1 )&& ggml_are_same_shape (src0 ,dst )); 3373 3374if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 3375return ; 3376 } 3377 3378const int n = ggml_nrows (src0 ); 3379const int nc = src0 -> ne [0 ]; 3380 3381assert (dst -> nb [0 ]== sizeof (float )); 3382assert (src0 -> nb [0 ]== sizeof (float )); 3383assert (src1 -> nb [0 ]== sizeof (float )); 3384 3385for (int i = 0 ;i < n ;i ++ ) { 3386ggml_vec_sub_f32 (nc , 3387 (float * ) ((char * )dst -> data + i * (dst -> nb [1 ])), 3388 (float * ) ((char * )src0 -> data + i * (src0 -> nb [1 ])), 3389 (float * ) ((char * )src1 -> data + i * (src1 -> nb [1 ]))); 3390 } 3391} 3392 3393static void ggml_compute_forward_sub ( 3394const struct ggml_compute_params * params , 3395const struct ggml_tensor * src0 , 3396const struct ggml_tensor * src1 , 3397struct ggml_tensor * dst ) { 3398switch (src0 -> type ) { 3399case GGML_TYPE_F32 : 3400 { 3401ggml_compute_forward_sub_f32 (params ,src0 ,src1 ,dst ); 3402 }break ; 3403case GGML_TYPE_I8 : 3404case GGML_TYPE_I16 : 3405case GGML_TYPE_I32 : 3406case GGML_TYPE_F16 : 3407case GGML_TYPE_COUNT : 3408 { 3409assert (false); 3410 }break ; 3411 } 3412} 3413 3414// ggml_compute_forward_mul 3415 3416static void ggml_compute_forward_mul_f32 ( 3417const struct ggml_compute_params * params , 3418const struct ggml_tensor * src0 , 3419const struct ggml_tensor * src1 , 3420struct ggml_tensor * dst ) { 3421assert (params -> ith == 0 ); 3422assert (ggml_are_same_shape (src0 ,src1 )&& ggml_are_same_shape (src0 ,dst )); 3423 3424if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 3425return ; 3426 } 3427 3428const int n = ggml_nrows (src0 ); 3429const int nc = src0 -> ne [0 ]; 3430 3431assert (dst -> nb [0 ]== sizeof (float )); 3432assert (src0 -> nb [0 ]== sizeof (float )); 3433assert (src1 -> nb [0 ]== sizeof (float )); 3434 3435for (int i = 0 ;i < n ;i ++ ) { 3436ggml_vec_mul_f32 (nc , 3437 (float * ) ((char * )dst -> data + i * (dst -> nb [1 ])), 3438 (float * ) ((char * )src0 -> data + i * (src0 -> nb [1 ])), 3439 (float * ) ((char * )src1 -> data + i * (src1 -> nb [1 ]))); 3440 } 3441} 3442 3443static void ggml_compute_forward_mul ( 3444const struct ggml_compute_params * params , 3445const struct ggml_tensor * src0 , 3446const struct ggml_tensor * src1 , 3447struct ggml_tensor * dst ) { 3448switch (src0 -> type ) { 3449case GGML_TYPE_F32 : 3450 { 3451ggml_compute_forward_mul_f32 (params ,src0 ,src1 ,dst ); 3452 }break ; 3453case GGML_TYPE_I8 : 3454case GGML_TYPE_I16 : 3455case GGML_TYPE_I32 : 3456case GGML_TYPE_F16 : 3457case GGML_TYPE_COUNT : 3458 { 3459assert (false); 3460 }break ; 3461 } 3462} 3463 3464// ggml_compute_forward_div 3465 3466static void ggml_compute_forward_div_f32 ( 3467const struct ggml_compute_params * params , 3468const struct ggml_tensor * src0 , 3469const struct ggml_tensor * src1 , 3470struct ggml_tensor * dst ) { 3471assert (params -> ith == 0 ); 3472assert (ggml_are_same_shape (src0 ,src1 )&& ggml_are_same_shape (src0 ,dst )); 3473 3474if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 3475return ; 3476 } 3477 3478const int n = ggml_nrows (src0 ); 3479const int nc = src0 -> ne [0 ]; 3480 3481assert (dst -> nb [0 ]== sizeof (float )); 3482assert (src0 -> nb [0 ]== sizeof (float )); 3483assert (src1 -> nb [0 ]== sizeof (float )); 3484 3485for (int i = 0 ;i < n ;i ++ ) { 3486ggml_vec_div_f32 (nc , 3487 (float * ) ((char * )dst -> data + i * (dst -> nb [1 ])), 3488 (float * ) ((char * )src0 -> data + i * (src0 -> nb [1 ])), 3489 (float * ) ((char * )src1 -> data + i * (src1 -> nb [1 ]))); 3490 } 3491} 3492 3493static void ggml_compute_forward_div ( 3494const struct ggml_compute_params * params , 3495const struct ggml_tensor * src0 , 3496const struct ggml_tensor * src1 , 3497struct ggml_tensor * dst ) { 3498switch (src0 -> type ) { 3499case GGML_TYPE_F32 : 3500 { 3501ggml_compute_forward_div_f32 (params ,src0 ,src1 ,dst ); 3502 }break ; 3503case GGML_TYPE_I8 : 3504case GGML_TYPE_I16 : 3505case GGML_TYPE_I32 : 3506case GGML_TYPE_F16 : 3507case GGML_TYPE_COUNT : 3508 { 3509assert (false); 3510 }break ; 3511 } 3512} 3513 3514// ggml_compute_forward_sqr 3515 3516static void ggml_compute_forward_sqr_f32 ( 3517const struct ggml_compute_params * params , 3518const struct ggml_tensor * src0 , 3519struct ggml_tensor * dst ) { 3520assert (params -> ith == 0 ); 3521assert (ggml_are_same_shape (src0 ,dst )); 3522 3523if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 3524return ; 3525 } 3526 3527const int n = ggml_nrows (src0 ); 3528const int nc = src0 -> ne [0 ]; 3529 3530assert (dst -> nb [0 ]== sizeof (float )); 3531assert (src0 -> nb [0 ]== sizeof (float )); 3532 3533for (int i = 0 ;i < n ;i ++ ) { 3534ggml_vec_sqr_f32 (nc , 3535 (float * ) ((char * )dst -> data + i * (dst -> nb [1 ])), 3536 (float * ) ((char * )src0 -> data + i * (src0 -> nb [1 ]))); 3537 } 3538} 3539 3540static void ggml_compute_forward_sqr ( 3541const struct ggml_compute_params * params , 3542const struct ggml_tensor * src0 , 3543struct ggml_tensor * dst ) { 3544switch (src0 -> type ) { 3545case GGML_TYPE_F32 : 3546 { 3547ggml_compute_forward_sqr_f32 (params ,src0 ,dst ); 3548 }break ; 3549case GGML_TYPE_I8 : 3550case GGML_TYPE_I16 : 3551case GGML_TYPE_I32 : 3552case GGML_TYPE_F16 : 3553case GGML_TYPE_COUNT : 3554 { 3555assert (false); 3556 }break ; 3557 } 3558} 3559 3560// ggml_compute_forward_sqrt 3561 3562static void ggml_compute_forward_sqrt_f32 ( 3563const struct ggml_compute_params * params , 3564const struct ggml_tensor * src0 , 3565struct ggml_tensor * dst ) { 3566assert (params -> ith == 0 ); 3567assert (ggml_are_same_shape (src0 ,dst )); 3568 3569if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 3570return ; 3571 } 3572 3573const int n = ggml_nrows (src0 ); 3574const int nc = src0 -> ne [0 ]; 3575 3576assert (dst -> nb [0 ]== sizeof (float )); 3577assert (src0 -> nb [0 ]== sizeof (float )); 3578 3579for (int i = 0 ;i < n ;i ++ ) { 3580ggml_vec_sqrt_f32 (nc , 3581 (float * ) ((char * )dst -> data + i * (dst -> nb [1 ])), 3582 (float * ) ((char * )src0 -> data + i * (src0 -> nb [1 ]))); 3583 } 3584} 3585 3586static void ggml_compute_forward_sqrt ( 3587const struct ggml_compute_params * params , 3588const struct ggml_tensor * src0 , 3589struct ggml_tensor * dst ) { 3590switch (src0 -> type ) { 3591case GGML_TYPE_F32 : 3592 { 3593ggml_compute_forward_sqrt_f32 (params ,src0 ,dst ); 3594 }break ; 3595case GGML_TYPE_I8 : 3596case GGML_TYPE_I16 : 3597case GGML_TYPE_I32 : 3598case GGML_TYPE_F16 : 3599case GGML_TYPE_COUNT : 3600 { 3601assert (false); 3602 }break ; 3603 } 3604} 3605 3606// ggml_compute_forward_sum 3607 3608static void ggml_compute_forward_sum_f32 ( 3609const struct ggml_compute_params * params , 3610const struct ggml_tensor * src0 , 3611struct ggml_tensor * dst ) { 3612assert (params -> ith == 0 ); 3613assert (ggml_is_scalar (dst )); 3614 3615if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 3616return ; 3617 } 3618 3619assert (ggml_is_scalar (dst )); 3620assert (src0 -> nb [0 ]== sizeof (float )); 3621 3622* (float * ) (dst -> data )= 0.0f ; 3623 3624const int ne00 = src0 -> ne [0 ]; 3625const int ne01 = src0 -> ne [1 ]; 3626const int ne02 = src0 -> ne [2 ]; 3627const int ne03 = src0 -> ne [3 ]; 3628 3629const size_t nb01 = src0 -> nb [1 ]; 3630const size_t nb02 = src0 -> nb [2 ]; 3631const size_t nb03 = src0 -> nb [3 ]; 3632 3633for (int i03 = 0 ;i03 < ne03 ;i03 ++ ) { 3634for (int i02 = 0 ;i02 < ne02 ;i02 ++ ) { 3635for (int i01 = 0 ;i01 < ne01 ;i01 ++ ) { 3636ggml_vec_sum_f32 (ne00 , 3637 (float * ) (dst -> data ), 3638 (float * ) ((char * )src0 -> data + i01 * nb01 + i02 * nb02 + i03 * nb03 )); 3639 } 3640 } 3641 } 3642} 3643 3644static void ggml_compute_forward_sum ( 3645const struct ggml_compute_params * params , 3646const struct ggml_tensor * src0 , 3647struct ggml_tensor * dst ) { 3648switch (src0 -> type ) { 3649case GGML_TYPE_F32 : 3650 { 3651ggml_compute_forward_sum_f32 (params ,src0 ,dst ); 3652 }break ; 3653case GGML_TYPE_I8 : 3654case GGML_TYPE_I16 : 3655case GGML_TYPE_I32 : 3656case GGML_TYPE_F16 : 3657case GGML_TYPE_COUNT : 3658 { 3659assert (false); 3660 }break ; 3661 } 3662} 3663 3664// ggml_compute_forward_mean 3665 3666static void ggml_compute_forward_mean_f32 ( 3667const struct ggml_compute_params * params , 3668const struct ggml_tensor * src0 , 3669struct ggml_tensor * dst ) { 3670assert (params -> ith == 0 ); 3671 3672if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 3673return ; 3674 } 3675 3676assert (src0 -> nb [0 ]== sizeof (float )); 3677 3678const int ne00 = src0 -> ne [0 ]; 3679const int ne01 = src0 -> ne [1 ]; 3680const int ne02 = src0 -> ne [2 ]; 3681const int ne03 = src0 -> ne [3 ]; 3682 3683const size_t nb01 = src0 -> nb [1 ]; 3684const size_t nb02 = src0 -> nb [2 ]; 3685const size_t nb03 = src0 -> nb [3 ]; 3686 3687const int ne0 = dst -> ne [0 ]; 3688const int ne1 = dst -> ne [1 ]; 3689const int ne2 = dst -> ne [2 ]; 3690const int ne3 = dst -> ne [3 ]; 3691 3692assert (ne0 == 1 ); 3693assert (ne1 == ne01 ); 3694assert (ne2 == ne02 ); 3695assert (ne3 == ne03 ); 3696 3697UNUSED (ne0 ); 3698UNUSED (ne1 ); 3699UNUSED (ne2 ); 3700UNUSED (ne3 ); 3701 3702const size_t nb1 = dst -> nb [1 ]; 3703const size_t nb2 = dst -> nb [2 ]; 3704const size_t nb3 = dst -> nb [3 ]; 3705 3706for (int i03 = 0 ;i03 < ne03 ;i03 ++ ) { 3707for (int i02 = 0 ;i02 < ne02 ;i02 ++ ) { 3708for (int i01 = 0 ;i01 < ne01 ;i01 ++ ) { 3709* (float * ) ((char * )dst -> data + i01 * nb1 + i02 * nb2 + i03 * nb3 )= 0.0f ; 3710 3711ggml_vec_sum_f32 (ne00 , 3712 (float * ) ((char * )dst -> data + i01 * nb1 + i02 * nb2 + i03 * nb3 ), 3713 (float * ) ((char * )src0 -> data + i01 * nb01 + i02 * nb02 + i03 * nb03 )); 3714 3715* (float * ) ((char * )dst -> data + i01 * nb1 + i02 * nb2 + i03 * nb3 ) /= (float )ne00 ; 3716 } 3717 } 3718 } 3719} 3720 3721static void ggml_compute_forward_mean ( 3722const struct ggml_compute_params * params , 3723const struct ggml_tensor * src0 , 3724struct ggml_tensor * dst ) { 3725switch (src0 -> type ) { 3726case GGML_TYPE_F32 : 3727 { 3728ggml_compute_forward_mean_f32 (params ,src0 ,dst ); 3729 }break ; 3730case GGML_TYPE_I8 : 3731case GGML_TYPE_I16 : 3732case GGML_TYPE_I32 : 3733case GGML_TYPE_F16 : 3734case GGML_TYPE_COUNT : 3735 { 3736assert (false); 3737 }break ; 3738 } 3739} 3740 3741// ggml_compute_forward_repeat 3742 3743static void ggml_compute_forward_repeat_f32 ( 3744const struct ggml_compute_params * params , 3745const struct ggml_tensor * src0 , 3746struct ggml_tensor * dst ) { 3747assert (params -> ith == 0 ); 3748assert (ggml_can_repeat (src0 ,dst )); 3749 3750if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 3751return ; 3752 } 3753 3754// TODO: implement support for rank > 2 tensors 3755assert (src0 -> ne [2 ]== 1 ); 3756assert (src0 -> ne [3 ]== 1 ); 3757assert (dst -> ne [2 ]== 1 ); 3758assert (dst -> ne [3 ]== 1 ); 3759 3760const int nc = dst -> ne [0 ]; 3761const int nr = dst -> ne [1 ]; 3762const int nc0 = src0 -> ne [0 ]; 3763const int nr0 = src0 -> ne [1 ]; 3764const int ncr = nc /nc0 ;// guaranteed to be an integer due to the check in ggml_can_repeat 3765const int nrr = nr /nr0 ;// guaranteed to be an integer due to the check in ggml_can_repeat 3766 3767// TODO: support for transposed / permuted tensors 3768assert (dst -> nb [0 ]== sizeof (float )); 3769assert (src0 -> nb [0 ]== sizeof (float )); 3770 3771// TODO: maybe this is not optimal? 3772for (int i = 0 ;i < nrr ;i ++ ) { 3773for (int j = 0 ;j < ncr ;j ++ ) { 3774for (int k = 0 ;k < nr0 ;k ++ ) { 3775ggml_vec_cpy_f32 (nc0 , 3776 (float * ) ((char * )dst -> data + (i * nr0 + k )* (dst -> nb [1 ])+ j * nc0 * (dst -> nb [0 ])), 3777 (float * ) ((char * )src0 -> data + (k )* (src0 -> nb [1 ]))); 3778 } 3779 } 3780 } 3781} 3782 3783static void ggml_compute_forward_repeat ( 3784const struct ggml_compute_params * params , 3785const struct ggml_tensor * src0 , 3786struct ggml_tensor * dst ) { 3787switch (src0 -> type ) { 3788case GGML_TYPE_F32 : 3789 { 3790ggml_compute_forward_repeat_f32 (params ,src0 ,dst ); 3791 }break ; 3792case GGML_TYPE_I8 : 3793case GGML_TYPE_I16 : 3794case GGML_TYPE_I32 : 3795case GGML_TYPE_F16 : 3796case GGML_TYPE_COUNT : 3797 { 3798assert (false); 3799 }break ; 3800 } 3801} 3802 3803// ggml_compute_forward_abs 3804 3805static void ggml_compute_forward_abs_f32 ( 3806const struct ggml_compute_params * params , 3807const struct ggml_tensor * src0 , 3808struct ggml_tensor * dst ) { 3809assert (params -> ith == 0 ); 3810assert (ggml_are_same_shape (src0 ,dst )); 3811 3812if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 3813return ; 3814 } 3815 3816const int n = ggml_nrows (src0 ); 3817const int nc = src0 -> ne [0 ]; 3818 3819assert (dst -> nb [0 ]== sizeof (float )); 3820assert (src0 -> nb [0 ]== sizeof (float )); 3821 3822for (int i = 0 ;i < n ;i ++ ) { 3823ggml_vec_abs_f32 (nc , 3824 (float * ) ((char * )dst -> data + i * (dst -> nb [1 ])), 3825 (float * ) ((char * )src0 -> data + i * (src0 -> nb [1 ]))); 3826 } 3827} 3828 3829static void ggml_compute_forward_abs ( 3830const struct ggml_compute_params * params , 3831const struct ggml_tensor * src0 , 3832struct ggml_tensor * dst ) { 3833switch (src0 -> type ) { 3834case GGML_TYPE_F32 : 3835 { 3836ggml_compute_forward_abs_f32 (params ,src0 ,dst ); 3837 }break ; 3838case GGML_TYPE_I8 : 3839case GGML_TYPE_I16 : 3840case GGML_TYPE_I32 : 3841case GGML_TYPE_F16 : 3842case GGML_TYPE_COUNT : 3843 { 3844assert (false); 3845 }break ; 3846 } 3847} 3848 3849// ggml_compute_forward_sgn 3850 3851static void ggml_compute_forward_sgn_f32 ( 3852const struct ggml_compute_params * params , 3853const struct ggml_tensor * src0 , 3854struct ggml_tensor * dst ) { 3855assert (params -> ith == 0 ); 3856assert (ggml_are_same_shape (src0 ,dst )); 3857 3858if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 3859return ; 3860 } 3861 3862const int n = ggml_nrows (src0 ); 3863const int nc = src0 -> ne [0 ]; 3864 3865assert (dst -> nb [0 ]== sizeof (float )); 3866assert (src0 -> nb [0 ]== sizeof (float )); 3867 3868for (int i = 0 ;i < n ;i ++ ) { 3869ggml_vec_sgn_f32 (nc , 3870 (float * ) ((char * )dst -> data + i * (dst -> nb [1 ])), 3871 (float * ) ((char * )src0 -> data + i * (src0 -> nb [1 ]))); 3872 } 3873} 3874 3875static void ggml_compute_forward_sgn ( 3876const struct ggml_compute_params * params , 3877const struct ggml_tensor * src0 , 3878struct ggml_tensor * dst ) { 3879switch (src0 -> type ) { 3880case GGML_TYPE_F32 : 3881 { 3882ggml_compute_forward_sgn_f32 (params ,src0 ,dst ); 3883 }break ; 3884case GGML_TYPE_I8 : 3885case GGML_TYPE_I16 : 3886case GGML_TYPE_I32 : 3887case GGML_TYPE_F16 : 3888case GGML_TYPE_COUNT : 3889 { 3890assert (false); 3891 }break ; 3892 } 3893} 3894 3895// ggml_compute_forward_neg 3896 3897static void ggml_compute_forward_neg_f32 ( 3898const struct ggml_compute_params * params , 3899const struct ggml_tensor * src0 , 3900struct ggml_tensor * dst ) { 3901assert (params -> ith == 0 ); 3902assert (ggml_are_same_shape (src0 ,dst )); 3903 3904if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 3905return ; 3906 } 3907 3908const int n = ggml_nrows (src0 ); 3909const int nc = src0 -> ne [0 ]; 3910 3911assert (dst -> nb [0 ]== sizeof (float )); 3912assert (src0 -> nb [0 ]== sizeof (float )); 3913 3914for (int i = 0 ;i < n ;i ++ ) { 3915ggml_vec_neg_f32 (nc , 3916 (float * ) ((char * )dst -> data + i * (dst -> nb [1 ])), 3917 (float * ) ((char * )src0 -> data + i * (src0 -> nb [1 ]))); 3918 } 3919} 3920 3921static void ggml_compute_forward_neg ( 3922const struct ggml_compute_params * params , 3923const struct ggml_tensor * src0 , 3924struct ggml_tensor * dst ) { 3925switch (src0 -> type ) { 3926case GGML_TYPE_F32 : 3927 { 3928ggml_compute_forward_neg_f32 (params ,src0 ,dst ); 3929 }break ; 3930case GGML_TYPE_I8 : 3931case GGML_TYPE_I16 : 3932case GGML_TYPE_I32 : 3933case GGML_TYPE_F16 : 3934case GGML_TYPE_COUNT : 3935 { 3936assert (false); 3937 }break ; 3938 } 3939} 3940 3941// ggml_compute_forward_step 3942 3943static void ggml_compute_forward_step_f32 ( 3944const struct ggml_compute_params * params , 3945const struct ggml_tensor * src0 , 3946struct ggml_tensor * dst ) { 3947assert (params -> ith == 0 ); 3948assert (ggml_are_same_shape (src0 ,dst )); 3949 3950if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 3951return ; 3952 } 3953 3954const int n = ggml_nrows (src0 ); 3955const int nc = src0 -> ne [0 ]; 3956 3957assert (dst -> nb [0 ]== sizeof (float )); 3958assert (src0 -> nb [0 ]== sizeof (float )); 3959 3960for (int i = 0 ;i < n ;i ++ ) { 3961ggml_vec_step_f32 (nc , 3962 (float * ) ((char * )dst -> data + i * (dst -> nb [1 ])), 3963 (float * ) ((char * )src0 -> data + i * (src0 -> nb [1 ]))); 3964 } 3965} 3966 3967static void ggml_compute_forward_step ( 3968const struct ggml_compute_params * params , 3969const struct ggml_tensor * src0 , 3970struct ggml_tensor * dst ) { 3971switch (src0 -> type ) { 3972case GGML_TYPE_F32 : 3973 { 3974ggml_compute_forward_step_f32 (params ,src0 ,dst ); 3975 }break ; 3976case GGML_TYPE_I8 : 3977case GGML_TYPE_I16 : 3978case GGML_TYPE_I32 : 3979case GGML_TYPE_F16 : 3980case GGML_TYPE_COUNT : 3981 { 3982assert (false); 3983 }break ; 3984 } 3985} 3986 3987// ggml_compute_forward_relu 3988 3989static void ggml_compute_forward_relu_f32 ( 3990const struct ggml_compute_params * params , 3991const struct ggml_tensor * src0 , 3992struct ggml_tensor * dst ) { 3993assert (params -> ith == 0 ); 3994assert (ggml_are_same_shape (src0 ,dst )); 3995 3996if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 3997return ; 3998 } 3999 4000const int n = ggml_nrows (src0 ); 4001const int nc = src0 -> ne [0 ]; 4002 4003assert (dst -> nb [0 ]== sizeof (float )); 4004assert (src0 -> nb [0 ]== sizeof (float )); 4005 4006for (int i = 0 ;i < n ;i ++ ) { 4007ggml_vec_relu_f32 (nc , 4008 (float * ) ((char * )dst -> data + i * (dst -> nb [1 ])), 4009 (float * ) ((char * )src0 -> data + i * (src0 -> nb [1 ]))); 4010 } 4011} 4012 4013static void ggml_compute_forward_relu ( 4014const struct ggml_compute_params * params , 4015const struct ggml_tensor * src0 , 4016struct ggml_tensor * dst ) { 4017switch (src0 -> type ) { 4018case GGML_TYPE_F32 : 4019 { 4020ggml_compute_forward_relu_f32 (params ,src0 ,dst ); 4021 }break ; 4022case GGML_TYPE_I8 : 4023case GGML_TYPE_I16 : 4024case GGML_TYPE_I32 : 4025case GGML_TYPE_F16 : 4026case GGML_TYPE_COUNT : 4027 { 4028assert (false); 4029 }break ; 4030 } 4031} 4032 4033// ggml_compute_forward_gelu 4034 4035static void ggml_compute_forward_gelu_f32 ( 4036const struct ggml_compute_params * params , 4037const struct ggml_tensor * src0 , 4038struct ggml_tensor * dst ) { 4039GGML_ASSERT (ggml_is_contiguous (src0 )); 4040GGML_ASSERT (ggml_is_contiguous (dst )); 4041GGML_ASSERT (ggml_are_same_shape (src0 ,dst )); 4042 4043if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 4044return ; 4045 } 4046 4047const int ith = params -> ith ; 4048const int nth = params -> nth ; 4049 4050const int nc = src0 -> ne [0 ]; 4051const int nr = ggml_nrows (src0 ); 4052 4053// rows per thread 4054const int dr = (nr + nth - 1 )/nth ; 4055 4056// row range for this thread 4057const int ir0 = dr * ith ; 4058const int ir1 = MIN (ir0 + dr ,nr ); 4059 4060for (int i1 = ir0 ;i1 < ir1 ;i1 ++ ) { 4061ggml_vec_gelu_f32 (nc , 4062 (float * ) ((char * )dst -> data + i1 * (dst -> nb [1 ])), 4063 (float * ) ((char * )src0 -> data + i1 * (src0 -> nb [1 ]))); 4064 4065#ifndef NDEBUG 4066for (int k = 0 ;k < nc ;k ++ ) { 4067const float x = ((float * ) ((char * )dst -> data + i1 * (dst -> nb [1 ])))[k ]; 4068UNUSED (x ); 4069assert (!isnan (x )); 4070assert (!isinf (x )); 4071 } 4072#endif 4073 } 4074} 4075 4076static void ggml_compute_forward_gelu ( 4077const struct ggml_compute_params * params , 4078const struct ggml_tensor * src0 , 4079struct ggml_tensor * dst ) { 4080switch (src0 -> type ) { 4081case GGML_TYPE_F32 : 4082 { 4083ggml_compute_forward_gelu_f32 (params ,src0 ,dst ); 4084 }break ; 4085case GGML_TYPE_I8 : 4086case GGML_TYPE_I16 : 4087case GGML_TYPE_I32 : 4088case GGML_TYPE_F16 : 4089case GGML_TYPE_COUNT : 4090 { 4091assert (false); 4092 }break ; 4093 } 4094} 4095 4096// ggml_compute_forward_norm 4097 4098static void ggml_compute_forward_norm_f32 ( 4099const struct ggml_compute_params * params , 4100const struct ggml_tensor * src0 , 4101struct ggml_tensor * dst ) { 4102GGML_ASSERT (ggml_are_same_shape (src0 ,dst )); 4103 4104if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 4105return ; 4106 } 4107 4108GGML_ASSERT (src0 -> nb [0 ]== sizeof (float )); 4109 4110const int ith = params -> ith ; 4111const int nth = params -> nth ; 4112 4113const int ne00 = src0 -> ne [0 ]; 4114const int ne01 = src0 -> ne [1 ]; 4115const int ne02 = src0 -> ne [2 ]; 4116const int ne03 = src0 -> ne [3 ]; 4117 4118const size_t nb01 = src0 -> nb [1 ]; 4119const size_t nb02 = src0 -> nb [2 ]; 4120const size_t nb03 = src0 -> nb [3 ]; 4121 4122const size_t nb1 = dst -> nb [1 ]; 4123const size_t nb2 = dst -> nb [2 ]; 4124const size_t nb3 = dst -> nb [3 ]; 4125 4126const ggml_float eps = 1e-5f ;// TODO: make this a parameter 4127 4128// TODO: optimize 4129for (int i03 = 0 ;i03 < ne03 ;i03 ++ ) { 4130for (int i02 = 0 ;i02 < ne02 ;i02 ++ ) { 4131for (int i01 = ith ;i01 < ne01 ;i01 += nth ) { 4132const float * x = (float * ) ((char * )src0 -> data + i01 * nb01 + i02 * nb02 + i03 * nb03 ); 4133 4134ggml_float mean = 0.0 ; 4135for (int i00 = 0 ;i00 < ne00 ;i00 ++ ) { 4136mean += x [i00 ]; 4137 } 4138 4139mean /=ne00 ; 4140 4141float * y = (float * ) ((char * )dst -> data + i01 * nb1 + i02 * nb2 + i03 * nb3 ); 4142 4143ggml_float sum2 = 0.0 ; 4144for (int i00 = 0 ;i00 < ne00 ;i00 ++ ) { 4145ggml_float v = x [i00 ]- mean ; 4146y [i00 ]= v ; 4147sum2 += v * v ; 4148 } 4149 4150const float scale = 1.0 /sqrt (sum2 /ne00 + eps ); 4151 4152ggml_vec_scale_f32 (ne00 ,y ,scale ); 4153 } 4154 } 4155 } 4156} 4157 4158static void ggml_compute_forward_norm ( 4159const struct ggml_compute_params * params , 4160const struct ggml_tensor * src0 , 4161struct ggml_tensor * dst ) { 4162switch (src0 -> type ) { 4163case GGML_TYPE_F32 : 4164 { 4165ggml_compute_forward_norm_f32 (params ,src0 ,dst ); 4166 }break ; 4167case GGML_TYPE_I8 : 4168case GGML_TYPE_I16 : 4169case GGML_TYPE_I32 : 4170case GGML_TYPE_F16 : 4171case GGML_TYPE_COUNT : 4172 { 4173assert (false); 4174 }break ; 4175 } 4176} 4177 4178// ggml_compute_forward_mul_mat 4179 4180#if defined(GGML_USE_ACCELERATE )|| defined(GGML_USE_OPENBLAS ) 4181// helper function to determine if it is better to use BLAS or not 4182// for large matrices, BLAS is faster 4183static bool ggml_compute_forward_mul_mat_use_blas ( 4184const struct ggml_tensor * src0 , 4185const struct ggml_tensor * src1 , 4186struct ggml_tensor * dst ) { 4187UNUSED (src0 ); 4188 4189const int ne10 = src1 -> ne [0 ]; 4190 4191const int ne0 = dst -> ne [0 ]; 4192const int ne1 = dst -> ne [1 ]; 4193 4194// TODO: find the optimal values for these 4195if (ggml_is_contiguous (src0 )&& ggml_is_contiguous (src1 )&& ne0 >=32 && ne1 >=32 && ne10 >=32 ) { 4196//printf("BLAS: %d %d %d\n", ne0, ne1, ne10); 4197return true; 4198 } 4199 4200return false; 4201} 4202#endif 4203 4204static void ggml_compute_forward_mul_mat_f32 ( 4205const struct ggml_compute_params * params , 4206const struct ggml_tensor * src0 , 4207const struct ggml_tensor * src1 , 4208struct ggml_tensor * dst ) { 4209int64_t t0 = ggml_perf_time_us (); 4210UNUSED (t0 ); 4211 4212const int ne00 = src0 -> ne [0 ]; 4213const int ne01 = src0 -> ne [1 ]; 4214const int ne02 = src0 -> ne [2 ]; 4215const int ne03 = src0 -> ne [3 ]; 4216 4217const int ne10 = src1 -> ne [0 ]; 4218const int ne11 = src1 -> ne [1 ]; 4219const int ne12 = src1 -> ne [2 ]; 4220const int ne13 = src1 -> ne [3 ]; 4221 4222const int ne0 = dst -> ne [0 ]; 4223const int ne1 = dst -> ne [1 ]; 4224const int ne2 = dst -> ne [2 ]; 4225const int ne3 = dst -> ne [3 ]; 4226const int ne = ne0 * ne1 * ne2 * ne3 ; 4227 4228const int nb00 = src0 -> nb [0 ]; 4229const int nb01 = src0 -> nb [1 ]; 4230const int nb02 = src0 -> nb [2 ]; 4231const int nb03 = src0 -> nb [3 ]; 4232 4233const int nb10 = src1 -> nb [0 ]; 4234const int nb11 = src1 -> nb [1 ]; 4235const int nb12 = src1 -> nb [2 ]; 4236const int nb13 = src1 -> nb [3 ]; 4237 4238const int nb0 = dst -> nb [0 ]; 4239const int nb1 = dst -> nb [1 ]; 4240const int nb2 = dst -> nb [2 ]; 4241const int nb3 = dst -> nb [3 ]; 4242 4243const int ith = params -> ith ; 4244const int nth = params -> nth ; 4245 4246assert (ne02 == ne12 ); 4247assert (ne03 == ne13 ); 4248assert (ne2 == ne12 ); 4249assert (ne3 == ne13 ); 4250 4251// TODO: we don't support permuted src0 4252assert (nb00 == sizeof (float )|| nb01 == sizeof (float )); 4253 4254// dst cannot be transposed or permuted 4255assert (nb0 == sizeof (float )); 4256assert (nb0 <=nb1 ); 4257assert (nb1 <=nb2 ); 4258assert (nb2 <=nb3 ); 4259 4260assert (ne0 == ne01 ); 4261assert (ne1 == ne11 ); 4262assert (ne2 == ne02 ); 4263assert (ne3 == ne03 ); 4264 4265// nb01 >= nb00 - src0 is not transposed 4266// compute by src0 rows 4267// 4268// nb00 < nb01 - src0 is transposed 4269// compute by src0 columns 4270 4271#if defined(GGML_USE_ACCELERATE )|| defined(GGML_USE_OPENBLAS ) 4272if (ggml_compute_forward_mul_mat_use_blas (src0 ,src1 ,dst )) { 4273GGML_ASSERT (nb10 == sizeof (float )); 4274 4275if (params -> ith != 0 )return ; 4276 4277if (params -> type == GGML_TASK_INIT ) { 4278return ; 4279 } 4280 4281if (params -> type == GGML_TASK_FINALIZE ) { 4282return ; 4283 } 4284 4285for (int i03 = 0 ;i03 < ne03 ;i03 ++ ) { 4286for (int i02 = 0 ;i02 < ne02 ;i02 ++ ) { 4287const float * x = (float * ) (src0 -> data ); 4288const float * y = (float * ) ((char * )src1 -> data + i02 * nb12 + i03 * nb13 ); 4289 4290float * d = (float * ) ((char * )dst -> data + i02 * nb2 + i03 * nb3 ); 4291 4292// zT = y * xT 4293 { 4294cblas_sgemm (CblasRowMajor ,CblasNoTrans ,CblasTrans , 4295ne11 ,ne01 ,ne10 , 42961.0f ,y ,ne10 , 4297x ,ne10 , 42980.0f ,d ,ne01 ); 4299 } 4300 } 4301 } 4302 4303//printf("CBLAS F32 = %f ms, %d x %d x %d x %d\n", (ggml_perf_time_us() - t0)/1000.0, ne0, ne1, ne2, ne3); 4304 4305return ; 4306 } 4307#endif 4308 4309if (params -> type == GGML_TASK_INIT ) { 4310if (nb01 >=nb00 ) { 4311return ; 4312 } 4313 4314// TODO: fix this memset (wsize is overestimated) 4315memset (params -> wdata ,0 ,params -> wsize ); 4316return ; 4317 } 4318 4319if (params -> type == GGML_TASK_FINALIZE ) { 4320if (nb01 >=nb00 ) { 4321return ; 4322 } 4323 4324// TODO: fix this memset (wsize is overestimated) 4325//assert(params->wsize == (ggml_nbytes(dst) + CACHE_LINE_SIZE)*nth); 4326 4327float * const wdata = params -> wdata ; 4328 4329// cols per thread 4330const int dc = (ne + nth - 1 )/nth ; 4331 4332// col range for this thread 4333const int ic0 = dc * ith ; 4334const int ic1 = MIN (ic0 + dc ,ne ); 4335 4336ggml_vec_cpy_f32 (ic1 - ic0 , (float * )dst -> data + ic0 ,wdata + ic0 ); 4337 4338for (int k = 1 ;k < nth ;k ++ ) { 4339ggml_vec_acc_f32 (ic1 - ic0 , (float * )dst -> data + ic0 ,wdata + (ne + CACHE_LINE_SIZE_F32 )* k + ic0 ); 4340 } 4341 4342return ; 4343 } 4344 4345if (nb01 >=nb00 ) { 4346// TODO: do not support transposed src1 4347assert (nb10 == sizeof (float )); 4348 4349// parallelize by src0 rows using ggml_vec_dot_f32 4350 4351// total rows in src0 4352const int nr = ne01 * ne02 * ne03 ; 4353 4354// rows per thread 4355const int dr = (nr + nth - 1 )/nth ; 4356 4357// row range for this thread 4358const int ir0 = dr * ith ; 4359const int ir1 = MIN (ir0 + dr ,nr ); 4360 4361for (int ir = ir0 ;ir < ir1 ;++ ir ) { 4362// src0 indices 4363const int i03 = ir /(ne02 * ne01 ); 4364const int i02 = (ir - i03 * ne02 * ne01 )/ne01 ; 4365const int i01 = (ir - i03 * ne02 * ne01 - i02 * ne01 ); 4366 4367for (int ic = 0 ;ic < ne11 ;++ ic ) { 4368// src1 indices 4369const int i13 = i03 ; 4370const int i12 = i02 ; 4371const int i11 = ic ; 4372 4373// dst indices 4374const int i0 = i01 ; 4375const int i1 = i11 ; 4376const int i2 = i02 ; 4377const int i3 = i03 ; 4378 4379ggml_vec_dot_f32 (ne00 , 4380 (float * ) ((char * )dst -> data + (i0 * nb0 + i1 * nb1 + i2 * nb2 + i3 * nb3 )), 4381 (float * ) ((char * )src0 -> data + (i01 * nb01 + i02 * nb02 + i03 * nb03 )), 4382 (float * ) ((char * )src1 -> data + (i11 * nb11 + i12 * nb12 + i13 * nb13 ))); 4383 } 4384 } 4385 }else { 4386// parallelize by src1 columns using ggml_vec_mad_f32 4387// each thread has its own work data 4388// during FINALIZE we accumulate all work data into dst 4389 4390// total columns in src1 4391const int nc = ne10 ; 4392 4393// columns per thread 4394const int dc = (nc + nth - 1 )/nth ; 4395 4396// column range for this thread 4397const int ic0 = dc * ith ; 4398const int ic1 = MIN (ic0 + dc ,nc ); 4399 4400// work data for thread 4401const int wo = (ne + CACHE_LINE_SIZE_F32 )* ith ; 4402float * const wdata = params -> wdata ; 4403 4404for (int i13 = 0 ;i13 < ne13 ;++ i13 ) { 4405for (int i12 = 0 ;i12 < ne12 ;++ i12 ) { 4406for (int i11 = 0 ;i11 < ne11 ;++ i11 ) { 4407for (int ic = ic0 ;ic < ic1 ;++ ic ) { 4408// src1 indices 4409const int i10 = ic ; 4410 4411// src0 indices 4412const int i03 = i13 ; 4413const int i02 = i12 ; 4414const int i00 = ic ; 4415 4416// dst indices 4417const int i1 = i11 ; 4418const int i2 = i12 ; 4419const int i3 = i13 ; 4420 4421assert (sizeof (float )* (wo + i3 * ne2 * ne1 * ne0 + i2 * ne1 * ne0 + i1 * ne0 + ne01 ) <=params -> wsize ); 4422 4423ggml_vec_mad_f32 (ne01 , 4424 (float * ) (wdata + wo + i3 * ne2 * ne1 * ne0 + i2 * ne1 * ne0 + i1 * ne0 ), 4425 (float * ) ((char * )src0 -> data + (i00 * nb00 + i02 * nb02 + i03 * nb03 )), 4426* (float * ) ((char * )src1 -> data + (i10 * nb10 + i11 * nb11 + i12 * nb12 + i13 * nb13 ))); 4427 } 4428 } 4429 } 4430 } 4431 } 4432 4433//int64_t t1 = ggml_perf_time_us(); 4434//static int64_t acc = 0; 4435//acc += t1 - t0; 4436//if (t1 - t0 > 10) { 4437// printf("\n"); 4438// printf("ne00 = %5d, ne01 = %5d, ne02 = %5d, ne03 = %5d\n", ne00, ne01, ne02, ne03); 4439// printf("nb00 = %5d, nb01 = %5d, nb02 = %5d, nb03 = %5d\n", nb00, nb01, nb02, nb03); 4440// printf("ne10 = %5d, ne11 = %5d, ne12 = %5d, ne13 = %5d\n", ne10, ne11, ne12, ne13); 4441// printf("nb10 = %5d, nb11 = %5d, nb12 = %5d, nb13 = %5d\n", nb10, nb11, nb12, nb13); 4442 4443// printf("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX task %d/%d: %d us, acc = %d\n", ith, nth, (int) (t1 - t0), (int) acc); 4444//} 4445} 4446 4447static void ggml_compute_forward_mul_mat_f16_f32 ( 4448const struct ggml_compute_params * params , 4449const struct ggml_tensor * src0 , 4450const struct ggml_tensor * src1 , 4451struct ggml_tensor * dst ) { 4452int64_t t0 = ggml_perf_time_us (); 4453UNUSED (t0 ); 4454 4455const int ne00 = src0 -> ne [0 ]; 4456const int ne01 = src0 -> ne [1 ]; 4457const int ne02 = src0 -> ne [2 ]; 4458const int ne03 = src0 -> ne [3 ]; 4459 4460const int ne10 = src1 -> ne [0 ]; 4461const int ne11 = src1 -> ne [1 ]; 4462const int ne12 = src1 -> ne [2 ]; 4463const int ne13 = src1 -> ne [3 ]; 4464 4465const int ne0 = dst -> ne [0 ]; 4466const int ne1 = dst -> ne [1 ]; 4467const int ne2 = dst -> ne [2 ]; 4468const int ne3 = dst -> ne [3 ]; 4469const int ne = ne0 * ne1 * ne2 * ne3 ; 4470 4471const int nb00 = src0 -> nb [0 ]; 4472const int nb01 = src0 -> nb [1 ]; 4473const int nb02 = src0 -> nb [2 ]; 4474const int nb03 = src0 -> nb [3 ]; 4475 4476const int nb10 = src1 -> nb [0 ]; 4477const int nb11 = src1 -> nb [1 ]; 4478const int nb12 = src1 -> nb [2 ]; 4479const int nb13 = src1 -> nb [3 ]; 4480 4481const int nb0 = dst -> nb [0 ]; 4482const int nb1 = dst -> nb [1 ]; 4483const int nb2 = dst -> nb [2 ]; 4484const int nb3 = dst -> nb [3 ]; 4485 4486const int ith = params -> ith ; 4487const int nth = params -> nth ; 4488 4489GGML_ASSERT (ne02 == ne12 ); 4490GGML_ASSERT (ne03 == ne13 ); 4491GGML_ASSERT (ne2 == ne12 ); 4492GGML_ASSERT (ne3 == ne13 ); 4493 4494// TODO: we don't support permuted src0 4495GGML_ASSERT (nb00 == sizeof (ggml_fp16_t )|| nb01 == sizeof (ggml_fp16_t )); 4496 4497// dst cannot be transposed or permuted 4498GGML_ASSERT (nb0 == sizeof (float )); 4499GGML_ASSERT (nb0 <=nb1 ); 4500GGML_ASSERT (nb1 <=nb2 ); 4501GGML_ASSERT (nb2 <=nb3 ); 4502 4503GGML_ASSERT (ne0 == ne01 ); 4504GGML_ASSERT (ne1 == ne11 ); 4505GGML_ASSERT (ne2 == ne02 ); 4506GGML_ASSERT (ne3 == ne03 ); 4507 4508// nb01 >= nb00 - src0 is not transposed 4509// compute by src0 rows 4510// 4511// nb00 < nb01 - src0 is transposed 4512// compute by src0 columns 4513 4514#if defined(GGML_USE_ACCELERATE )|| defined(GGML_USE_OPENBLAS ) 4515if (ggml_compute_forward_mul_mat_use_blas (src0 ,src1 ,dst )) { 4516GGML_ASSERT (nb10 == sizeof (float )); 4517 4518if (params -> ith != 0 )return ; 4519 4520if (params -> type == GGML_TASK_INIT ) { 4521return ; 4522 } 4523 4524if (params -> type == GGML_TASK_FINALIZE ) { 4525return ; 4526 } 4527 4528float * const wdata = params -> wdata ; 4529 4530for (int i03 = 0 ;i03 < ne03 ;i03 ++ ) { 4531for (int i02 = 0 ;i02 < ne02 ;i02 ++ ) { 4532 { 4533int id = 0 ; 4534for (int i01 = 0 ;i01 < ne01 ;++ i01 ) { 4535for (int i00 = 0 ;i00 < ne00 ;++ i00 ) { 4536wdata [id ++ ]= GGML_FP16_TO_FP32 (* (ggml_fp16_t * ) ((char * )src0 -> data + i03 * nb03 + i02 * nb02 + i01 * nb01 + i00 * nb00 )); 4537 } 4538 } 4539 } 4540 4541const float * x = wdata ; 4542const float * y = (float * ) ((char * )src1 -> data + i02 * nb12 + i03 * nb13 ); 4543 4544// float * z = wdata + ne00*ne01; 4545 4546// z = x * yT 4547//{ 4548// cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasTrans, 4549// ne01, ne11, ne00, 4550// 1.0f, x, ne00, 4551// y, ne00, 4552// 0.0f, z, ne11); 4553//} 4554 4555float * d = (float * ) ((char * )dst -> data + i02 * nb2 + i03 * nb3 ); 4556 4557// transpose z 4558//for (int j = 0; j < ne11; ++j) { 4559// for (int i = 0; i < ne01; ++i) { 4560// d[j*ne01 + i] = z[i*ne11 + j]; 4561// } 4562//} 4563 4564 { 4565#if 1 4566// zT = y * xT 4567cblas_sgemm (CblasRowMajor ,CblasNoTrans ,CblasTrans , 4568ne11 ,ne01 ,ne10 , 45691.0f ,y ,ne00 , 4570x ,ne00 , 45710.0f ,d ,ne01 ); 4572#else 4573// zT = (xT * y)T 4574cblas_sgemm (CblasColMajor ,CblasTrans ,CblasNoTrans , 4575ne01 ,ne11 ,ne10 , 45761.0f ,x ,ne00 , 4577y ,ne00 , 45780.0f ,d ,ne01 ); 4579#endif 4580 } 4581 } 4582 } 4583 4584//printf("CBLAS = %f ms, %d x %d x %d x %d\n", (ggml_perf_time_us() - t0)/1000.0, ne0, ne1, ne2, ne3); 4585 4586return ; 4587 } 4588#endif 4589 4590if (params -> type == GGML_TASK_INIT ) { 4591if (nb01 >=nb00 ) { 4592ggml_fp16_t * const wdata = params -> wdata ; 4593 4594int id = 0 ; 4595for (int i13 = 0 ;i13 < ne13 ;++ i13 ) { 4596for (int i12 = 0 ;i12 < ne12 ;++ i12 ) { 4597for (int i11 = 0 ;i11 < ne11 ;++ i11 ) { 4598for (int i10 = 0 ;i10 < ne10 ;++ i10 ) { 4599wdata [id ++ ]= GGML_FP32_TO_FP16 (* (float * )((char * )src1 -> data + i13 * nb13 + i12 * nb12 + i11 * nb11 + i10 * nb10 )); 4600 } 4601 } 4602 } 4603 } 4604 4605GGML_ASSERT (id * sizeof (ggml_fp16_t ) <=params -> wsize ); 4606 4607return ; 4608 } 4609 4610// TODO: fix this memset (wsize is overestimated) 4611memset (params -> wdata ,0 ,params -> wsize ); 4612return ; 4613 } 4614 4615if (params -> type == GGML_TASK_FINALIZE ) { 4616if (nb01 >=nb00 ) { 4617return ; 4618 } 4619 4620// TODO: fix this memset (wsize is overestimated) 4621//assert(params->wsize == (ggml_nbytes(dst) + CACHE_LINE_SIZE)*nth); 4622 4623ggml_fp16_t * const wdata = params -> wdata ; 4624 4625// cols per thread 4626const int dc = (ne + nth - 1 )/nth ; 4627 4628// col range for this thread 4629const int ic0 = dc * ith ; 4630const int ic1 = MIN (ic0 + dc ,ne ); 4631 4632for (int i = ic0 ;i < ic1 ;++ i ) { 4633 ((float * )dst -> data )[i ]= GGML_FP16_TO_FP32 (wdata [i ]); 4634 } 4635 4636for (int k = 1 ;k < nth ;k ++ ) { 4637for (int i = ic0 ;i < ic1 ;++ i ) { 4638 ((float * )dst -> data )[i ]+= GGML_FP16_TO_FP32 (wdata [(ne + CACHE_LINE_SIZE_F32 )* k + i ]); 4639 } 4640 } 4641 4642return ; 4643 } 4644 4645if (nb01 >=nb00 ) { 4646// fp16 -> half the size, so divide by 2 4647// TODO: do not support transposed src1 4648assert (nb10 /2 == sizeof (ggml_fp16_t )); 4649 4650// parallelize by src0 rows using ggml_vec_dot_f32 4651 4652// total rows in src0 4653const int nr = ne01 * ne02 * ne03 ; 4654 4655// rows per thread 4656const int dr = (nr + nth - 1 )/nth ; 4657 4658// row range for this thread 4659const int ir0 = dr * ith ; 4660const int ir1 = MIN (ir0 + dr ,nr ); 4661 4662ggml_fp16_t * wdata = params -> wdata ; 4663 4664for (int ir = ir0 ;ir < ir1 ;++ ir ) { 4665// src0 indices 4666const int i03 = ir /(ne02 * ne01 ); 4667const int i02 = (ir - i03 * ne02 * ne01 )/ne01 ; 4668const int i01 = (ir - i03 * ne02 * ne01 - i02 * ne01 ); 4669 4670const int i13 = i03 ; 4671const int i12 = i02 ; 4672 4673const int i0 = i01 ; 4674const int i2 = i02 ; 4675const int i3 = i03 ; 4676 4677ggml_fp16_t * src0_row = (ggml_fp16_t * ) ((char * )src0 -> data + (i01 * nb01 + i02 * nb02 + i03 * nb03 )); 4678ggml_fp16_t * src1_col = wdata + (i13 * ne12 * ne11 + i12 * ne11 + 0 )* ne00 ; 4679 4680float * dst_col = (float * ) ((char * )dst -> data + (i0 * nb0 + 0 * nb1 + i2 * nb2 + i3 * nb3 )); 4681 4682for (int ic = 0 ;ic < ne11 ;++ ic ) { 4683assert (ne00 %32 == 0 ); 4684 4685ggml_vec_dot_f16 (ne00 ,& dst_col [ic * ne0 ],src0_row ,src1_col + ic * ne00 ); 4686 } 4687 } 4688 }else { 4689// parallelize by src1 columns using ggml_vec_mad_f32 4690// each thread has its own work data 4691// during FINALIZE we accumulate all work data into dst 4692 4693// total columns in src1 4694const int nc = ne10 ; 4695 4696// columns per thread 4697const int dc = (nc + nth - 1 )/nth ; 4698 4699// column range for this thread 4700const int ic0 = dc * ith ; 4701const int ic1 = MIN (ic0 + dc ,nc ); 4702 4703// work data for thread 4704const int wo = (ne + CACHE_LINE_SIZE_F32 )* ith ; 4705ggml_fp16_t * const wdata = params -> wdata ; 4706 4707for (int i13 = 0 ;i13 < ne13 ;++ i13 ) { 4708for (int i12 = 0 ;i12 < ne12 ;++ i12 ) { 4709for (int i11 = 0 ;i11 < ne11 ;++ i11 ) { 4710// dst indices 4711const int i1 = i11 ; 4712const int i2 = i12 ; 4713const int i3 = i13 ; 4714 4715ggml_fp16_t * dst_row = wdata + wo + i3 * ne2 * ne1 * ne0 + i2 * ne1 * ne0 + i1 * ne0 ; 4716 4717for (int ic = ic0 ;ic < ic1 ;++ ic ) { 4718// src1 indices 4719const int i10 = ic ; 4720 4721// src0 indices 4722const int i03 = i13 ; 4723const int i02 = i12 ; 4724const int i00 = ic ; 4725 4726assert (sizeof (ggml_fp16_t )* (wo + i3 * ne2 * ne1 * ne0 + i2 * ne1 * ne0 + i1 * ne0 + ne01 ) <=params -> wsize ); 4727 4728ggml_fp16_t * src0_col = (ggml_fp16_t * ) ((char * )src0 -> data + (i00 * nb00 + i02 * nb02 + i03 * nb03 )); 4729float src1_val = * (float * ) ((char * )src1 -> data + (i10 * nb10 + i11 * nb11 + i12 * nb12 + i13 * nb13 )); 4730 4731ggml_vec_mad_f16 (ne01 ,dst_row ,src0_col ,src1_val ); 4732 } 4733 } 4734 } 4735 } 4736 } 4737 4738//int64_t t1 = ggml_time_us(); 4739//static int64_t acc = 0; 4740//acc += t1 - t0; 4741//if (t1 - t0 > 10) { 4742// printf("\n"); 4743// printf("ne00 = %5d, ne01 = %5d, ne02 = %5d, ne03 = %5d\n", ne00, ne01, ne02, ne03); 4744// printf("nb00 = %5d, nb01 = %5d, nb02 = %5d, nb03 = %5d\n", nb00, nb01, nb02, nb03); 4745// printf("ne10 = %5d, ne11 = %5d, ne12 = %5d, ne13 = %5d\n", ne10, ne11, ne12, ne13); 4746 4747// printf("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX task %d/%d: %d us, acc = %d\n", ith, nth, (int) (t1 - t0), (int) acc); 4748//} 4749} 4750 4751static void ggml_compute_forward_mul_mat ( 4752const struct ggml_compute_params * params , 4753const struct ggml_tensor * src0 , 4754const struct ggml_tensor * src1 , 4755struct ggml_tensor * dst ) { 4756switch (src0 -> type ) { 4757case GGML_TYPE_F16 : 4758 { 4759ggml_compute_forward_mul_mat_f16_f32 (params ,src0 ,src1 ,dst ); 4760 }break ; 4761case GGML_TYPE_F32 : 4762 { 4763ggml_compute_forward_mul_mat_f32 (params ,src0 ,src1 ,dst ); 4764 }break ; 4765case GGML_TYPE_I8 : 4766case GGML_TYPE_I16 : 4767case GGML_TYPE_I32 : 4768case GGML_TYPE_COUNT : 4769 { 4770assert (false); 4771 }break ; 4772 } 4773} 4774 4775// ggml_compute_forward_scale 4776 4777static void ggml_compute_forward_scale_f32 ( 4778const struct ggml_compute_params * params , 4779const struct ggml_tensor * src0 , 4780const struct ggml_tensor * src1 , 4781struct ggml_tensor * dst ) { 4782GGML_ASSERT (ggml_is_contiguous (src0 )); 4783GGML_ASSERT (ggml_is_contiguous (dst )); 4784GGML_ASSERT (ggml_are_same_shape (src0 ,dst )); 4785GGML_ASSERT (ggml_is_scalar (src1 )); 4786 4787if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 4788return ; 4789 } 4790 4791// scale factor 4792const float v = * (float * )src1 -> data ; 4793 4794const int ith = params -> ith ; 4795const int nth = params -> nth ; 4796 4797const int nc = src0 -> ne [0 ]; 4798const int nr = ggml_nrows (src0 ); 4799 4800// rows per thread 4801const int dr = (nr + nth - 1 )/nth ; 4802 4803// row range for this thread 4804const int ir0 = dr * ith ; 4805const int ir1 = MIN (ir0 + dr ,nr ); 4806 4807for (int i1 = ir0 ;i1 < ir1 ;i1 ++ ) { 4808ggml_vec_scale_f32 (nc , (float * ) ((char * )dst -> data + i1 * (dst -> nb [1 ])),v ); 4809 } 4810} 4811 4812static void ggml_compute_forward_scale ( 4813const struct ggml_compute_params * params , 4814const struct ggml_tensor * src0 , 4815const struct ggml_tensor * src1 , 4816struct ggml_tensor * dst ) { 4817switch (src0 -> type ) { 4818case GGML_TYPE_F32 : 4819 { 4820ggml_compute_forward_scale_f32 (params ,src0 ,src1 ,dst ); 4821 }break ; 4822case GGML_TYPE_I8 : 4823case GGML_TYPE_I16 : 4824case GGML_TYPE_I32 : 4825case GGML_TYPE_F16 : 4826case GGML_TYPE_COUNT : 4827 { 4828assert (false); 4829 }break ; 4830 } 4831} 4832 4833// ggml_compute_forward_cpy 4834 4835static void ggml_compute_forward_cpy ( 4836const struct ggml_compute_params * params , 4837const struct ggml_tensor * src0 , 4838struct ggml_tensor * dst ) { 4839ggml_compute_forward_dup (params ,src0 ,dst ); 4840} 4841 4842// ggml_compute_forward_reshape 4843 4844static void ggml_compute_forward_reshape ( 4845const struct ggml_compute_params * params , 4846const struct ggml_tensor * src0 , 4847struct ggml_tensor * dst ) { 4848// NOP 4849UNUSED (params ); 4850UNUSED (src0 ); 4851UNUSED (dst ); 4852} 4853 4854// ggml_compute_forward_view 4855 4856static void ggml_compute_forward_view ( 4857const struct ggml_compute_params * params , 4858const struct ggml_tensor * src0 ) { 4859// NOP 4860UNUSED (params ); 4861UNUSED (src0 ); 4862} 4863 4864// ggml_compute_forward_permute 4865 4866static void ggml_compute_forward_permute ( 4867const struct ggml_compute_params * params , 4868const struct ggml_tensor * src0 ) { 4869// NOP 4870UNUSED (params ); 4871UNUSED (src0 ); 4872} 4873 4874// ggml_compute_forward_transpose 4875 4876static void ggml_compute_forward_transpose ( 4877const struct ggml_compute_params * params , 4878const struct ggml_tensor * src0 ) { 4879// NOP 4880UNUSED (params ); 4881UNUSED (src0 ); 4882} 4883 4884// ggml_compute_forward_get_rows 4885 4886static void ggml_compute_forward_get_rows_f16 ( 4887const struct ggml_compute_params * params , 4888const struct ggml_tensor * src0 , 4889const struct ggml_tensor * src1 , 4890struct ggml_tensor * dst ) { 4891assert (params -> ith == 0 ); 4892 4893if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 4894return ; 4895 } 4896 4897const int nc = src0 -> ne [0 ]; 4898const int nr = ggml_nelements (src1 ); 4899 4900assert (dst -> ne [0 ]== nc ); 4901assert (dst -> ne [1 ]== nr ); 4902assert (src0 -> nb [0 ]== sizeof (ggml_fp16_t )); 4903 4904for (int i = 0 ;i < nr ;++ i ) { 4905const int r = ((int32_t * )src1 -> data )[i ]; 4906 4907for (int j = 0 ;j < nc ;++ j ) { 4908ggml_fp16_t v = ((ggml_fp16_t * ) ((char * )src0 -> data + r * src0 -> nb [1 ]))[j ]; 4909 ((float * ) ((char * )dst -> data + i * dst -> nb [1 ]))[j ]= GGML_FP16_TO_FP32 (v ); 4910 } 4911 } 4912} 4913 4914static void ggml_compute_forward_get_rows_f32 ( 4915const struct ggml_compute_params * params , 4916const struct ggml_tensor * src0 , 4917const struct ggml_tensor * src1 , 4918struct ggml_tensor * dst ) { 4919assert (params -> ith == 0 ); 4920 4921if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 4922return ; 4923 } 4924 4925const int nc = src0 -> ne [0 ]; 4926const int nr = ggml_nelements (src1 ); 4927 4928assert (dst -> ne [0 ]== nc ); 4929assert (dst -> ne [1 ]== nr ); 4930assert (src0 -> nb [0 ]== sizeof (float )); 4931 4932for (int i = 0 ;i < nr ;++ i ) { 4933const int r = ((int32_t * )src1 -> data )[i ]; 4934 4935ggml_vec_cpy_f32 (nc , 4936 (float * ) ((char * )dst -> data + i * dst -> nb [1 ]), 4937 (float * ) ((char * )src0 -> data + r * src0 -> nb [1 ])); 4938 } 4939} 4940 4941static void ggml_compute_forward_get_rows ( 4942const struct ggml_compute_params * params , 4943const struct ggml_tensor * src0 , 4944const struct ggml_tensor * src1 , 4945struct ggml_tensor * dst ) { 4946switch (src0 -> type ) { 4947case GGML_TYPE_F16 : 4948 { 4949ggml_compute_forward_get_rows_f16 (params ,src0 ,src1 ,dst ); 4950 }break ; 4951case GGML_TYPE_F32 : 4952 { 4953ggml_compute_forward_get_rows_f32 (params ,src0 ,src1 ,dst ); 4954 }break ; 4955case GGML_TYPE_I8 : 4956case GGML_TYPE_I16 : 4957case GGML_TYPE_I32 : 4958case GGML_TYPE_COUNT : 4959 { 4960assert (false); 4961 }break ; 4962 } 4963} 4964 4965// ggml_compute_forward_diag_mask_inf 4966 4967static void ggml_compute_forward_diag_mask_inf_f32 ( 4968const struct ggml_compute_params * params , 4969const struct ggml_tensor * src0 , 4970const struct ggml_tensor * src1 , 4971struct ggml_tensor * dst ) { 4972assert (params -> ith == 0 ); 4973assert (src1 -> type == GGML_TYPE_I32 ); 4974assert (ggml_nelements (src1 )== 1 ); 4975 4976if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 4977return ; 4978 } 4979 4980const int n_past = ((int32_t * )src1 -> data )[0 ]; 4981 4982// TODO: handle transposed/permuted matrices 4983 4984const int n = ggml_nrows (src0 ); 4985const int nc = src0 -> ne [0 ]; 4986const int nr = src0 -> ne [1 ]; 4987const int nz = n /nr ; 4988 4989assert (dst -> nb [0 ]== sizeof (float )); 4990assert (src0 -> nb [0 ]== sizeof (float )); 4991 4992for (int k = 0 ;k < nz ;k ++ ) { 4993for (int j = 0 ;j < nr ;j ++ ) { 4994for (int i = n_past ;i < nc ;i ++ ) { 4995if (i > n_past + j ) { 4996* (float * )((char * )dst -> data + k * dst -> nb [2 ]+ j * dst -> nb [1 ]+ i * dst -> nb [0 ])= - INFINITY ; 4997 } 4998 } 4999 } 5000 } 5001} 5002 5003static void ggml_compute_forward_diag_mask_inf ( 5004const struct ggml_compute_params * params , 5005const struct ggml_tensor * src0 , 5006const struct ggml_tensor * src1 , 5007struct ggml_tensor * dst ) { 5008switch (src0 -> type ) { 5009case GGML_TYPE_F32 : 5010 { 5011ggml_compute_forward_diag_mask_inf_f32 (params ,src0 ,src1 ,dst ); 5012 }break ; 5013case GGML_TYPE_I8 : 5014case GGML_TYPE_I16 : 5015case GGML_TYPE_I32 : 5016case GGML_TYPE_F16 : 5017case GGML_TYPE_COUNT : 5018 { 5019assert (false); 5020 }break ; 5021 } 5022} 5023 5024// ggml_compute_forward_soft_max 5025 5026static void ggml_compute_forward_soft_max_f32 ( 5027const struct ggml_compute_params * params , 5028const struct ggml_tensor * src0 , 5029struct ggml_tensor * dst ) { 5030GGML_ASSERT (ggml_is_contiguous (src0 )); 5031GGML_ASSERT (ggml_is_contiguous (dst )); 5032GGML_ASSERT (ggml_are_same_shape (src0 ,dst )); 5033 5034if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 5035return ; 5036 } 5037 5038// TODO: handle transposed/permuted matrices 5039 5040const int ith = params -> ith ; 5041const int nth = params -> nth ; 5042 5043const int nc = src0 -> ne [0 ]; 5044const int nr = ggml_nrows (src0 ); 5045 5046// rows per thread 5047const int dr = (nr + nth - 1 )/nth ; 5048 5049// row range for this thread 5050const int ir0 = dr * ith ; 5051const int ir1 = MIN (ir0 + dr ,nr ); 5052 5053for (int i1 = ir0 ;i1 < ir1 ;i1 ++ ) { 5054float * p = (float * )((char * )dst -> data + i1 * dst -> nb [1 ]); 5055 5056#ifndef NDEBUG 5057for (int i = 0 ;i < nc ;++ i ) { 5058assert (!isnan (p [i ])); 5059 } 5060#endif 5061 5062float max = - INFINITY ; 5063for (int i = 0 ;i < nc ;i ++ ) { 5064max = MAX (max ,p [i ]); 5065 } 5066 5067ggml_float sum = 0.0 ; 5068 5069uint16_t ss ; 5070for (int i = 0 ;i < nc ;i ++ ) { 5071if (p [i ]== - INFINITY ) { 5072p [i ]= 0.0 ; 5073 }else { 5074//const float val = (p[i] == -INFINITY) ? 0.0 : exp(p[i] - max); 5075ggml_fp16_t s = GGML_FP32_TO_FP16 (p [i ]- max ); 5076memcpy (& ss ,& s ,sizeof (ss )); 5077const float val = GGML_FP16_TO_FP32 (table_exp_f16 [ss ]); 5078sum += val ; 5079p [i ]= val ; 5080 } 5081 } 5082 5083assert (sum > 0.0f ); 5084 5085sum = 1.0 /sum ; 5086ggml_vec_scale_f32 (nc ,p ,sum ); 5087 5088#ifndef NDEBUG 5089for (int i = 0 ;i < nc ;++ i ) { 5090assert (!isnan (p [i ])); 5091assert (!isinf (p [i ])); 5092 } 5093#endif 5094 } 5095} 5096 5097static void ggml_compute_forward_soft_max ( 5098const struct ggml_compute_params * params , 5099const struct ggml_tensor * src0 , 5100struct ggml_tensor * dst ) { 5101switch (src0 -> type ) { 5102case GGML_TYPE_F32 : 5103 { 5104ggml_compute_forward_soft_max_f32 (params ,src0 ,dst ); 5105 }break ; 5106case GGML_TYPE_I8 : 5107case GGML_TYPE_I16 : 5108case GGML_TYPE_I32 : 5109case GGML_TYPE_F16 : 5110case GGML_TYPE_COUNT : 5111 { 5112assert (false); 5113 }break ; 5114 } 5115} 5116 5117// ggml_compute_forward_rope 5118 5119static void ggml_compute_forward_rope_f32 ( 5120const struct ggml_compute_params * params , 5121const struct ggml_tensor * src0 , 5122const struct ggml_tensor * src1 , 5123struct ggml_tensor * dst ) { 5124assert (params -> ith == 0 ); 5125assert (src1 -> type == GGML_TYPE_I32 ); 5126assert (ggml_nelements (src1 )== 3 ); 5127 5128if (params -> type == GGML_TASK_INIT || params -> type == GGML_TASK_FINALIZE ) { 5129return ; 5130 } 5131 5132const int n_past = ((int32_t * )src1 -> data )[0 ]; 5133const int n_dims = ((int32_t * )src1 -> data )[1 ]; 5134const int mode = ((int32_t * )src1 -> data )[2 ]; 5135 5136//const int ne0 = src0->ne[0]; 5137const int ne1 = src0 -> ne [1 ]; 5138const int ne2 = src0 -> ne [2 ]; 5139const int ne3 = src0 -> ne [3 ]; 5140 5141const int nb0 = src0 -> nb [0 ]; 5142const int nb1 = src0 -> nb [1 ]; 5143const int nb2 = src0 -> nb [2 ]; 5144const int nb3 = src0 -> nb [3 ]; 5145 5146//printf("ne0: %d, ne1: %d, ne2: %d, ne3: %d\n", ne0, ne1, ne2, ne3); 5147//printf("n_past = %d, ne2 = %d\n", n_past, ne2); 5148 5149assert (nb0 == sizeof (float )); 5150 5151// TODO: optimize 5152for (int i3 = 0 ;i3 < ne3 ;i3 ++ ) { 5153for (int i2 = (mode == 0 ?0 :n_past );i2 < ne2 ;i2 ++ ) { 5154const int p = (mode == 0 ?n_past + i2 :i2 ); 5155for (int i1 = 0 ;i1 < ne1 ;i1 ++ ) { 5156for (int i0 = 0 ;i0 < n_dims ;i0 += 2 ) { 5157const double theta = pow (10000.0 , ((double )- i0 )/n_dims ); 5158 5159const double cos_theta = cos (p * theta ); 5160const double sin_theta = sin (p * theta ); 5161 5162const float * const src = (float * )((char * )src0 -> data + i3 * nb3 + i2 * nb2 + i1 * nb1 + i0 * nb0 ); 5163float * dst_data = (float * )((char * )dst -> data + i3 * nb3 + i2 * nb2 + i1 * nb1 + i0 * nb0 ); 5164 5165double x0 = src [0 ]; 5166double x1 = src [1 ]; 5167 5168dst_data [0 ]= x0 * cos_theta - x1 * sin_theta ; 5169dst_data [1 ]= x0 * sin_theta + x1 * cos_theta ; 5170 } 5171 } 5172 } 5173 } 5174} 5175 5176static void ggml_compute_forward_rope ( 5177const struct ggml_compute_params * params , 5178const struct ggml_tensor * src0 , 5179const struct ggml_tensor * src1 , 5180struct ggml_tensor * dst ) { 5181switch (src0 -> type ) { 5182case GGML_TYPE_F32 : 5183 { 5184ggml_compute_forward_rope_f32 (params ,src0 ,src1 ,dst ); 5185 }break ; 5186case GGML_TYPE_I8 : 5187case GGML_TYPE_I16 : 5188case GGML_TYPE_I32 : 5189case GGML_TYPE_F16 : 5190case GGML_TYPE_COUNT : 5191 { 5192assert (false); 5193 }break ; 5194 } 5195} 5196 5197// ggml_compute_forward_conv_1d_1s 5198 5199static void ggml_compute_forward_conv_1d_1s_f16_f32 ( 5200const struct ggml_compute_params * params , 5201const struct ggml_tensor * src0 , 5202const struct ggml_tensor * src1 , 5203struct ggml_tensor * dst ) { 5204GGML_ASSERT (src0 -> type == GGML_TYPE_F16 ); 5205GGML_ASSERT (src1 -> type == GGML_TYPE_F32 ); 5206GGML_ASSERT (dst -> type == GGML_TYPE_F32 ); 5207 5208int64_t t0 = ggml_perf_time_us (); 5209UNUSED (t0 ); 5210 5211const int ne00 = src0 -> ne [0 ]; 5212const int ne01 = src0 -> ne [1 ]; 5213const int ne02 = src0 -> ne [2 ]; 5214//const int ne03 = src0->ne[3]; 5215 5216const int ne10 = src1 -> ne [0 ]; 5217const int ne11 = src1 -> ne [1 ]; 5218//const int ne12 = src1->ne[2]; 5219//const int ne13 = src1->ne[3]; 5220 5221//const int ne0 = dst->ne[0]; 5222//const int ne1 = dst->ne[1]; 5223//const int ne2 = dst->ne[2]; 5224//const int ne3 = dst->ne[3]; 5225//const int ne = ne0*ne1*ne2*ne3; 5226 5227const int nb00 = src0 -> nb [0 ]; 5228const int nb01 = src0 -> nb [1 ]; 5229const int nb02 = src0 -> nb [2 ]; 5230//const int nb03 = src0->nb[3]; 5231 5232const int nb10 = src1 -> nb [0 ]; 5233const int nb11 = src1 -> nb [1 ]; 5234//const int nb12 = src1->nb[2]; 5235//const int nb13 = src1->nb[3]; 5236 5237//const int nb0 = dst->nb[0]; 5238const int nb1 = dst -> nb [1 ]; 5239//const int nb2 = dst->nb[2]; 5240//const int nb3 = dst->nb[3]; 5241 5242const int ith = params -> ith ; 5243const int nth = params -> nth ; 5244 5245const int nk = ne00 ; 5246const int nh = nk /2 ; 5247 5248const int ew0 = ggml_up32 (ne01 ); 5249 5250GGML_ASSERT (ne00 %2 == 1 );// TODO: support even kernel sizes 5251GGML_ASSERT (nb00 == sizeof (ggml_fp16_t )); 5252GGML_ASSERT (nb10 == sizeof (float )); 5253 5254if (params -> type == GGML_TASK_INIT ) { 5255// TODO: fix this memset (wsize is overestimated) 5256memset (params -> wdata ,0 ,params -> wsize ); 5257 5258// prepare kernel data (src0) 5259 { 5260ggml_fp16_t * const wdata = (ggml_fp16_t * )params -> wdata + 0 ; 5261 5262for (int i02 = 0 ;i02 < ne02 ;i02 ++ ) { 5263for (int i01 = 0 ;i01 < ne01 ;i01 ++ ) { 5264const ggml_fp16_t * const src = (ggml_fp16_t * )((char * )src0 -> data + i02 * nb02 + i01 * nb01 ); 5265ggml_fp16_t * dst_data = wdata + i02 * ew0 * ne00 ; 5266for (int i00 = 0 ;i00 < ne00 ;i00 ++ ) { 5267dst_data [i00 * ew0 + i01 ]= src [i00 ]; 5268 } 5269 } 5270 } 5271 } 5272 5273// prepare source data (src1) 5274 { 5275ggml_fp16_t * const wdata = (ggml_fp16_t * )params -> wdata + ne02 * ew0 * ne00 ; 5276 5277for (int i11 = 0 ;i11 < ne11 ;i11 ++ ) { 5278const float * const src = (float * )((char * )src1 -> data + i11 * nb11 ); 5279ggml_fp16_t * dst_data = wdata ; 5280for (int i10 = 0 ;i10 < ne10 ;i10 ++ ) { 5281dst_data [(i10 + nh )* ew0 + i11 ]= GGML_FP32_TO_FP16 (src [i10 ]); 5282 } 5283 } 5284 } 5285 5286return ; 5287 } 5288 5289if (params -> type == GGML_TASK_FINALIZE ) { 5290return ; 5291 } 5292 5293// total rows in dst 5294const int nr = ne02 ; 5295 5296// rows per thread 5297const int dr = (nr + nth - 1 )/nth ; 5298 5299// row range for this thread 5300const int ir0 = dr * ith ; 5301const int ir1 = MIN (ir0 + dr ,nr ); 5302 5303for (int i1 = ir0 ;i1 < ir1 ;i1 ++ ) { 5304float * dst_data = (float * )((char * )dst -> data + i1 * nb1 ); 5305for (int i0 = 0 ;i0 < ne10 ;++ i0 ) { 5306dst_data [i0 ]= 0 ; 5307for (int k = - nh ;k <=nh ;k ++ ) { 5308float v = 0.0f ; 5309ggml_vec_dot_f16 (ew0 ,& v , 5310 (ggml_fp16_t * )params -> wdata + i1 * ew0 * ne00 + (nh + k )* ew0 , 5311 (ggml_fp16_t * )params -> wdata + ne02 * ew0 * ne00 + (i0 + nh + k )* ew0 ); 5312 5313dst_data [i0 ]+= v ; 5314 } 5315 } 5316 } 5317} 5318 5319static void ggml_compute_forward_conv_1d_1s_f32 ( 5320const struct ggml_compute_params * params , 5321const struct ggml_tensor * src0 , 5322const struct ggml_tensor * src1 , 5323struct ggml_tensor * dst ) { 5324GGML_ASSERT (src0 -> type == GGML_TYPE_F32 ); 5325GGML_ASSERT (src1 -> type == GGML_TYPE_F32 ); 5326GGML_ASSERT (dst -> type == GGML_TYPE_F32 ); 5327 5328int64_t t0 = ggml_perf_time_us (); 5329UNUSED (t0 ); 5330 5331const int ne00 = src0 -> ne [0 ]; 5332const int ne01 = src0 -> ne [1 ]; 5333const int ne02 = src0 -> ne [2 ]; 5334//const int ne03 = src0->ne[3]; 5335 5336const int ne10 = src1 -> ne [0 ]; 5337const int ne11 = src1 -> ne [1 ]; 5338//const int ne12 = src1->ne[2]; 5339//const int ne13 = src1->ne[3]; 5340 5341//const int ne0 = dst->ne[0]; 5342//const int ne1 = dst->ne[1]; 5343//const int ne2 = dst->ne[2]; 5344//const int ne3 = dst->ne[3]; 5345//const int ne = ne0*ne1*ne2*ne3; 5346 5347const int nb00 = src0 -> nb [0 ]; 5348const int nb01 = src0 -> nb [1 ]; 5349const int nb02 = src0 -> nb [2 ]; 5350//const int nb03 = src0->nb[3]; 5351 5352const int nb10 = src1 -> nb [0 ]; 5353const int nb11 = src1 -> nb [1 ]; 5354//const int nb12 = src1->nb[2]; 5355//const int nb13 = src1->nb[3]; 5356 5357//const int nb0 = dst->nb[0]; 5358const int nb1 = dst -> nb [1 ]; 5359//const int nb2 = dst->nb[2]; 5360//const int nb3 = dst->nb[3]; 5361 5362const int ith = params -> ith ; 5363const int nth = params -> nth ; 5364 5365const int nk = ne00 ; 5366const int nh = nk /2 ; 5367 5368const int ew0 = ggml_up32 (ne01 ); 5369 5370GGML_ASSERT (ne00 %2 == 1 );// TODO: support even kernel sizes 5371GGML_ASSERT (nb00 == sizeof (float )); 5372GGML_ASSERT (nb10 == sizeof (float )); 5373 5374if (params -> type == GGML_TASK_INIT ) { 5375// TODO: fix this memset (wsize is overestimated) 5376memset (params -> wdata ,0 ,params -> wsize ); 5377 5378// prepare kernel data (src0) 5379 { 5380float * const wdata = (float * )params -> wdata + 0 ; 5381 5382for (int i02 = 0 ;i02 < ne02 ;i02 ++ ) { 5383for (int i01 = 0 ;i01 < ne01 ;i01 ++ ) { 5384const float * const src = (float * )((char * )src0 -> data + i02 * nb02 + i01 * nb01 ); 5385float * dst_data = wdata + i02 * ew0 * ne00 ; 5386for (int i00 = 0 ;i00 < ne00 ;i00 ++ ) { 5387dst_data [i00 * ew0 + i01 ]= src [i00 ]; 5388 } 5389 } 5390 } 5391 } 5392 5393// prepare source data (src1) 5394 { 5395float * const wdata = (float * )params -> wdata + ne02 * ew0 * ne00 ; 5396 5397for (int i11 = 0 ;i11 < ne11 ;i11 ++ ) { 5398const float * const src = (float * )((char * )src1 -> data + i11 * nb11 ); 5399float * dst_data = wdata ; 5400for (int i10 = 0 ;i10 < ne10 ;i10 ++ ) { 5401dst_data [(i10 + nh )* ew0 + i11 ]= src [i10 ]; 5402 } 5403 } 5404 } 5405 5406return ; 5407 } 5408 5409if (params -> type == GGML_TASK_FINALIZE ) { 5410return ; 5411 } 5412 5413// total rows in dst 5414const int nr = ne02 ; 5415 5416// rows per thread 5417const int dr = (nr + nth - 1 )/nth ; 5418 5419// row range for this thread 5420const int ir0 = dr * ith ; 5421const int ir1 = MIN (ir0 + dr ,nr ); 5422 5423for (int i1 = ir0 ;i1 < ir1 ;i1 ++ ) { 5424float * dst_data = (float * )((char * )dst -> data + i1 * nb1 ); 5425for (int i0 = 0 ;i0 < ne10 ;++ i0 ) { 5426dst_data [i0 ]= 0 ; 5427for (int k = - nh ;k <=nh ;k ++ ) { 5428float v = 0.0f ; 5429ggml_vec_dot_f32 (ew0 ,& v , 5430 (float * )params -> wdata + i1 * ew0 * ne00 + (nh + k )* ew0 , 5431 (float * )params -> wdata + ne02 * ew0 * ne00 + (i0 + nh + k )* ew0 ); 5432 5433dst_data [i0 ]+= v ; 5434 } 5435 } 5436 } 5437} 5438 5439static void ggml_compute_forward_conv_1d_1s ( 5440const struct ggml_compute_params * params , 5441const struct ggml_tensor * src0 , 5442const struct ggml_tensor * src1 , 5443struct ggml_tensor * dst ) { 5444switch (src0 -> type ) { 5445case GGML_TYPE_F16 : 5446 { 5447ggml_compute_forward_conv_1d_1s_f16_f32 (params ,src0 ,src1 ,dst ); 5448 }break ; 5449case GGML_TYPE_F32 : 5450 { 5451ggml_compute_forward_conv_1d_1s_f32 (params ,src0 ,src1 ,dst ); 5452 }break ; 5453case GGML_TYPE_I8 : 5454case GGML_TYPE_I16 : 5455case GGML_TYPE_I32 : 5456case GGML_TYPE_COUNT : 5457 { 5458GGML_ASSERT (false); 5459 }break ; 5460 } 5461} 5462 5463// ggml_compute_forward_conv_1d_2s 5464 5465static void ggml_compute_forward_conv_1d_2s_f16_f32 ( 5466const struct ggml_compute_params * params , 5467const struct ggml_tensor * src0 , 5468const struct ggml_tensor * src1 , 5469struct ggml_tensor * dst ) { 5470GGML_ASSERT (src0 -> type == GGML_TYPE_F16 ); 5471GGML_ASSERT (src1 -> type == GGML_TYPE_F32 ); 5472GGML_ASSERT (dst -> type == GGML_TYPE_F32 ); 5473 5474int64_t t0 = ggml_perf_time_us (); 5475UNUSED (t0 ); 5476 5477const int ne00 = src0 -> ne [0 ]; 5478const int ne01 = src0 -> ne [1 ]; 5479const int ne02 = src0 -> ne [2 ]; 5480//const int ne03 = src0->ne[3]; 5481 5482const int ne10 = src1 -> ne [0 ]; 5483const int ne11 = src1 -> ne [1 ]; 5484//const int ne12 = src1->ne[2]; 5485//const int ne13 = src1->ne[3]; 5486 5487//const int ne0 = dst->ne[0]; 5488//const int ne1 = dst->ne[1]; 5489//const int ne2 = dst->ne[2]; 5490//const int ne3 = dst->ne[3]; 5491//const int ne = ne0*ne1*ne2*ne3; 5492 5493const int nb00 = src0 -> nb [0 ]; 5494const int nb01 = src0 -> nb [1 ]; 5495const int nb02 = src0 -> nb [2 ]; 5496//const int nb03 = src0->nb[3]; 5497 5498const int nb10 = src1 -> nb [0 ]; 5499const int nb11 = src1 -> nb [1 ]; 5500//const int nb12 = src1->nb[2]; 5501//const int nb13 = src1->nb[3]; 5502 5503//const int nb0 = dst->nb[0]; 5504const int nb1 = dst -> nb [1 ]; 5505//const int nb2 = dst->nb[2]; 5506//const int nb3 = dst->nb[3]; 5507 5508const int ith = params -> ith ; 5509const int nth = params -> nth ; 5510 5511const int nk = ne00 ; 5512const int nh = nk /2 ; 5513 5514const int ew0 = ggml_up32 (ne01 ); 5515 5516GGML_ASSERT (ne00 %2 == 1 );// TODO: support even kernel sizes 5517GGML_ASSERT (nb00 == sizeof (ggml_fp16_t )); 5518GGML_ASSERT (nb10 == sizeof (float )); 5519 5520if (params -> type == GGML_TASK_INIT ) { 5521// TODO: fix this memset (wsize is overestimated) 5522memset (params -> wdata ,0 ,params -> wsize ); 5523 5524// prepare kernel data (src0) 5525 { 5526ggml_fp16_t * const wdata = (ggml_fp16_t * )params -> wdata + 0 ; 5527 5528for (int i02 = 0 ;i02 < ne02 ;i02 ++ ) { 5529for (int i01 = 0 ;i01 < ne01 ;i01 ++ ) { 5530const ggml_fp16_t * const src = (ggml_fp16_t * )((char * )src0 -> data + i02 * nb02 + i01 * nb01 ); 5531ggml_fp16_t * dst_data = wdata + i02 * ew0 * ne00 ; 5532for (int i00 = 0 ;i00 < ne00 ;i00 ++ ) { 5533dst_data [i00 * ew0 + i01 ]= src [i00 ]; 5534 } 5535 } 5536 } 5537 } 5538 5539// prepare source data (src1) 5540 { 5541ggml_fp16_t * const wdata = (ggml_fp16_t * )params -> wdata + ne02 * ew0 * ne00 ; 5542 5543for (int i11 = 0 ;i11 < ne11 ;i11 ++ ) { 5544const float * const src = (float * )((char * )src1 -> data + i11 * nb11 ); 5545ggml_fp16_t * dst_data = wdata ; 5546for (int i10 = 0 ;i10 < ne10 ;i10 ++ ) { 5547dst_data [(i10 + nh )* ew0 + i11 ]= GGML_FP32_TO_FP16 (src [i10 ]); 5548 } 5549 } 5550 } 5551 5552return ; 5553 } 5554 5555if (params -> type == GGML_TASK_FINALIZE ) { 5556return ; 5557 } 5558 5559// total rows in dst 5560const int nr = ne02 ; 5561 5562// rows per thread 5563const int dr = (nr + nth - 1 )/nth ; 5564 5565// row range for this thread 5566const int ir0 = dr * ith ; 5567const int ir1 = MIN (ir0 + dr ,nr ); 5568 5569for (int i1 = ir0 ;i1 < ir1 ;i1 ++ ) { 5570float * dst_data = (float * )((char * )dst -> data + i1 * nb1 ); 5571for (int i0 = 0 ;i0 < ne10 ;i0 += 2 ) { 5572dst_data [i0 /2 ]= 0 ; 5573for (int k = - nh ;k <=nh ;k ++ ) { 5574float v = 0.0f ; 5575ggml_vec_dot_f16 (ew0 ,& v , 5576 (ggml_fp16_t * )params -> wdata + i1 * ew0 * ne00 + (nh + k )* ew0 , 5577 (ggml_fp16_t * )params -> wdata + ne02 * ew0 * ne00 + (i0 + nh + k )* ew0 ); 5578 5579dst_data [i0 /2 ]+= v ; 5580 } 5581 } 5582 } 5583} 5584 5585static void ggml_compute_forward_conv_1d_2s_f32 ( 5586const struct ggml_compute_params * params , 5587const struct ggml_tensor * src0 , 5588const struct ggml_tensor * src1 , 5589struct ggml_tensor * dst ) { 5590GGML_ASSERT (src0 -> type == GGML_TYPE_F32 ); 5591GGML_ASSERT (src1 -> type == GGML_TYPE_F32 ); 5592GGML_ASSERT (dst -> type == GGML_TYPE_F32 ); 5593 5594int64_t t0 = ggml_perf_time_us (); 5595UNUSED (t0 ); 5596 5597const int ne00 = src0 -> ne [0 ]; 5598const int ne01 = src0 -> ne [1 ]; 5599const int ne02 = src0 -> ne [2 ]; 5600//const int ne03 = src0->ne[3]; 5601 5602const int ne10 = src1 -> ne [0 ]; 5603const int ne11 = src1 -> ne [1 ]; 5604//const int ne12 = src1->ne[2]; 5605//const int ne13 = src1->ne[3]; 5606 5607//const int ne0 = dst->ne[0]; 5608//const int ne1 = dst->ne[1]; 5609//const int ne2 = dst->ne[2]; 5610//const int ne3 = dst->ne[3]; 5611//const int ne = ne0*ne1*ne2*ne3; 5612 5613const int nb00 = src0 -> nb [0 ]; 5614const int nb01 = src0 -> nb [1 ]; 5615const int nb02 = src0 -> nb [2 ]; 5616//const int nb03 = src0->nb[3]; 5617 5618const int nb10 = src1 -> nb [0 ]; 5619const int nb11 = src1 -> nb [1 ]; 5620//const int nb12 = src1->nb[2]; 5621//const int nb13 = src1->nb[3]; 5622 5623//const int nb0 = dst->nb[0]; 5624const int nb1 = dst -> nb [1 ]; 5625//const int nb2 = dst->nb[2]; 5626//const int nb3 = dst->nb[3]; 5627 5628const int ith = params -> ith ; 5629const int nth = params -> nth ; 5630 5631const int nk = ne00 ; 5632const int nh = nk /2 ; 5633 5634const int ew0 = ggml_up32 (ne01 ); 5635 5636GGML_ASSERT (ne00 %2 == 1 );// TODO: support even kernel sizes 5637GGML_ASSERT (nb00 == sizeof (float )); 5638GGML_ASSERT (nb10 == sizeof (float )); 5639 5640if (params -> type == GGML_TASK_INIT ) { 5641// TODO: fix this memset (wsize is overestimated) 5642memset (params -> wdata ,0 ,params -> wsize ); 5643 5644// prepare kernel data (src0) 5645 { 5646float * const wdata = (float * )params -> wdata + 0 ; 5647 5648for (int i02 = 0 ;i02 < ne02 ;i02 ++ ) { 5649for (int i01 = 0 ;i01 < ne01 ;i01 ++ ) { 5650const float * const src = (float * )((char * )src0 -> data + i02 * nb02 + i01 * nb01 ); 5651float * dst_data = wdata + i02 * ew0 * ne00 ; 5652for (int i00 = 0 ;i00 < ne00 ;i00 ++ ) { 5653dst_data [i00 * ew0 + i01 ]= src [i00 ]; 5654 } 5655 } 5656 } 5657 } 5658 5659// prepare source data (src1) 5660 { 5661float * const wdata = (float * )params -> wdata + ne02 * ew0 * ne00 ; 5662 5663for (int i11 = 0 ;i11 < ne11 ;i11 ++ ) { 5664const float * const src = (float * )((char * )src1 -> data + i11 * nb11 ); 5665float * dst_data = wdata ; 5666for (int i10 = 0 ;i10 < ne10 ;i10 ++ ) { 5667dst_data [(i10 + nh )* ew0 + i11 ]= src [i10 ]; 5668 } 5669 } 5670 } 5671 5672return ; 5673 } 5674 5675if (params -> type == GGML_TASK_FINALIZE ) { 5676return ; 5677 } 5678 5679// total rows in dst 5680const int nr = ne02 ; 5681 5682// rows per thread 5683const int dr = (nr + nth - 1 )/nth ; 5684 5685// row range for this thread 5686const int ir0 = dr * ith ; 5687const int ir1 = MIN (ir0 + dr ,nr ); 5688 5689for (int i1 = ir0 ;i1 < ir1 ;i1 ++ ) { 5690float * dst_data = (float * )((char * )dst -> data + i1 * nb1 ); 5691for (int i0 = 0 ;i0 < ne10 ;i0 += 2 ) { 5692dst_data [i0 /2 ]= 0 ; 5693for (int k = - nh ;k <=nh ;k ++ ) { 5694float v = 0.0f ; 5695ggml_vec_dot_f32 (ew0 ,& v , 5696 (float * )params -> wdata + i1 * ew0 * ne00 + (nh + k )* ew0 , 5697 (float * )params -> wdata + ne02 * ew0 * ne00 + (i0 + nh + k )* ew0 ); 5698 5699dst_data [i0 /2 ]+= v ; 5700 } 5701 } 5702 } 5703} 5704 5705static void ggml_compute_forward_conv_1d_2s ( 5706const struct ggml_compute_params * params , 5707const struct ggml_tensor * src0 , 5708const struct ggml_tensor * src1 , 5709struct ggml_tensor * dst ) { 5710switch (src0 -> type ) { 5711case GGML_TYPE_F16 : 5712 { 5713ggml_compute_forward_conv_1d_2s_f16_f32 (params ,src0 ,src1 ,dst ); 5714 }break ; 5715case GGML_TYPE_F32 : 5716 { 5717ggml_compute_forward_conv_1d_2s_f32 (params ,src0 ,src1 ,dst ); 5718 }break ; 5719case GGML_TYPE_I8 : 5720case GGML_TYPE_I16 : 5721case GGML_TYPE_I32 : 5722case GGML_TYPE_COUNT : 5723 { 5724GGML_ASSERT (false); 5725 }break ; 5726 } 5727} 5728 5729// ggml_compute_forward_flash_attn 5730 5731static void ggml_compute_forward_flash_attn_f32 ( 5732const struct ggml_compute_params * params , 5733const struct ggml_tensor * q , 5734const struct ggml_tensor * k , 5735const struct ggml_tensor * v , 5736const bool masked , 5737struct ggml_tensor * dst ) { 5738int64_t t0 = ggml_perf_time_us (); 5739UNUSED (t0 ); 5740 5741const int neq0 = q -> ne [0 ]; 5742const int neq1 = q -> ne [1 ]; 5743const int neq2 = q -> ne [2 ]; 5744const int neq3 = q -> ne [3 ]; 5745 5746const int nek0 = k -> ne [0 ]; 5747const int nek1 = k -> ne [1 ]; 5748//const int nek2 = k->ne[2]; 5749//const int nek3 = k->ne[3]; 5750 5751//const int nev0 = v->ne[0]; 5752const int nev1 = v -> ne [1 ]; 5753//const int nev2 = v->ne[2]; 5754//const int nev3 = v->ne[3]; 5755 5756const int ne0 = dst -> ne [0 ]; 5757const int ne1 = dst -> ne [1 ]; 5758//const int ne2 = dst->ne[2]; 5759//const int ne3 = dst->ne[3]; 5760 5761const int nbk0 = k -> nb [0 ]; 5762const int nbk1 = k -> nb [1 ]; 5763const int nbk2 = k -> nb [2 ]; 5764const int nbk3 = k -> nb [3 ]; 5765 5766const int nbq0 = q -> nb [0 ]; 5767const int nbq1 = q -> nb [1 ]; 5768const int nbq2 = q -> nb [2 ]; 5769const int nbq3 = q -> nb [3 ]; 5770 5771const int nbv0 = v -> nb [0 ]; 5772const int nbv1 = v -> nb [1 ]; 5773const int nbv2 = v -> nb [2 ]; 5774const int nbv3 = v -> nb [3 ]; 5775 5776const int nb0 = dst -> nb [0 ]; 5777const int nb1 = dst -> nb [1 ]; 5778const int nb2 = dst -> nb [2 ]; 5779const int nb3 = dst -> nb [3 ]; 5780 5781const int ith = params -> ith ; 5782const int nth = params -> nth ; 5783 5784const int D = neq0 ; 5785const int N = neq1 ; 5786const int P = nek1 - N ; 5787const int M = P + N ; 5788 5789GGML_ASSERT (ne0 == D ); 5790GGML_ASSERT (ne1 == N ); 5791GGML_ASSERT (P >=0 ); 5792 5793GGML_ASSERT (nbq0 == sizeof (float )); 5794GGML_ASSERT (nbk0 == sizeof (float )); 5795GGML_ASSERT (nbv0 == sizeof (float )); 5796 5797GGML_ASSERT (neq0 == D ); 5798GGML_ASSERT (nek0 == D ); 5799GGML_ASSERT (nev1 == D ); 5800 5801GGML_ASSERT (neq1 == N ); 5802GGML_ASSERT (nek1 == N + P ); 5803GGML_ASSERT (nev1 == D ); 5804 5805// dst cannot be transposed or permuted 5806GGML_ASSERT (nb0 == sizeof (float )); 5807GGML_ASSERT (nb0 <=nb1 ); 5808GGML_ASSERT (nb1 <=nb2 ); 5809GGML_ASSERT (nb2 <=nb3 ); 5810 5811if (params -> type == GGML_TASK_INIT ) { 5812return ; 5813 } 5814 5815if (params -> type == GGML_TASK_FINALIZE ) { 5816return ; 5817 } 5818 5819// parallelize by q rows using ggml_vec_dot_f32 5820 5821// total rows in q 5822const int nr = neq1 * neq2 * neq3 ; 5823 5824// rows per thread 5825const int dr = (nr + nth - 1 )/nth ; 5826 5827// row range for this thread 5828const int ir0 = dr * ith ; 5829const int ir1 = MIN (ir0 + dr ,nr ); 5830 5831const float scale = 1.0 /sqrt ((double )D ); 5832 5833//printf("P=%d N=%d D=%d ir0=%d ir1=%d scale = %f\n", P, N, D, ir0, ir1, scale); 5834 5835for (int ir = ir0 ;ir < ir1 ;++ ir ) { 5836// q indices 5837const int iq3 = ir /(neq2 * neq1 ); 5838const int iq2 = (ir - iq3 * neq2 * neq1 )/neq1 ; 5839const int iq1 = (ir - iq3 * neq2 * neq1 - iq2 * neq1 ); 5840 5841float * S = (float * )params -> wdata + ith * (M + CACHE_LINE_SIZE_F32 ); 5842 5843for (int ic = 0 ;ic < nek1 ;++ ic ) { 5844// k indices 5845const int ik3 = iq3 ; 5846const int ik2 = iq2 ; 5847const int ik1 = ic ; 5848 5849// S indices 5850const int i1 = ik1 ; 5851 5852ggml_vec_dot_f32 (neq0 , 5853S + i1 , 5854 (float * ) ((char * )k -> data + (ik1 * nbk1 + ik2 * nbk2 + ik3 * nbk3 )), 5855 (float * ) ((char * )q -> data + (iq1 * nbq1 + iq2 * nbq2 + iq3 * nbq3 ))); 5856 } 5857 5858// scale 5859ggml_vec_scale_f32 (nek1 ,S ,scale ); 5860 5861if (masked ) { 5862for (int i = P ;i < M ;i ++ ) { 5863if (i > P + iq1 ) { 5864S [i ]= - INFINITY ; 5865 } 5866 } 5867 } 5868 5869// softmax 5870 { 5871float max = - INFINITY ; 5872for (int i = 0 ;i < M ;i ++ ) { 5873max = MAX (max ,S [i ]); 5874 } 5875 5876ggml_float sum = 0.0 ; 5877 5878uint16_t ss ; 5879for (int i = 0 ;i < M ;i ++ ) { 5880if (S [i ]== - INFINITY ) { 5881S [i ]= 0.0 ; 5882 }else { 5883//const float val = (S[i] == -INFINITY) ? 0.0 : exp(S[i] - max); 5884ggml_fp16_t s = GGML_FP32_TO_FP16 (S [i ]- max ); 5885memcpy (& ss ,& s ,sizeof (ss )); 5886const float val = GGML_FP16_TO_FP32 (table_exp_f16 [ss ]); 5887sum += val ; 5888S [i ]= val ; 5889 } 5890 } 5891 5892assert (sum > 0.0f ); 5893 5894sum = 1.0 /sum ; 5895ggml_vec_scale_f32 (M ,S ,sum ); 5896 } 5897 5898for (int ic = 0 ;ic < nev1 ;++ ic ) { 5899// dst indices 5900const int i1 = iq1 ; 5901const int i2 = iq2 ; 5902const int i3 = iq3 ; 5903 5904ggml_vec_dot_f32 (nek1 , 5905 (float * ) ((char * )dst -> data + (ic * nb0 + i1 * nb1 + i2 * nb2 + i3 * nb3 )), 5906 (float * ) ((char * )v -> data + (ic * nbv1 + i2 * nbv2 + i3 * nbv3 )), 5907S ); 5908 } 5909 } 5910} 5911 5912static void ggml_compute_forward_flash_attn_f16 ( 5913const struct ggml_compute_params * params , 5914const struct ggml_tensor * q , 5915const struct ggml_tensor * k , 5916const struct ggml_tensor * v , 5917const bool masked , 5918struct ggml_tensor * dst ) { 5919int64_t t0 = ggml_perf_time_us (); 5920UNUSED (t0 ); 5921 5922const int neq0 = q -> ne [0 ]; 5923const int neq1 = q -> ne [1 ]; 5924const int neq2 = q -> ne [2 ]; 5925const int neq3 = q -> ne [3 ]; 5926 5927const int nek0 = k -> ne [0 ]; 5928const int nek1 = k -> ne [1 ]; 5929//const int nek2 = k->ne[2]; 5930//const int nek3 = k->ne[3]; 5931 5932//const int nev0 = v->ne[0]; 5933const int nev1 = v -> ne [1 ]; 5934//const int nev2 = v->ne[2]; 5935//const int nev3 = v->ne[3]; 5936 5937const int ne0 = dst -> ne [0 ]; 5938const int ne1 = dst -> ne [1 ]; 5939//const int ne2 = dst->ne[2]; 5940//const int ne3 = dst->ne[3]; 5941 5942const int nbk0 = k -> nb [0 ]; 5943const int nbk1 = k -> nb [1 ]; 5944const int nbk2 = k -> nb [2 ]; 5945const int nbk3 = k -> nb [3 ]; 5946 5947const int nbq0 = q -> nb [0 ]; 5948const int nbq1 = q -> nb [1 ]; 5949const int nbq2 = q -> nb [2 ]; 5950const int nbq3 = q -> nb [3 ]; 5951 5952const int nbv0 = v -> nb [0 ]; 5953const int nbv1 = v -> nb [1 ]; 5954const int nbv2 = v -> nb [2 ]; 5955const int nbv3 = v -> nb [3 ]; 5956 5957const int nb0 = dst -> nb [0 ]; 5958const int nb1 = dst -> nb [1 ]; 5959const int nb2 = dst -> nb [2 ]; 5960const int nb3 = dst -> nb [3 ]; 5961 5962const int ith = params -> ith ; 5963const int nth = params -> nth ; 5964 5965const int D = neq0 ; 5966const int N = neq1 ; 5967const int P = nek1 - N ; 5968const int M = P + N ; 5969 5970GGML_ASSERT (ne0 == D ); 5971GGML_ASSERT (ne1 == N ); 5972GGML_ASSERT (P >=0 ); 5973 5974GGML_ASSERT (nbq0 == sizeof (ggml_fp16_t )); 5975GGML_ASSERT (nbk0 == sizeof (ggml_fp16_t )); 5976GGML_ASSERT (nbv0 == sizeof (ggml_fp16_t )); 5977 5978GGML_ASSERT (neq0 == D ); 5979GGML_ASSERT (nek0 == D ); 5980GGML_ASSERT (nev1 == D ); 5981 5982GGML_ASSERT (neq1 == N ); 5983GGML_ASSERT (nek1 == N + P ); 5984GGML_ASSERT (nev1 == D ); 5985 5986// dst cannot be transposed or permuted 5987GGML_ASSERT (nb0 == sizeof (float )); 5988GGML_ASSERT (nb0 <=nb1 ); 5989GGML_ASSERT (nb1 <=nb2 ); 5990GGML_ASSERT (nb2 <=nb3 ); 5991 5992if (params -> type == GGML_TASK_INIT ) { 5993return ; 5994 } 5995 5996if (params -> type == GGML_TASK_FINALIZE ) { 5997return ; 5998 } 5999 6000// parallelize by q rows using ggml_vec_dot_f32 6001 6002// total rows in q 6003const int nr = neq1 * neq2 * neq3 ; 6004 6005// rows per thread 6006const int dr = (nr + nth - 1 )/nth ; 6007 6008// row range for this thread 6009const int ir0 = dr * ith ; 6010const int ir1 = MIN (ir0 + dr ,nr ); 6011 6012const float scale = 1.0 /sqrt ((double )D ); 6013 6014//printf("P=%d N=%d D=%d ir0=%d ir1=%d scale = %f\n", P, N, D, ir0, ir1, scale); 6015 6016for (int ir = ir0 ;ir < ir1 ;++ ir ) { 6017// q indices 6018const int iq3 = ir /(neq2 * neq1 ); 6019const int iq2 = (ir - iq3 * neq2 * neq1 )/neq1 ; 6020const int iq1 = (ir - iq3 * neq2 * neq1 - iq2 * neq1 ); 6021 6022float * S = (float * )params -> wdata + ith * (2 * M + CACHE_LINE_SIZE_F32 ); 6023 6024for (int ic = 0 ;ic < nek1 ;++ ic ) { 6025// k indices 6026const int ik3 = iq3 ; 6027const int ik2 = iq2 ; 6028const int ik1 = ic ; 6029 6030// S indices 6031const int i1 = ik1 ; 6032 6033ggml_vec_dot_f16 (neq0 , 6034S + i1 , 6035 (ggml_fp16_t * ) ((char * )k -> data + (ik1 * nbk1 + ik2 * nbk2 + ik3 * nbk3 )), 6036 (ggml_fp16_t * ) ((char * )q -> data + (iq1 * nbq1 + iq2 * nbq2 + iq3 * nbq3 ))); 6037 } 6038 6039// scale 6040ggml_vec_scale_f32 (nek1 ,S ,scale ); 6041 6042if (masked ) { 6043for (int i = P ;i < M ;i ++ ) { 6044if (i > P + iq1 ) { 6045S [i ]= - INFINITY ; 6046 } 6047 } 6048 } 6049 6050// softmax 6051 { 6052float max = - INFINITY ; 6053for (int i = 0 ;i < M ;i ++ ) { 6054max = MAX (max ,S [i ]); 6055 } 6056 6057ggml_float sum = 0.0 ; 6058 6059uint16_t ss ; 6060for (int i = 0 ;i < M ;i ++ ) { 6061if (S [i ]== - INFINITY ) { 6062S [i ]= 0.0 ; 6063 }else { 6064//const float val = (S[i] == -INFINITY) ? 0.0 : exp(S[i] - max); 6065ggml_fp16_t s = GGML_FP32_TO_FP16 (S [i ]- max ); 6066memcpy (& ss ,& s ,sizeof (ss )); 6067const float val = GGML_FP16_TO_FP32 (table_exp_f16 [ss ]); 6068sum += val ; 6069S [i ]= val ; 6070 } 6071 } 6072 6073assert (sum > 0.0f ); 6074 6075sum = 1.0 /sum ; 6076ggml_vec_scale_f32 (M ,S ,sum ); 6077 } 6078 6079ggml_fp16_t * S16 = (ggml_fp16_t * ) ((float * )params -> wdata + ith * (2 * M + CACHE_LINE_SIZE_F32 )+ M ); 6080 6081for (int i = 0 ;i < M ;i ++ ) { 6082S16 [i ]= GGML_FP32_TO_FP16 (S [i ]); 6083 } 6084 6085for (int ic = 0 ;ic < nev1 ;++ ic ) { 6086// dst indices 6087const int i1 = iq1 ; 6088const int i2 = iq2 ; 6089const int i3 = iq3 ; 6090 6091ggml_vec_dot_f16 (nek1 , 6092 (float * ) ((char * )dst -> data + (ic * nb0 + i1 * nb1 + i2 * nb2 + i3 * nb3 )), 6093 (ggml_fp16_t * ) ((char * )v -> data + (ic * nbv1 + i2 * nbv2 + i3 * nbv3 )), 6094S16 ); 6095 } 6096 } 6097} 6098 6099static void ggml_compute_forward_flash_attn ( 6100const struct ggml_compute_params * params , 6101const struct ggml_tensor * q , 6102const struct ggml_tensor * k , 6103const struct ggml_tensor * v , 6104const bool masked , 6105struct ggml_tensor * dst ) { 6106switch (q -> type ) { 6107case GGML_TYPE_F16 : 6108 { 6109ggml_compute_forward_flash_attn_f16 (params ,q ,k ,v ,masked ,dst ); 6110 }break ; 6111case GGML_TYPE_F32 : 6112 { 6113ggml_compute_forward_flash_attn_f32 (params ,q ,k ,v ,masked ,dst ); 6114 }break ; 6115case GGML_TYPE_I8 : 6116case GGML_TYPE_I16 : 6117case GGML_TYPE_I32 : 6118case GGML_TYPE_COUNT : 6119 { 6120assert (false); 6121 }break ; 6122 } 6123} 6124 6125// ggml_compute_forward_flash_ff 6126 6127static void ggml_compute_forward_flash_ff_f16 ( 6128const struct ggml_compute_params * params , 6129const struct ggml_tensor * a ,// F16 6130const struct ggml_tensor * b0 ,// F16 fc_w 6131const struct ggml_tensor * b1 ,// F32 fc_b 6132const struct ggml_tensor * c0 ,// F16 proj_w 6133const struct ggml_tensor * c1 ,// F32 proj_b 6134struct ggml_tensor * dst ) { 6135int64_t t0 = ggml_perf_time_us (); 6136UNUSED (t0 ); 6137 6138const int nea0 = a -> ne [0 ]; 6139const int nea1 = a -> ne [1 ]; 6140const int nea2 = a -> ne [2 ]; 6141const int nea3 = a -> ne [3 ]; 6142 6143const int neb00 = b0 -> ne [0 ]; 6144const int neb01 = b0 -> ne [1 ]; 6145//const int neb02 = b0->ne[2]; 6146//const int neb03 = b0->ne[3]; 6147 6148const int neb10 = b1 -> ne [0 ]; 6149const int neb11 = b1 -> ne [1 ]; 6150//const int neb12 = b1->ne[2]; 6151//const int neb13 = b1->ne[3]; 6152 6153const int nec00 = c0 -> ne [0 ]; 6154const int nec01 = c0 -> ne [1 ]; 6155//const int nec02 = c0->ne[2]; 6156//const int nec03 = c0->ne[3]; 6157 6158const int nec10 = c1 -> ne [0 ]; 6159const int nec11 = c1 -> ne [1 ]; 6160//const int nec12 = c1->ne[2]; 6161//const int nec13 = c1->ne[3]; 6162 6163const int ne0 = dst -> ne [0 ]; 6164const int ne1 = dst -> ne [1 ]; 6165const int ne2 = dst -> ne [2 ]; 6166//const int ne3 = dst->ne[3]; 6167 6168const int nba0 = a -> nb [0 ]; 6169const int nba1 = a -> nb [1 ]; 6170const int nba2 = a -> nb [2 ]; 6171const int nba3 = a -> nb [3 ]; 6172 6173const int nbb00 = b0 -> nb [0 ]; 6174const int nbb01 = b0 -> nb [1 ]; 6175const int nbb02 = b0 -> nb [2 ]; 6176const int nbb03 = b0 -> nb [3 ]; 6177 6178const int nbb10 = b1 -> nb [0 ]; 6179//const int nbb11 = b1->nb[1]; 6180//const int nbb12 = b1->nb[2]; 6181//const int nbb13 = b1->nb[3]; 6182 6183const int nbc00 = c0 -> nb [0 ]; 6184const int nbc01 = c0 -> nb [1 ]; 6185const int nbc02 = c0 -> nb [2 ]; 6186const int nbc03 = c0 -> nb [3 ]; 6187 6188const int nbc10 = c1 -> nb [0 ]; 6189//const int nbc11 = c1->nb[1]; 6190//const int nbc12 = c1->nb[2]; 6191//const int nbc13 = c1->nb[3]; 6192 6193const int nb0 = dst -> nb [0 ]; 6194const int nb1 = dst -> nb [1 ]; 6195const int nb2 = dst -> nb [2 ]; 6196const int nb3 = dst -> nb [3 ]; 6197 6198const int ith = params -> ith ; 6199const int nth = params -> nth ; 6200 6201const int D = nea0 ; 6202//const int N = nea1; 6203const int M = neb01 ; 6204 6205GGML_ASSERT (ne0 == nea0 ); 6206GGML_ASSERT (ne1 == nea1 ); 6207GGML_ASSERT (ne2 == nea2 ); 6208 6209GGML_ASSERT (nba0 == sizeof (ggml_fp16_t )); 6210GGML_ASSERT (nbb00 == sizeof (ggml_fp16_t )); 6211GGML_ASSERT (nbb10 == sizeof (float )); 6212GGML_ASSERT (nbc00 == sizeof (ggml_fp16_t )); 6213GGML_ASSERT (nbc10 == sizeof (float )); 6214 6215GGML_ASSERT (neb00 == D ); 6216GGML_ASSERT (neb01 == M ); 6217GGML_ASSERT (neb10 == M ); 6218GGML_ASSERT (neb11 == 1 ); 6219 6220GGML_ASSERT (nec00 == M ); 6221GGML_ASSERT (nec01 == D ); 6222GGML_ASSERT (nec10 == D ); 6223GGML_ASSERT (nec11 == 1 ); 6224 6225// dst cannot be transposed or permuted 6226GGML_ASSERT (nb0 == sizeof (float )); 6227GGML_ASSERT (nb0 <=nb1 ); 6228GGML_ASSERT (nb1 <=nb2 ); 6229GGML_ASSERT (nb2 <=nb3 ); 6230 6231if (params -> type == GGML_TASK_INIT ) { 6232return ; 6233 } 6234 6235if (params -> type == GGML_TASK_FINALIZE ) { 6236return ; 6237 } 6238 6239// parallelize by a rows using ggml_vec_dot_f32 6240 6241// total rows in a 6242const int nr = nea1 * nea2 * nea3 ; 6243 6244// rows per thread 6245const int dr = (nr + nth - 1 )/nth ; 6246 6247// row range for this thread 6248const int ir0 = dr * ith ; 6249const int ir1 = MIN (ir0 + dr ,nr ); 6250 6251for (int ir = ir0 ;ir < ir1 ;++ ir ) { 6252// a indices 6253const int ia3 = ir /(nea2 * nea1 ); 6254const int ia2 = (ir - ia3 * nea2 * nea1 )/nea1 ; 6255const int ia1 = (ir - ia3 * nea2 * nea1 - ia2 * nea1 ); 6256 6257float * S = (float * )params -> wdata + ith * (2 * M + CACHE_LINE_SIZE_F32 ); 6258 6259for (int ic = 0 ;ic < neb01 ;++ ic ) { 6260// b0 indices 6261const int ib03 = ia3 ; 6262const int ib02 = ia2 ; 6263const int ib01 = ic ; 6264 6265// S indices 6266const int i1 = ib01 ; 6267 6268ggml_vec_dot_f16 (nea0 , 6269S + i1 , 6270 (ggml_fp16_t * ) ((char * )b0 -> data + (ib01 * nbb01 + ib02 * nbb02 + ib03 * nbb03 )), 6271 (ggml_fp16_t * ) ((char * )a -> data + (ia1 * nba1 + ia2 * nba2 + ia3 * nba3 ))); 6272 } 6273 6274ggml_vec_add_f32 (neb01 ,S ,S , (float * )b1 -> data ); 6275//ggml_vec_gelu_f32(neb01, S, S); 6276 6277ggml_fp16_t * S16 = (ggml_fp16_t * ) ((float * )params -> wdata + ith * (2 * M + CACHE_LINE_SIZE_F32 )+ M ); 6278 6279for (int i = 0 ;i < M ;i ++ ) { 6280S16 [i ]= GGML_FP32_TO_FP16 (S [i ]); 6281 } 6282 6283ggml_vec_gelu_f16 (neb01 ,S16 ,S16 ); 6284 6285 { 6286// dst indices 6287const int i1 = ia1 ; 6288const int i2 = ia2 ; 6289const int i3 = ia3 ; 6290 6291for (int ic = 0 ;ic < nec01 ;++ ic ) { 6292 6293ggml_vec_dot_f16 (neb01 , 6294 (float * ) ((char * )dst -> data + (ic * nb0 + i1 * nb1 + i2 * nb2 + i3 * nb3 )), 6295 (ggml_fp16_t * ) ((char * )c0 -> data + (ic * nbc01 + i2 * nbc02 + i3 * nbc03 )), 6296S16 ); 6297 } 6298 6299ggml_vec_add_f32 (nec01 , 6300 (float * ) ((char * )dst -> data + (i1 * nb1 + i2 * nb2 + i3 * nb3 )), 6301 (float * ) ((char * )dst -> data + (i1 * nb1 + i2 * nb2 + i3 * nb3 )), 6302 (float * )c1 -> data ); 6303 } 6304 } 6305} 6306 6307static void ggml_compute_forward_flash_ff ( 6308const struct ggml_compute_params * params , 6309const struct ggml_tensor * a , 6310const struct ggml_tensor * b0 , 6311const struct ggml_tensor * b1 , 6312const struct ggml_tensor * c0 , 6313const struct ggml_tensor * c1 , 6314struct ggml_tensor * dst ) { 6315switch (b0 -> type ) { 6316case GGML_TYPE_F16 : 6317 { 6318ggml_compute_forward_flash_ff_f16 (params ,a ,b0 ,b1 ,c0 ,c1 ,dst ); 6319 }break ; 6320case GGML_TYPE_F32 : 6321 { 6322GGML_ASSERT (false);// TODO 6323 }break ; 6324case GGML_TYPE_I8 : 6325case GGML_TYPE_I16 : 6326case GGML_TYPE_I32 : 6327case GGML_TYPE_COUNT : 6328 { 6329assert (false); 6330 }break ; 6331 } 6332} 6333 6334///////////////////////////////// 6335 6336static void ggml_compute_forward (struct ggml_compute_params * params ,struct ggml_tensor * tensor ) { 6337assert (params ); 6338 6339switch (tensor -> op ) { 6340case GGML_OP_DUP : 6341 { 6342ggml_compute_forward_dup (params ,tensor -> src0 ,tensor ); 6343 }break ; 6344case GGML_OP_ADD : 6345 { 6346ggml_compute_forward_add (params ,tensor -> src0 ,tensor -> src1 ,tensor ); 6347 }break ; 6348case GGML_OP_SUB : 6349 { 6350ggml_compute_forward_sub (params ,tensor -> src0 ,tensor -> src1 ,tensor ); 6351 }break ; 6352case GGML_OP_MUL : 6353 { 6354ggml_compute_forward_mul (params ,tensor -> src0 ,tensor -> src1 ,tensor ); 6355 }break ; 6356case GGML_OP_DIV : 6357 { 6358ggml_compute_forward_div (params ,tensor -> src0 ,tensor -> src1 ,tensor ); 6359 }break ; 6360case GGML_OP_SQR : 6361 { 6362ggml_compute_forward_sqr (params ,tensor -> src0 ,tensor ); 6363 }break ; 6364case GGML_OP_SQRT : 6365 { 6366ggml_compute_forward_sqrt (params ,tensor -> src0 ,tensor ); 6367 }break ; 6368case GGML_OP_SUM : 6369 { 6370ggml_compute_forward_sum (params ,tensor -> src0 ,tensor ); 6371 }break ; 6372case GGML_OP_MEAN : 6373 { 6374ggml_compute_forward_mean (params ,tensor -> src0 ,tensor ); 6375 }break ; 6376case GGML_OP_REPEAT : 6377 { 6378ggml_compute_forward_repeat (params ,tensor -> src0 ,tensor ); 6379 }break ; 6380case GGML_OP_ABS : 6381 { 6382ggml_compute_forward_abs (params ,tensor -> src0 ,tensor ); 6383 }break ; 6384case GGML_OP_SGN : 6385 { 6386ggml_compute_forward_sgn (params ,tensor -> src0 ,tensor ); 6387 }break ; 6388case GGML_OP_NEG : 6389 { 6390ggml_compute_forward_neg (params ,tensor -> src0 ,tensor ); 6391 }break ; 6392case GGML_OP_STEP : 6393 { 6394ggml_compute_forward_step (params ,tensor -> src0 ,tensor ); 6395 }break ; 6396case GGML_OP_RELU : 6397 { 6398ggml_compute_forward_relu (params ,tensor -> src0 ,tensor ); 6399 }break ; 6400case GGML_OP_GELU : 6401 { 6402ggml_compute_forward_gelu (params ,tensor -> src0 ,tensor ); 6403 }break ; 6404case GGML_OP_NORM : 6405 { 6406ggml_compute_forward_norm (params ,tensor -> src0 ,tensor ); 6407 }break ; 6408case GGML_OP_MUL_MAT : 6409 { 6410ggml_compute_forward_mul_mat (params ,tensor -> src0 ,tensor -> src1 ,tensor ); 6411 }break ; 6412case GGML_OP_SCALE : 6413 { 6414ggml_compute_forward_scale (params ,tensor -> src0 ,tensor -> src1 ,tensor ); 6415 }break ; 6416case GGML_OP_CPY : 6417 { 6418ggml_compute_forward_cpy (params ,tensor -> src0 ,tensor ); 6419 }break ; 6420case GGML_OP_RESHAPE : 6421 { 6422ggml_compute_forward_reshape (params ,tensor -> src0 ,tensor ); 6423 }break ; 6424case GGML_OP_VIEW : 6425 { 6426ggml_compute_forward_view (params ,tensor -> src0 ); 6427 }break ; 6428case GGML_OP_PERMUTE : 6429 { 6430ggml_compute_forward_permute (params ,tensor -> src0 ); 6431 }break ; 6432case GGML_OP_TRANSPOSE : 6433 { 6434ggml_compute_forward_transpose (params ,tensor -> src0 ); 6435 }break ; 6436case GGML_OP_GET_ROWS : 6437 { 6438ggml_compute_forward_get_rows (params ,tensor -> src0 ,tensor -> src1 ,tensor ); 6439 }break ; 6440case GGML_OP_DIAG_MASK_INF : 6441 { 6442ggml_compute_forward_diag_mask_inf (params ,tensor -> src0 ,tensor -> src1 ,tensor ); 6443 }break ; 6444case GGML_OP_SOFT_MAX : 6445 { 6446ggml_compute_forward_soft_max (params ,tensor -> src0 ,tensor ); 6447 }break ; 6448case GGML_OP_ROPE : 6449 { 6450ggml_compute_forward_rope (params ,tensor -> src0 ,tensor -> src1 ,tensor ); 6451 }break ; 6452case GGML_OP_CONV_1D_1S : 6453 { 6454ggml_compute_forward_conv_1d_1s (params ,tensor -> src0 ,tensor -> src1 ,tensor ); 6455 }break ; 6456case GGML_OP_CONV_1D_2S : 6457 { 6458ggml_compute_forward_conv_1d_2s (params ,tensor -> src0 ,tensor -> src1 ,tensor ); 6459 }break ; 6460case GGML_OP_FLASH_ATTN : 6461 { 6462int32_t t = ggml_get_i32_1d (tensor -> opt [1 ],0 ); 6463GGML_ASSERT (t == 0 || t == 1 ); 6464bool masked = t != 0 ; 6465ggml_compute_forward_flash_attn (params ,tensor -> src0 ,tensor -> src1 ,tensor -> opt [0 ],masked ,tensor ); 6466 }break ; 6467case GGML_OP_FLASH_FF : 6468 { 6469ggml_compute_forward_flash_ff (params ,tensor -> src0 ,tensor -> src1 ,tensor -> opt [0 ],tensor -> opt [1 ],tensor -> opt [2 ],tensor ); 6470 }break ; 6471case GGML_OP_NONE : 6472 { 6473// nop 6474 }break ; 6475case GGML_OP_COUNT : 6476 { 6477GGML_ASSERT (false); 6478 }break ; 6479 } 6480} 6481 6482//////////////////////////////////////////////////////////////////////////////// 6483 6484static void ggml_compute_backward (struct ggml_context * ctx ,struct ggml_tensor * tensor ,bool inplace ) { 6485struct ggml_tensor * src0 = tensor -> src0 ; 6486struct ggml_tensor * src1 = tensor -> src1 ; 6487 6488switch (tensor -> op ) { 6489case GGML_OP_DUP : 6490 { 6491if (src0 -> grad ) { 6492src0 -> grad = ggml_add_impl (ctx ,src0 -> grad ,tensor -> grad ,inplace ); 6493 } 6494 }break ; 6495case GGML_OP_ADD : 6496 { 6497if (src0 -> grad ) { 6498src0 -> grad = ggml_add_impl (ctx ,src0 -> grad ,tensor -> grad ,inplace ); 6499 } 6500if (src1 -> grad ) { 6501src1 -> grad = ggml_add_impl (ctx ,src1 -> grad ,tensor -> grad ,inplace ); 6502 } 6503 }break ; 6504case GGML_OP_SUB : 6505 { 6506if (src0 -> grad ) { 6507src0 -> grad = ggml_add_impl (ctx ,src0 -> grad ,tensor -> grad ,inplace ); 6508 } 6509if (src1 -> grad ) { 6510src1 -> grad = ggml_sub_impl (ctx ,src1 -> grad ,tensor -> grad ,inplace ); 6511 } 6512 }break ; 6513case GGML_OP_MUL : 6514 { 6515if (src0 -> grad ) { 6516src0 -> grad = 6517ggml_add_impl (ctx , 6518src0 -> grad , 6519ggml_mul (ctx ,src1 ,tensor -> grad ), 6520inplace ); 6521 } 6522if (src1 -> grad ) { 6523src1 -> grad = 6524ggml_add_impl (ctx , 6525src1 -> grad , 6526ggml_mul (ctx ,src0 ,tensor -> grad ), 6527inplace ); 6528 } 6529 }break ; 6530case GGML_OP_DIV : 6531 { 6532if (src0 -> grad ) { 6533src0 -> grad = 6534ggml_add_impl (ctx , 6535src0 -> grad , 6536ggml_div (ctx ,tensor -> grad ,src1 ), 6537inplace ); 6538 } 6539if (src1 -> grad ) { 6540src1 -> grad = 6541ggml_sub_impl (ctx , 6542src1 -> grad , 6543ggml_mul (ctx , 6544tensor -> grad , 6545ggml_div (ctx ,tensor ,src1 )), 6546inplace ); 6547 } 6548 }break ; 6549case GGML_OP_SQR : 6550 { 6551if (src0 -> grad ) { 6552src0 -> grad = 6553ggml_add_impl (ctx , 6554src0 -> grad , 6555ggml_mul (ctx , 6556ggml_mul (ctx ,src0 ,tensor -> grad ), 6557ggml_repeat (ctx ,ggml_new_f32 (ctx ,2.0f ),src0 )), 6558inplace ); 6559 } 6560 }break ; 6561case GGML_OP_SQRT : 6562 { 6563if (src0 -> grad ) { 6564src0 -> grad = 6565ggml_add_impl (ctx , 6566src0 -> grad , 6567ggml_div (ctx , 6568ggml_repeat (ctx ,ggml_new_f32 (ctx ,0.5f ),tensor ), 6569tensor ), 6570inplace ); 6571 } 6572 }break ; 6573case GGML_OP_SUM : 6574 { 6575if (src0 -> grad ) { 6576src0 -> grad = 6577ggml_add_impl (ctx , 6578src0 -> grad , 6579ggml_repeat (ctx ,tensor -> grad ,src0 -> grad ), 6580inplace ); 6581 } 6582 }break ; 6583case GGML_OP_MEAN : 6584 { 6585assert (false);// TODO: implement 6586 }break ; 6587case GGML_OP_REPEAT : 6588 { 6589if (src0 -> grad ) { 6590src0 -> grad = 6591ggml_add_impl (ctx , 6592src0 -> grad , 6593ggml_sum (ctx ,tensor -> grad ), 6594inplace ); 6595 } 6596 }break ; 6597case GGML_OP_ABS : 6598 { 6599if (src0 -> grad ) { 6600src0 -> grad = 6601ggml_add_impl (ctx , 6602src0 -> grad , 6603ggml_mul (ctx , 6604ggml_sgn (ctx ,src0 ), 6605tensor -> grad ), 6606inplace ); 6607 } 6608 }break ; 6609case GGML_OP_SGN : 6610 { 6611if (src0 -> grad ) { 6612// noop 6613 } 6614 }break ; 6615case GGML_OP_NEG : 6616 { 6617if (src0 -> grad ) { 6618src0 -> grad = ggml_sub_impl (ctx ,src0 -> grad ,tensor -> grad ,inplace ); 6619 } 6620 }break ; 6621case GGML_OP_STEP : 6622 { 6623if (src0 -> grad ) { 6624// noop 6625 } 6626 }break ; 6627case GGML_OP_RELU : 6628 { 6629if (src0 -> grad ) { 6630src0 -> grad = ggml_sub_impl (ctx , 6631src0 -> grad , 6632ggml_mul (ctx , 6633ggml_step (ctx ,src0 ), 6634tensor -> grad ), 6635inplace ); 6636 } 6637 }break ; 6638case GGML_OP_GELU : 6639 { 6640assert (false);// TODO: not implemented 6641 }break ; 6642case GGML_OP_NORM : 6643 { 6644assert (false);// TODO: not implemented 6645 }break ; 6646case GGML_OP_MUL_MAT : 6647 { 6648if (src0 -> grad ) { 6649// TODO: this requires outer product - ggml_out_prod(ctx, src1, tensor->grad); 6650assert (false); 6651 } 6652if (src1 -> grad ) { 6653src1 -> grad = 6654ggml_add_impl (ctx , 6655src1 -> grad , 6656// TODO: fix transpose, the node will break the graph connections 6657ggml_mul_mat (ctx ,ggml_transpose (ctx ,src0 ),tensor -> grad ), 6658inplace ); 6659 } 6660 }break ; 6661case GGML_OP_SCALE : 6662 { 6663GGML_ASSERT (false);// TODO: not implemented 6664 }break ; 6665case GGML_OP_CPY : 6666 { 6667GGML_ASSERT (false);// TODO: not implemented 6668 }break ; 6669case GGML_OP_RESHAPE : 6670 { 6671GGML_ASSERT (false);// TODO: not implemented 6672 }break ; 6673case GGML_OP_VIEW : 6674 { 6675GGML_ASSERT (false);// not supported 6676 }break ; 6677case GGML_OP_PERMUTE : 6678 { 6679GGML_ASSERT (false);// TODO: not implemented 6680 }break ; 6681case GGML_OP_TRANSPOSE : 6682 { 6683GGML_ASSERT (false);// TODO: not implemented 6684 }break ; 6685case GGML_OP_GET_ROWS : 6686 { 6687GGML_ASSERT (false);// TODO: not implemented 6688 }break ; 6689case GGML_OP_DIAG_MASK_INF : 6690 { 6691GGML_ASSERT (false);// TODO: not implemented 6692 }break ; 6693case GGML_OP_SOFT_MAX : 6694 { 6695GGML_ASSERT (false);// TODO: not implemented 6696 }break ; 6697case GGML_OP_ROPE : 6698 { 6699GGML_ASSERT (false);// TODO: not implemented 6700 }break ; 6701case GGML_OP_CONV_1D_1S : 6702 { 6703GGML_ASSERT (false);// TODO: not implemented 6704 }break ; 6705case GGML_OP_CONV_1D_2S : 6706 { 6707GGML_ASSERT (false);// TODO: not implemented 6708 }break ; 6709case GGML_OP_FLASH_ATTN : 6710 { 6711GGML_ASSERT (false);// not supported 6712 }break ; 6713case GGML_OP_FLASH_FF : 6714 { 6715GGML_ASSERT (false);// not supported 6716 }break ; 6717case GGML_OP_NONE : 6718 { 6719// nop 6720 }break ; 6721case GGML_OP_COUNT : 6722 { 6723GGML_ASSERT (false); 6724 }break ; 6725 } 6726} 6727 6728static void ggml_visit_parents (struct ggml_cgraph * cgraph ,struct ggml_tensor * node ) { 6729if (node -> grad == NULL ) { 6730// this usually happens when we generate intermediate nodes from constants in the backward pass 6731// it can also happen during forward pass, if the user performs computations with constants 6732if (node -> op != GGML_OP_NONE ) { 6733//GGML_PRINT_DEBUG("%s: warning: node %p has no grad, but op %d\n", __func__, (void *) node, node->op); 6734 } 6735 } 6736 6737// check if already visited 6738for (int i = 0 ;i < cgraph -> n_nodes ;i ++ ) { 6739if (cgraph -> nodes [i ]== node ) { 6740return ; 6741 } 6742 } 6743 6744for (int i = 0 ;i < cgraph -> n_leafs ;i ++ ) { 6745if (cgraph -> leafs [i ]== node ) { 6746return ; 6747 } 6748 } 6749 6750if (node -> src0 ) { 6751ggml_visit_parents (cgraph ,node -> src0 ); 6752 } 6753 6754if (node -> src1 ) { 6755ggml_visit_parents (cgraph ,node -> src1 ); 6756 } 6757 6758for (int i = 0 ;i < GGML_MAX_OPT ;++ i ) { 6759if (node -> opt [i ]) { 6760ggml_visit_parents (cgraph ,node -> opt [i ]); 6761 } 6762 } 6763 6764if (node -> op == GGML_OP_NONE && node -> grad == NULL ) { 6765// reached a leaf node, not part of the gradient graph (e.g. a constant) 6766assert (cgraph -> n_leafs < GGML_MAX_NODES ); 6767 6768cgraph -> leafs [cgraph -> n_leafs ]= node ; 6769cgraph -> n_leafs ++ ; 6770 }else { 6771assert (cgraph -> n_nodes < GGML_MAX_NODES ); 6772 6773cgraph -> nodes [cgraph -> n_nodes ]= node ; 6774cgraph -> grads [cgraph -> n_nodes ]= node -> grad ; 6775cgraph -> n_nodes ++ ; 6776 } 6777} 6778 6779static void ggml_build_forward_impl (struct ggml_cgraph * cgraph ,struct ggml_tensor * tensor ,bool expand ) { 6780if (!expand ) { 6781cgraph -> n_nodes = 0 ; 6782cgraph -> n_leafs = 0 ; 6783 } 6784 6785const int n0 = cgraph -> n_nodes ; 6786UNUSED (n0 ); 6787 6788ggml_visit_parents (cgraph ,tensor ); 6789 6790const int n_new = cgraph -> n_nodes - n0 ; 6791GGML_PRINT_DEBUG ("%s: visited %d new nodes\n" ,__func__ ,n_new ); 6792 6793if (n_new > 0 ) { 6794// the last added node should always be starting point 6795assert (cgraph -> nodes [cgraph -> n_nodes - 1 ]== tensor ); 6796 } 6797} 6798 6799void ggml_build_forward_expand (struct ggml_cgraph * cgraph ,struct ggml_tensor * tensor ) { 6800ggml_build_forward_impl (cgraph ,tensor , true); 6801} 6802 6803struct ggml_cgraph ggml_build_forward (struct ggml_tensor * tensor ) { 6804struct ggml_cgraph result = { 6805/*.n_nodes =*/ 0 , 6806/*.n_leafs =*/ 0 , 6807/*.n_threads =*/ 0 , 6808/*.work_size =*/ 0 , 6809/*.work =*/ NULL , 6810/*.nodes =*/ {NULL }, 6811/*.grads =*/ {NULL }, 6812/*.leafs =*/ {NULL }, 6813/*.perf_runs =*/ 0 , 6814/*.perf_cycles =*/ 0 , 6815/*.perf_time_us =*/ 0 , 6816 }; 6817 6818ggml_build_forward_impl (& result ,tensor , false); 6819 6820return result ; 6821} 6822 6823struct ggml_cgraph ggml_build_backward (struct ggml_context * ctx ,struct ggml_cgraph * gf ,bool keep ) { 6824struct ggml_cgraph result = * gf ; 6825 6826assert (gf -> n_nodes > 0 ); 6827 6828// if we are keeping the gradient graph, we have to detach the gradient nodes from the original graph 6829if (keep ) { 6830for (int i = 0 ;i < gf -> n_nodes ;i ++ ) { 6831struct ggml_tensor * node = gf -> nodes [i ]; 6832 6833if (node -> grad ) { 6834node -> grad = ggml_dup_tensor (ctx ,node ); 6835gf -> grads [i ]= node -> grad ; 6836 } 6837 } 6838 } 6839 6840for (int i = gf -> n_nodes - 1 ;i >=0 ;i -- ) { 6841struct ggml_tensor * node = gf -> nodes [i ]; 6842 6843// because we detached the grad nodes from the original graph, we can afford inplace operations 6844if (node -> grad ) { 6845ggml_compute_backward (ctx ,node ,keep ); 6846 } 6847 } 6848 6849for (int i = gf -> n_nodes - 1 ;i >=0 ;i -- ) { 6850struct ggml_tensor * node = gf -> nodes [i ]; 6851 6852if (node -> is_param ) { 6853GGML_PRINT_DEBUG ("%s: found root node %p\n" ,__func__ , (void * )node ); 6854ggml_build_forward_impl (& result ,node -> grad , true); 6855 } 6856 } 6857 6858return result ; 6859} 6860 6861// 6862// thread data 6863// 6864// synchronization is done via busy loops 6865// I tried using spin locks, but not sure how to use them correctly - the things I tried were slower than busy loops 6866// 6867 6868#ifdef __APPLE__ 6869 6870//#include <os/lock.h> 6871 6872//typedef os_unfair_lock ggml_lock_t; 6873// 6874//#define ggml_lock_init(x) UNUSED(x) 6875//#define ggml_lock_destroy(x) UNUSED(x) 6876//#define ggml_lock_lock os_unfair_lock_lock 6877//#define ggml_lock_unlock os_unfair_lock_unlock 6878// 6879//#define GGML_LOCK_INITIALIZER OS_UNFAIR_LOCK_INIT 6880 6881typedef int ggml_lock_t ; 6882 6883#define ggml_lock_init (x ) UNUSED(x) 6884#define ggml_lock_destroy (x ) UNUSED(x) 6885#define ggml_lock_lock (x ) UNUSED(x) 6886#define ggml_lock_unlock (x ) UNUSED(x) 6887 6888#define GGML_LOCK_INITIALIZER 0 6889 6890typedef pthread_t ggml_thread_t ; 6891 6892#define ggml_thread_create pthread_create 6893#define ggml_thread_join pthread_join 6894 6895#else 6896 6897//typedef pthread_spinlock_t ggml_lock_t; 6898 6899//#define ggml_lock_init(x) pthread_spin_init(x, PTHREAD_PROCESS_PRIVATE) 6900//#define ggml_lock_destroy pthread_spin_destroy 6901//#define ggml_lock_lock pthread_spin_lock 6902//#define ggml_lock_unlock pthread_spin_unlock 6903 6904typedef int ggml_lock_t ; 6905 6906#define ggml_lock_init (x ) UNUSED(x) 6907#define ggml_lock_destroy (x ) UNUSED(x) 6908#define ggml_lock_lock (x ) UNUSED(x) 6909#define ggml_lock_unlock (x ) UNUSED(x) 6910 6911#define GGML_LOCK_INITIALIZER 0 6912 6913typedef pthread_t ggml_thread_t ; 6914 6915#define ggml_thread_create pthread_create 6916#define ggml_thread_join pthread_join 6917 6918#endif 6919 6920struct ggml_compute_state_shared { 6921ggml_lock_t spin ; 6922 6923int n_threads ; 6924 6925// synchronization primitives 6926atomic_int n_ready ; 6927atomic_bool has_work ; 6928atomic_bool stop ;// stop all threads 6929}; 6930 6931struct ggml_compute_state { 6932ggml_thread_t thrd ; 6933 6934struct ggml_compute_params params ; 6935struct ggml_tensor * node ; 6936 6937struct ggml_compute_state_shared * shared ; 6938}; 6939 6940static thread_ret_t ggml_graph_compute_thread (void * data ) { 6941struct ggml_compute_state * state = (struct ggml_compute_state * )data ; 6942 6943const int n_threads = state -> shared -> n_threads ; 6944 6945while (true) { 6946if (atomic_fetch_add (& state -> shared -> n_ready ,1 )== n_threads - 1 ) { 6947atomic_store (& state -> shared -> has_work , false); 6948 }else { 6949while (atomic_load (& state -> shared -> has_work )) { 6950if (atomic_load (& state -> shared -> stop )) { 6951return 0 ; 6952 } 6953ggml_lock_lock (& state -> shared -> spin ); 6954ggml_lock_unlock (& state -> shared -> spin ); 6955 } 6956 } 6957 6958atomic_fetch_sub (& state -> shared -> n_ready ,1 ); 6959 6960// wait for work 6961while (!atomic_load (& state -> shared -> has_work )) { 6962if (atomic_load (& state -> shared -> stop )) { 6963return 0 ; 6964 } 6965ggml_lock_lock (& state -> shared -> spin ); 6966ggml_lock_unlock (& state -> shared -> spin ); 6967 } 6968 6969// check if we should stop 6970if (atomic_load (& state -> shared -> stop )) { 6971break ; 6972 } 6973 6974if (state -> node ) { 6975ggml_compute_forward (& state -> params ,state -> node ); 6976state -> node = NULL ; 6977 }else { 6978break ; 6979 } 6980 } 6981 6982return 0 ; 6983} 6984 6985void ggml_graph_compute (struct ggml_context * ctx ,struct ggml_cgraph * cgraph ) { 6986if (cgraph -> n_threads <=0 ) { 6987cgraph -> n_threads = 8 ; 6988 } 6989 6990const int n_threads = cgraph -> n_threads ; 6991 6992struct ggml_compute_state_shared state_shared = { 6993/*.spin =*/ GGML_LOCK_INITIALIZER , 6994/*.n_threads =*/ n_threads , 6995/*.n_ready =*/ 0 , 6996/*.has_work =*/ false, 6997/*.stop =*/ false, 6998 }; 6999struct ggml_compute_state * workers = n_threads > 1 ?alloca (sizeof (struct ggml_compute_state )* (n_threads - 1 )) :NULL ; 7000 7001// create thread pool 7002if (n_threads > 1 ) { 7003ggml_lock_init (& state_shared .spin ); 7004 7005atomic_store (& state_shared .has_work , true); 7006 7007for (int j = 0 ;j < n_threads - 1 ;j ++ ) { 7008workers [j ]= (struct ggml_compute_state ) { 7009 .thrd = 0 , 7010 .params = { 7011 .type = GGML_TASK_COMPUTE , 7012 .ith = j + 1 , 7013 .nth = n_threads , 7014 .wsize = cgraph -> work ?ggml_nbytes (cgraph -> work ) :0 , 7015 .wdata = cgraph -> work ?cgraph -> work -> data :NULL , 7016 }, 7017 .node = NULL , 7018 .shared = & state_shared , 7019 }; 7020int rc = ggml_thread_create (& workers [j ].thrd ,NULL ,ggml_graph_compute_thread ,& workers [j ]); 7021assert (rc == 0 ); 7022UNUSED (rc ); 7023 } 7024 } 7025 7026// initialize tasks + work buffer 7027 { 7028size_t work_size = 0 ; 7029 7030// thread scheduling for the different operations 7031for (int i = 0 ;i < cgraph -> n_nodes ;i ++ ) { 7032struct ggml_tensor * node = cgraph -> nodes [i ]; 7033 7034switch (node -> op ) { 7035case GGML_OP_DUP : 7036 { 7037node -> n_tasks = 1 ; 7038 }break ; 7039case GGML_OP_ADD : 7040 { 7041node -> n_tasks = n_threads ; 7042 }break ; 7043case GGML_OP_SUB : 7044case GGML_OP_MUL : 7045case GGML_OP_DIV : 7046case GGML_OP_SQR : 7047case GGML_OP_SQRT : 7048case GGML_OP_SUM : 7049case GGML_OP_MEAN : 7050case GGML_OP_REPEAT : 7051case GGML_OP_ABS : 7052case GGML_OP_SGN : 7053case GGML_OP_NEG : 7054case GGML_OP_STEP : 7055case GGML_OP_RELU : 7056 { 7057node -> n_tasks = 1 ; 7058 }break ; 7059case GGML_OP_GELU : 7060 { 7061node -> n_tasks = n_threads ; 7062 }break ; 7063case GGML_OP_NORM : 7064 { 7065node -> n_tasks = n_threads ; 7066 }break ; 7067case GGML_OP_MUL_MAT : 7068 { 7069// TODO: use different scheduling for different matrix sizes 7070node -> n_tasks = n_threads ; 7071 7072size_t cur = 0 ; 7073 7074// TODO: better way to determine if the matrix is transposed 7075if (node -> src0 -> nb [1 ]< node -> src0 -> nb [0 ]) { 7076cur = ggml_nbytes (node )* node -> n_tasks ;// TODO: this can become (n_tasks-1) 7077 }else { 7078if (node -> src0 -> type == GGML_TYPE_F16 && 7079node -> src1 -> type == GGML_TYPE_F32 ) { 7080#if defined(GGML_USE_ACCELERATE )|| defined(GGML_USE_OPENBLAS ) 7081if (ggml_compute_forward_mul_mat_use_blas (node -> src0 ,node -> src1 ,node )) { 7082cur = sizeof (float )* (node -> src0 -> ne [0 ]* node -> src0 -> ne [1 ]); 7083 }else { 7084cur = sizeof (ggml_fp16_t )* ggml_nelements (node -> src1 ); 7085 } 7086#else 7087cur = sizeof (ggml_fp16_t )* ggml_nelements (node -> src1 ); 7088#endif 7089 }else if (node -> src0 -> type == GGML_TYPE_F32 && 7090node -> src1 -> type == GGML_TYPE_F32 ) { 7091cur = 0 ; 7092 }else { 7093GGML_ASSERT (false); 7094 } 7095 } 7096 7097work_size = MAX (work_size ,cur ); 7098 }break ; 7099case GGML_OP_SCALE : 7100 { 7101node -> n_tasks = n_threads ; 7102 }break ; 7103case GGML_OP_CPY : 7104case GGML_OP_RESHAPE : 7105case GGML_OP_VIEW : 7106case GGML_OP_PERMUTE : 7107case GGML_OP_TRANSPOSE : 7108case GGML_OP_GET_ROWS : 7109case GGML_OP_DIAG_MASK_INF : 7110 { 7111node -> n_tasks = 1 ; 7112 }break ; 7113case GGML_OP_SOFT_MAX : 7114 { 7115node -> n_tasks = n_threads ; 7116 }break ; 7117case GGML_OP_ROPE : 7118 { 7119node -> n_tasks = 1 ; 7120 }break ; 7121case GGML_OP_CONV_1D_1S : 7122case GGML_OP_CONV_1D_2S : 7123 { 7124node -> n_tasks = n_threads ; 7125 7126GGML_ASSERT (node -> src0 -> ne [3 ]== 1 ); 7127GGML_ASSERT (node -> src1 -> ne [2 ]== 1 ); 7128GGML_ASSERT (node -> src1 -> ne [3 ]== 1 ); 7129 7130size_t cur = 0 ; 7131const int nk = node -> src0 -> ne [0 ]; 7132 7133if (node -> src0 -> type == GGML_TYPE_F16 && 7134node -> src1 -> type == GGML_TYPE_F32 ) { 7135cur = sizeof (ggml_fp16_t )* ( 7136nk * ggml_up32 (node -> src0 -> ne [1 ])* node -> src0 -> ne [2 ]+ 7137 (2 * (nk /2 )+ node -> src1 -> ne [0 ])* node -> src1 -> ne [1 ] 7138 ); 7139 }else if (node -> src0 -> type == GGML_TYPE_F32 && 7140node -> src1 -> type == GGML_TYPE_F32 ) { 7141cur = sizeof (float )* ( 7142nk * ggml_up32 (node -> src0 -> ne [1 ])* node -> src0 -> ne [2 ]+ 7143 (2 * (nk /2 )+ node -> src1 -> ne [0 ])* node -> src1 -> ne [1 ] 7144 ); 7145 }else { 7146GGML_ASSERT (false); 7147 } 7148 7149work_size = MAX (work_size ,cur ); 7150 }break ; 7151case GGML_OP_FLASH_ATTN : 7152 { 7153node -> n_tasks = n_threads ; 7154 7155size_t cur = 0 ; 7156 7157if (node -> src1 -> type == GGML_TYPE_F32 ) { 7158cur = sizeof (float )* node -> src1 -> ne [1 ]* node -> n_tasks ;// TODO: this can become (n_tasks-1) 7159cur += sizeof (float )* node -> src1 -> ne [1 ]* node -> n_tasks ;// this is overestimated by x2 7160 } 7161 7162if (node -> src1 -> type == GGML_TYPE_F16 ) { 7163cur = sizeof (float )* node -> src1 -> ne [1 ]* node -> n_tasks ;// TODO: this can become (n_tasks-1) 7164cur += sizeof (float )* node -> src1 -> ne [1 ]* node -> n_tasks ;// this is overestimated by x2 7165 } 7166 7167work_size = MAX (work_size ,cur ); 7168 }break ; 7169case GGML_OP_FLASH_FF : 7170 { 7171node -> n_tasks = n_threads ; 7172 7173size_t cur = 0 ; 7174 7175if (node -> src1 -> type == GGML_TYPE_F32 ) { 7176cur = sizeof (float )* node -> src1 -> ne [1 ]* node -> n_tasks ;// TODO: this can become (n_tasks-1) 7177cur += sizeof (float )* node -> src1 -> ne [1 ]* node -> n_tasks ;// this is overestimated by x2 7178 } 7179 7180if (node -> src1 -> type == GGML_TYPE_F16 ) { 7181cur = sizeof (float )* node -> src1 -> ne [1 ]* node -> n_tasks ;// TODO: this can become (n_tasks-1) 7182cur += sizeof (float )* node -> src1 -> ne [1 ]* node -> n_tasks ;// this is overestimated by x2 7183 } 7184 7185work_size = MAX (work_size ,cur ); 7186 }break ; 7187case GGML_OP_NONE : 7188 { 7189node -> n_tasks = 1 ; 7190 }break ; 7191case GGML_OP_COUNT : 7192 { 7193assert (false); 7194 }break ; 7195 } 7196 } 7197 7198if (cgraph -> work != NULL && work_size > cgraph -> work_size ) { 7199assert (false);// TODO: better handling 7200 } 7201 7202if (work_size > 0 && cgraph -> work == NULL ) { 7203cgraph -> work_size = work_size + CACHE_LINE_SIZE * (n_threads - 1 ); 7204 7205GGML_PRINT_DEBUG ("%s: allocating work buffer for graph (%zu bytes)\n" ,__func__ ,cgraph -> work_size ); 7206cgraph -> work = ggml_new_tensor_1d (ctx ,GGML_TYPE_I8 ,cgraph -> work_size ); 7207 } 7208 } 7209 7210const int64_t perf_start_cycles = ggml_perf_cycles (); 7211const int64_t perf_start_time_us = ggml_perf_time_us (); 7212 7213for (int i = 0 ;i < cgraph -> n_nodes ;i ++ ) { 7214GGML_PRINT_DEBUG_5 ("%s: %d/%d\n" ,__func__ ,i ,cgraph -> n_nodes ); 7215 7216struct ggml_tensor * node = cgraph -> nodes [i ]; 7217 7218// TODO: this could be used to avoid unnecessary computations, but it needs to be improved 7219//if (node->grad == NULL && node->perf_runs > 0) { 7220// continue; 7221//} 7222 7223const int64_t perf_node_start_cycles = ggml_perf_cycles (); 7224const int64_t perf_node_start_time_us = ggml_perf_time_us (); 7225 7226// INIT 7227struct ggml_compute_params params = { 7228/*.type =*/ GGML_TASK_INIT , 7229/*.ith =*/ 0 , 7230/*.nth =*/ node -> n_tasks , 7231/*.wsize =*/ cgraph -> work ?ggml_nbytes (cgraph -> work ) :0 , 7232/*.wdata =*/ cgraph -> work ?cgraph -> work -> data :NULL , 7233 }; 7234 7235ggml_compute_forward (& params ,node ); 7236 7237// COMPUTE 7238if (node -> n_tasks > 1 ) { 7239if (atomic_fetch_add (& state_shared .n_ready ,1 )== n_threads - 1 ) { 7240atomic_store (& state_shared .has_work , false); 7241 } 7242 7243while (atomic_load (& state_shared .has_work )) { 7244ggml_lock_lock (& state_shared .spin ); 7245ggml_lock_unlock (& state_shared .spin ); 7246 } 7247 7248// launch thread pool 7249for (int j = 0 ;j < n_threads - 1 ;j ++ ) { 7250workers [j ].params = (struct ggml_compute_params ) { 7251 .type = GGML_TASK_COMPUTE , 7252 .ith = j + 1 , 7253 .nth = n_threads , 7254 .wsize = cgraph -> work ?ggml_nbytes (cgraph -> work ) :0 , 7255 .wdata = cgraph -> work ?cgraph -> work -> data :NULL , 7256 }; 7257workers [j ].node = node ; 7258 } 7259 7260atomic_fetch_sub (& state_shared .n_ready ,1 ); 7261 7262while (atomic_load (& state_shared .n_ready )> 0 ) { 7263ggml_lock_lock (& state_shared .spin ); 7264ggml_lock_unlock (& state_shared .spin ); 7265 } 7266 7267atomic_store (& state_shared .has_work , true); 7268 } 7269 7270params .type = GGML_TASK_COMPUTE ; 7271ggml_compute_forward (& params ,node ); 7272 7273// wait for thread pool 7274if (node -> n_tasks > 1 ) { 7275if (atomic_fetch_add (& state_shared .n_ready ,1 )== n_threads - 1 ) { 7276atomic_store (& state_shared .has_work , false); 7277 } 7278 7279while (atomic_load (& state_shared .has_work )) { 7280ggml_lock_lock (& state_shared .spin ); 7281ggml_lock_unlock (& state_shared .spin ); 7282 } 7283 7284atomic_fetch_sub (& state_shared .n_ready ,1 ); 7285 7286while (atomic_load (& state_shared .n_ready )!= 0 ) { 7287ggml_lock_lock (& state_shared .spin ); 7288ggml_lock_unlock (& state_shared .spin ); 7289 } 7290 } 7291 7292// FINALIZE 7293if (node -> n_tasks > 1 ) { 7294if (atomic_fetch_add (& state_shared .n_ready ,1 )== n_threads - 1 ) { 7295atomic_store (& state_shared .has_work , false); 7296 } 7297 7298while (atomic_load (& state_shared .has_work )) { 7299ggml_lock_lock (& state_shared .spin ); 7300ggml_lock_unlock (& state_shared .spin ); 7301 } 7302 7303// launch thread pool 7304for (int j = 0 ;j < n_threads - 1 ;j ++ ) { 7305workers [j ].params = (struct ggml_compute_params ) { 7306 .type = GGML_TASK_FINALIZE , 7307 .ith = j + 1 , 7308 .nth = n_threads , 7309 .wsize = cgraph -> work ?ggml_nbytes (cgraph -> work ) :0 , 7310 .wdata = cgraph -> work ?cgraph -> work -> data :NULL , 7311 }; 7312workers [j ].node = node ; 7313 } 7314 7315atomic_fetch_sub (& state_shared .n_ready ,1 ); 7316 7317while (atomic_load (& state_shared .n_ready )> 0 ) { 7318ggml_lock_lock (& state_shared .spin ); 7319ggml_lock_unlock (& state_shared .spin ); 7320 } 7321 7322atomic_store (& state_shared .has_work , true); 7323 } 7324 7325params .type = GGML_TASK_FINALIZE ; 7326ggml_compute_forward (& params ,node ); 7327 7328// wait for thread pool 7329if (node -> n_tasks > 1 ) { 7330if (atomic_fetch_add (& state_shared .n_ready ,1 )== n_threads - 1 ) { 7331atomic_store (& state_shared .has_work , false); 7332 } 7333 7334while (atomic_load (& state_shared .has_work )) { 7335ggml_lock_lock (& state_shared .spin ); 7336ggml_lock_unlock (& state_shared .spin ); 7337 } 7338 7339atomic_fetch_sub (& state_shared .n_ready ,1 ); 7340 7341while (atomic_load (& state_shared .n_ready )!= 0 ) { 7342ggml_lock_lock (& state_shared .spin ); 7343ggml_lock_unlock (& state_shared .spin ); 7344 } 7345 } 7346 7347// performance stats (node) 7348 { 7349int64_t perf_cycles_cur = ggml_perf_cycles ()- perf_node_start_cycles ; 7350int64_t perf_time_us_cur = ggml_perf_time_us ()- perf_node_start_time_us ; 7351 7352node -> perf_runs ++ ; 7353node -> perf_cycles += perf_cycles_cur ; 7354node -> perf_time_us += perf_time_us_cur ; 7355 } 7356 } 7357 7358// join thread pool 7359if (n_threads > 1 ) { 7360atomic_store (& state_shared .stop , true); 7361atomic_store (& state_shared .has_work , true); 7362 7363for (int j = 0 ;j < n_threads - 1 ;j ++ ) { 7364int rc = ggml_thread_join (workers [j ].thrd ,NULL ); 7365assert (rc == 0 ); 7366UNUSED (rc ); 7367 } 7368 7369ggml_lock_destroy (& state_shared .spin ); 7370 } 7371 7372// performance stats (graph) 7373 { 7374int64_t perf_cycles_cur = ggml_perf_cycles ()- perf_start_cycles ; 7375int64_t perf_time_us_cur = ggml_perf_time_us ()- perf_start_time_us ; 7376 7377cgraph -> perf_runs ++ ; 7378cgraph -> perf_cycles += perf_cycles_cur ; 7379cgraph -> perf_time_us += perf_time_us_cur ; 7380 7381GGML_PRINT_DEBUG ("%s: perf (%d) - cpu = %.3f / %.3f ms, wall = %.3f / %.3f ms\n" , 7382__func__ ,cgraph -> perf_runs , 7383 (double )perf_cycles_cur / (double )ggml_cycles_per_ms (), 7384 (double )cgraph -> perf_cycles / (double )ggml_cycles_per_ms () / (double )cgraph -> perf_runs , 7385 (double )perf_time_us_cur /1000.0 , 7386 (double )cgraph -> perf_time_us /1000.0 /cgraph -> perf_runs ); 7387 } 7388} 7389 7390void ggml_graph_reset (struct ggml_cgraph * cgraph ) { 7391for (int i = 0 ;i < cgraph -> n_nodes ;i ++ ) { 7392struct ggml_tensor * grad = cgraph -> grads [i ]; 7393 7394if (grad ) { 7395ggml_set_zero (grad ); 7396 } 7397 } 7398} 7399 7400void ggml_graph_print (const struct ggml_cgraph * cgraph ) { 7401int64_t perf_total_per_op_us [GGML_OP_COUNT ]= {0 }; 7402 7403GGML_PRINT ("=== GRAPH ===\n" ); 7404 7405GGML_PRINT_DEBUG ("n_threads = %d\n" ,cgraph -> n_threads ); 7406GGML_PRINT_DEBUG ("total work size = %zu bytes\n" ,cgraph -> work_size ); 7407 7408GGML_PRINT ("n_nodes = %d\n" ,cgraph -> n_nodes ); 7409for (int i = 0 ;i < cgraph -> n_nodes ;i ++ ) { 7410struct ggml_tensor * node = cgraph -> nodes [i ]; 7411 7412perf_total_per_op_us [node -> op ]+= node -> perf_time_us ; 7413 7414GGML_PRINT (" - %3d: [ %6d, %6d, %6d] %16s %s (%3d) cpu = %7.3f / %7.3f ms, wall = %7.3f / %7.3f ms\n" , 7415i , 7416node -> ne [0 ],node -> ne [1 ],node -> ne [2 ], 7417GGML_OP_LABEL [node -> op ],node -> is_param ?"x" :node -> grad ?"g" :" " ,node -> perf_runs , 7418 (double )node -> perf_cycles / (double )ggml_cycles_per_ms (), 7419 (double )node -> perf_cycles / (double )ggml_cycles_per_ms () / (double )node -> perf_runs , 7420 (double )node -> perf_time_us /1000.0 , 7421 (double )node -> perf_time_us /1000.0 /node -> perf_runs ); 7422 } 7423 7424GGML_PRINT ("n_leafs = %d\n" ,cgraph -> n_leafs ); 7425for (int i = 0 ;i < cgraph -> n_leafs ;i ++ ) { 7426struct ggml_tensor * node = cgraph -> leafs [i ]; 7427 7428GGML_PRINT (" - %3d: [ %6d, %6d] %8s\n" , 7429i , 7430node -> ne [0 ],node -> ne [1 ], 7431GGML_OP_LABEL [node -> op ]); 7432 } 7433 7434for (int i = 0 ;i < GGML_OP_COUNT ;i ++ ) { 7435GGML_PRINT ("perf_total_per_op_us[%16s] = %7.3f ms\n" ,GGML_OP_LABEL [i ], (double )perf_total_per_op_us [i ] /1000.0 ); 7436 } 7437 7438GGML_PRINT ("========================================\n" ); 7439} 7440 7441// check if node is part of the graph 7442static bool ggml_graph_find (const struct ggml_cgraph * cgraph ,const struct ggml_tensor * node ) { 7443if (cgraph == NULL ) { 7444return true; 7445 } 7446 7447for (int i = 0 ;i < cgraph -> n_nodes ;i ++ ) { 7448if (cgraph -> nodes [i ]== node ) { 7449return true; 7450 } 7451 } 7452 7453return false; 7454} 7455 7456static struct ggml_tensor * ggml_graph_get_parent (const struct ggml_cgraph * cgraph ,const struct ggml_tensor * node ) { 7457for (int i = 0 ;i < cgraph -> n_nodes ;i ++ ) { 7458struct ggml_tensor * parent = cgraph -> nodes [i ]; 7459 7460if (parent -> grad == node ) { 7461return parent ; 7462 } 7463 } 7464 7465return NULL ; 7466} 7467 7468void ggml_graph_dump_dot (const struct ggml_cgraph * gb ,const struct ggml_cgraph * gf ,const char * filename ) { 7469char color [16 ]; 7470 7471FILE * fp = fopen (filename ,"w" ); 7472assert (fp ); 7473 7474fprintf (fp ,"digraph G {\n" ); 7475fprintf (fp ," newrank = true;\n" ); 7476fprintf (fp ," rankdir = LR;\n" ); 7477 7478for (int i = 0 ;i < gb -> n_nodes ;i ++ ) { 7479struct ggml_tensor * node = gb -> nodes [i ]; 7480 7481if (ggml_graph_get_parent (gb ,node )!= NULL ) { 7482continue ; 7483 } 7484 7485if (node -> is_param ) { 7486snprintf (color ,sizeof (color ),"yellow" ); 7487 }else if (node -> grad ) { 7488if (ggml_graph_find (gf ,node )) { 7489snprintf (color ,sizeof (color ),"green" ); 7490 }else { 7491snprintf (color ,sizeof (color ),"lightblue" ); 7492 } 7493 }else { 7494snprintf (color ,sizeof (color ),"white" ); 7495 } 7496 7497fprintf (fp ," \"%p\" [ \ 7498style = filled; fillcolor = %s; shape = record; \ 7499label=\"%d [%d, %d] | <x>%s" , 7500 (void * )node ,color , 7501i ,node -> ne [0 ],node -> ne [1 ], 7502GGML_OP_SYMBOL [node -> op ]); 7503 7504if (node -> grad ) { 7505fprintf (fp ," | <g>%s\"; ]\n" ,GGML_OP_SYMBOL [node -> grad -> op ]); 7506 }else { 7507fprintf (fp ,"\"; ]\n" ); 7508 } 7509 } 7510 7511for (int i = 0 ;i < gb -> n_leafs ;i ++ ) { 7512struct ggml_tensor * node = gb -> leafs [i ]; 7513 7514snprintf (color ,sizeof (color ),"pink" ); 7515 7516if (ggml_nelements (node )== 1 ) { 7517fprintf (fp ," \"%p\" [ \ 7518style = filled; fillcolor = %s; shape = record; \ 7519label=\"<x>%.1e\"; ]\n" , 7520 (void * )node ,color ,ggml_get_f32_1d (node ,0 )); 7521 }else { 7522fprintf (fp ," \"%p\" [ \ 7523style = filled; fillcolor = %s; shape = record; \ 7524label=\"<x>CONST %d [%d, %d]\"; ]\n" , 7525 (void * )node ,color , 7526i ,node -> ne [0 ],node -> ne [1 ]); 7527 } 7528 } 7529 7530for (int i = 0 ;i < gb -> n_nodes ;i ++ ) { 7531struct ggml_tensor * node = gb -> nodes [i ]; 7532 7533struct ggml_tensor * parent = ggml_graph_get_parent (gb ,node ); 7534 7535if (node -> src0 ) { 7536struct ggml_tensor * parent0 = ggml_graph_get_parent (gb ,node -> src0 ); 7537 7538fprintf (fp ," \"%p\":%s -> \"%p\":%s [ arrowhead = %s; style = %s; label = \"x\"; ]\n" , 7539parent0 ? (void * )parent0 : (void * )node -> src0 , 7540parent0 ?"g" :"x" , 7541parent ? (void * )parent : (void * )node , 7542parent ?"g" :"x" , 7543parent ?"empty" :"vee" , 7544parent ?"dashed" :"solid" ); 7545 } 7546 7547if (node -> src1 ) { 7548struct ggml_tensor * parent1 = ggml_graph_get_parent (gb ,node -> src1 ); 7549 7550fprintf (fp ," \"%p\":%s -> \"%p\":%s [ arrowhead = %s; style = %s; label = \"y\"; ]\n" , 7551parent1 ? (void * )parent1 : (void * )node -> src1 , 7552parent1 ?"g" :"x" , 7553parent ? (void * )parent : (void * )node , 7554parent ?"g" :"x" , 7555parent ?"empty" :"vee" , 7556parent ?"dashed" :"solid" ); 7557 } 7558 } 7559 7560for (int i = 0 ;i < gb -> n_leafs ;i ++ ) { 7561struct ggml_tensor * node = gb -> leafs [i ]; 7562 7563if (node -> src0 ) { 7564fprintf (fp ," \"%p\":%s -> \"%p\":%s [ label = \"x\"; ]\n" , 7565 (void * )node -> src0 ,"x" , 7566 (void * )node ,"x" ); 7567 } 7568 7569if (node -> src1 ) { 7570fprintf (fp ," \"%p\":%s -> \"%p\":%s [ label = \"y\"; ]\n" , 7571 (void * )node -> src1 ,"x" , 7572 (void * )node ,"x" ); 7573 } 7574 } 7575 7576fprintf (fp ,"}\n" ); 7577 7578fclose (fp ); 7579 7580GGML_PRINT ("%s: dot -Tpng %s -o %s.png && open %s.png\n" ,__func__ ,filename ,filename ,filename ); 7581} 7582 7583//////////////////////////////////////////////////////////////////////////////// 7584 7585static void ggml_opt_set_params (int np ,struct ggml_tensor * const ps [],const float * x ) { 7586int i = 0 ; 7587for (int p = 0 ;p < np ;++ p ) { 7588const int ne = ggml_nelements (ps [p ]) ; 7589// TODO: add function to set tensor from array 7590for (int j = 0 ;j < ne ;++ j ) { 7591ggml_set_f32_1d (ps [p ],j ,x [i ++ ]); 7592 } 7593 } 7594} 7595 7596static void ggml_opt_get_params (int np ,struct ggml_tensor * const ps [],float * x ) { 7597int i = 0 ; 7598for (int p = 0 ;p < np ;++ p ) { 7599const int ne = ggml_nelements (ps [p ]) ; 7600// TODO: add function to get all elements at once 7601for (int j = 0 ;j < ne ;++ j ) { 7602x [i ++ ]= ggml_get_f32_1d (ps [p ],j ); 7603 } 7604 } 7605} 7606 7607static void ggml_opt_get_grad (int np ,struct ggml_tensor * const ps [],float * g ) { 7608int i = 0 ; 7609for (int p = 0 ;p < np ;++ p ) { 7610const int ne = ggml_nelements (ps [p ]) ; 7611// TODO: add function to get all elements at once 7612for (int j = 0 ;j < ne ;++ j ) { 7613g [i ++ ]= ggml_get_f32_1d (ps [p ]-> grad ,j ); 7614 } 7615 } 7616} 7617 7618// 7619// ADAM 7620// 7621// ref: https://arxiv.org/pdf/1412.6980.pdf 7622// 7623 7624static enum ggml_opt_result ggml_opt_adam ( 7625struct ggml_context * ctx , 7626struct ggml_opt_params params , 7627struct ggml_tensor * f , 7628struct ggml_cgraph * gf , 7629struct ggml_cgraph * gb ) { 7630assert (ggml_is_scalar (f )); 7631 7632gf -> n_threads = params .n_threads ; 7633gb -> n_threads = params .n_threads ; 7634 7635// these will store the parameters we want to optimize 7636struct ggml_tensor * ps [GGML_MAX_PARAMS ]; 7637 7638int np = 0 ; 7639int nx = 0 ; 7640for (int i = 0 ;i < gf -> n_nodes ;++ i ) { 7641if (gf -> nodes [i ]-> is_param ) { 7642GGML_PRINT_DEBUG ("found param %d: grad->op = %d\n" ,np ,gf -> nodes [i ]-> grad -> op ); 7643 7644assert (np < GGML_MAX_PARAMS ); 7645 7646ps [np ++ ]= gf -> nodes [i ]; 7647nx += ggml_nelements (gf -> nodes [i ]); 7648 } 7649 } 7650 7651// constants 7652const float alpha = params .adam .alpha ; 7653const float beta1 = params .adam .beta1 ; 7654const float beta2 = params .adam .beta2 ; 7655const float eps = params .adam .eps ; 7656 7657float * x = ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,nx )-> data ;// view of the parameters 7658float * g1 = ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,nx )-> data ;// gradient 7659float * g2 = ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,nx )-> data ;// gradient squared 7660float * m = ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,nx )-> data ;// first moment 7661float * v = ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,nx )-> data ;// second moment 7662float * mh = ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,nx )-> data ;// first moment hat 7663float * vh = ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,nx )-> data ;// second moment hat 7664 7665float * pf = params .past > 0 ?ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,params .past )-> data :NULL ;// past function values 7666 7667// initialize 7668ggml_vec_set_f32 (nx ,m ,0.0f ); 7669ggml_vec_set_f32 (nx ,v ,0.0f ); 7670 7671// update view 7672ggml_opt_get_params (np ,ps ,x ); 7673 7674// compute the function value 7675ggml_graph_reset (gf ); 7676ggml_set_f32 (f -> grad ,1.0f ); 7677ggml_graph_compute (ctx ,gb ); 7678 7679float fx_prev = ggml_get_f32_1d (f ,0 ); 7680if (pf ) { 7681pf [0 ]= fx_prev ; 7682 } 7683 7684int n_no_improvement = 0 ; 7685float fx_best = fx_prev ; 7686 7687// run the optimizer 7688for (int t = 0 ;t < params .adam .n_iter ;++ t ) { 7689GGML_PRINT_DEBUG ("=== iter %d ===\n" ,t ); 7690 7691GGML_PRINT_DEBUG ("f = %10.6f\n" ,ggml_get_f32_1d (f ,0 )); 7692GGML_PRINT_DEBUG_5 ("df/dx0 = %10.6f\n" ,ggml_get_f32_1d (ps [0 ]-> grad ,0 )); 7693GGML_PRINT_DEBUG_5 ("df/dx1 = %10.6f\n" ,ggml_get_f32_1d (ps [1 ]-> grad ,0 )); 7694 7695for (int i = 0 ;i < np ;++ i ) { 7696GGML_PRINT_DEBUG ("param %d: %10.6f, g = %10.6f\n" ,i , 7697ggml_get_f32_1d (ps [i ],0 ),ggml_get_f32_1d (ps [i ]-> grad ,0 )); 7698 } 7699 7700const int64_t t_start_wall = ggml_time_us (); 7701const int64_t t_start_cpu = ggml_cycles (); 7702UNUSED (t_start_wall ); 7703UNUSED (t_start_cpu ); 7704 7705 { 7706// update the gradient 7707ggml_opt_get_grad (np ,ps ,g1 ); 7708 7709// m_t = beta1*m_t-1 + (1 - beta1)*g_t 7710ggml_vec_scale_f32 (nx ,m ,beta1 ); 7711ggml_vec_mad_f32 (nx ,m ,g1 ,1.0f - beta1 ); 7712 7713// g2 = g1^2 7714ggml_vec_sqr_f32 (nx ,g2 ,g1 ); 7715 7716// v_t = beta2*v_t-1 + (1 - beta2)*g_t^2 7717ggml_vec_scale_f32 (nx ,v ,beta2 ); 7718ggml_vec_mad_f32 (nx ,v ,g2 ,1.0f - beta2 ); 7719 7720// m^hat = m_t / (1 - beta1^t) 7721// v^hat = v_t / (1 - beta2^t) 7722// x_t = x_t-1 - alpha*m^hat/(sqrt(v^hat) + eps) 7723ggml_vec_cpy_f32 (nx ,mh ,m ); 7724ggml_vec_cpy_f32 (nx ,vh ,v ); 7725 7726ggml_vec_scale_f32 (nx ,mh ,alpha /(1.0f - powf (beta1 ,t + 1 ))); 7727ggml_vec_scale_f32 (nx ,vh ,1.0f /(1.0f - powf (beta2 ,t + 1 ))); 7728 7729ggml_vec_sqrt_f32 (nx ,vh ,vh ); 7730ggml_vec_acc1_f32 (nx ,vh ,eps ); 7731 7732ggml_vec_div_f32 (nx ,mh ,mh ,vh ); 7733ggml_vec_sub_f32 (nx ,x ,x ,mh ); 7734 7735// update the parameters 7736ggml_opt_set_params (np ,ps ,x ); 7737 } 7738 7739ggml_graph_reset (gf ); 7740ggml_set_f32 (f -> grad ,1.0f ); 7741ggml_graph_compute (ctx ,gb ); 7742 7743const float fx = ggml_get_f32_1d (f ,0 ); 7744 7745// check convergence 7746if (fabsf (fx - fx_prev )/fx < params .adam .eps_f ) { 7747GGML_PRINT_DEBUG ("converged\n" ); 7748 7749return GGML_OPT_OK ; 7750 } 7751 7752// delta-based convergence test 7753if (pf != NULL ) { 7754// need at least params.past iterations to start checking for convergence 7755if (params .past <=t ) { 7756const float rate = (pf [t %params .past ]- fx )/fx ; 7757 7758if (fabs (rate )< params .delta ) { 7759return GGML_OPT_OK ; 7760 } 7761 } 7762 7763pf [t %params .past ]= fx ; 7764 } 7765 7766// check for improvement 7767if (params .max_no_improvement > 0 ) { 7768if (fx_best > fx ) { 7769fx_best = fx ; 7770n_no_improvement = 0 ; 7771 }else { 7772++ n_no_improvement ; 7773 7774if (n_no_improvement >=params .max_no_improvement ) { 7775return GGML_OPT_OK ; 7776 } 7777 } 7778 } 7779 7780fx_prev = fx ; 7781 7782 { 7783const int64_t t_end_cpu = ggml_cycles (); 7784GGML_PRINT_DEBUG ("time iter: %5.3f s\n" , ((float )(t_end_cpu - t_start_cpu ))/CLOCKS_PER_SEC ); 7785UNUSED (t_end_cpu ); 7786 7787const int64_t t_end_wall = ggml_time_us (); 7788GGML_PRINT_DEBUG ("wall time iter: %5.3f s\n" , (t_end_wall - t_start_wall )/1e6 ); 7789UNUSED (t_end_wall ); 7790 } 7791 } 7792 7793return GGML_OPT_DID_NOT_CONVERGE ; 7794} 7795 7796// 7797// L-BFGS 7798// 7799// the L-BFGS implementation below is based on the following implementation: 7800// 7801// https://github.com/chokkan/liblbfgs 7802// 7803 7804struct ggml_lbfgs_iteration_data { 7805float alpha ; 7806float ys ; 7807float * s ; 7808float * y ; 7809}; 7810 7811static enum ggml_opt_result linesearch_backtracking ( 7812struct ggml_context * ctx , 7813const struct ggml_opt_params * params , 7814int nx , 7815float * x , 7816float * fx , 7817float * g , 7818float * d , 7819float * step , 7820const float * xp , 7821struct ggml_tensor * f , 7822struct ggml_cgraph * gf , 7823struct ggml_cgraph * gb , 7824const int np , 7825struct ggml_tensor * ps []) { 7826int count = 0 ; 7827 7828float width = 0.0f ; 7829float dg = 0.0f ; 7830float finit = 0.0f ; 7831float dginit = 0.0f ; 7832float dgtest = 0.0f ; 7833 7834const float dec = 0.5f ; 7835const float inc = 2.1f ; 7836 7837if (* step <=0. ) { 7838return GGML_LINESEARCH_INVALID_PARAMETERS ; 7839 } 7840 7841// compute the initial gradient in the search direction 7842ggml_vec_dot_f32 (nx ,& dginit ,g ,d ); 7843 7844// make sure that d points to a descent direction 7845if (0 < dginit ) { 7846return GGML_LINESEARCH_FAIL ; 7847 } 7848 7849// initialize local variables 7850finit = * fx ; 7851dgtest = params -> lbfgs .ftol * dginit ; 7852 7853while (true) { 7854ggml_vec_cpy_f32 (nx ,x ,xp ); 7855ggml_vec_mad_f32 (nx ,x ,d ,* step ); 7856 7857// evaluate the function and gradient values 7858 { 7859ggml_opt_set_params (np ,ps ,x ); 7860 7861ggml_graph_reset (gf ); 7862ggml_set_f32 (f -> grad ,1.0f ); 7863ggml_graph_compute (ctx ,gb ); 7864 7865ggml_opt_get_grad (np ,ps ,g ); 7866 7867* fx = ggml_get_f32_1d (f ,0 ); 7868 } 7869 7870++ count ; 7871 7872if (* fx > finit + (* step )* dgtest ) { 7873width = dec ; 7874 }else { 7875// Armijo condition is satisfied 7876if (params -> lbfgs .linesearch == GGML_LINESEARCH_BACKTRACKING_ARMIJO ) { 7877return count ; 7878 } 7879 7880ggml_vec_dot_f32 (nx ,& dg ,g ,d ); 7881 7882// check the Wolfe condition 7883if (dg < params -> lbfgs .wolfe * dginit ) { 7884width = inc ; 7885 }else { 7886if (params -> lbfgs .linesearch == GGML_LINESEARCH_BACKTRACKING_WOLFE ) { 7887// regular Wolfe conditions 7888return count ; 7889 } 7890 7891if (dg > - params -> lbfgs .wolfe * dginit ) { 7892width = dec ; 7893 }else { 7894// strong Wolfe condition (GGML_LINESEARCH_BACKTRACKING_STRONG_WOLFE) 7895return count ; 7896 } 7897return count ; 7898 } 7899 } 7900 7901if (* step < params -> lbfgs .min_step ) { 7902return GGML_LINESEARCH_MINIMUM_STEP ; 7903 } 7904if (* step > params -> lbfgs .max_step ) { 7905return GGML_LINESEARCH_MAXIMUM_STEP ; 7906 } 7907if (params -> lbfgs .max_linesearch <=count ) { 7908return GGML_LINESEARCH_MAXIMUM_ITERATIONS ; 7909 } 7910 7911 (* step ) *=width ; 7912 } 7913 7914return GGML_LINESEARCH_FAIL ; 7915} 7916 7917static enum ggml_opt_result ggml_opt_lbfgs ( 7918struct ggml_context * ctx , 7919struct ggml_opt_params params , 7920struct ggml_tensor * f , 7921struct ggml_cgraph * gf , 7922struct ggml_cgraph * gb ) { 7923if (params .lbfgs .linesearch == GGML_LINESEARCH_BACKTRACKING_WOLFE || 7924params .lbfgs .linesearch == GGML_LINESEARCH_BACKTRACKING_STRONG_WOLFE ) { 7925if (params .lbfgs .wolfe <=params .lbfgs .ftol || 1. <=params .lbfgs .wolfe ) { 7926return GGML_OPT_INVALID_WOLFE ; 7927 } 7928 } 7929 7930gf -> n_threads = params .n_threads ; 7931gb -> n_threads = params .n_threads ; 7932 7933const int m = params .lbfgs .m ; 7934 7935// these will store the parameters we want to optimize 7936struct ggml_tensor * ps [GGML_MAX_PARAMS ]; 7937 7938int np = 0 ; 7939int nx = 0 ; 7940for (int i = 0 ;i < gf -> n_nodes ;++ i ) { 7941if (gf -> nodes [i ]-> is_param ) { 7942GGML_PRINT_DEBUG ("found param %d: grad->op = %d\n" ,np ,gf -> nodes [i ]-> grad -> op ); 7943 7944assert (np < GGML_MAX_PARAMS ); 7945 7946ps [np ++ ]= gf -> nodes [i ]; 7947nx += ggml_nelements (gf -> nodes [i ]); 7948 } 7949 } 7950 7951float * x = ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,nx )-> data ;// current parameters 7952float * xp = ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,nx )-> data ;// previous parameters 7953float * g = ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,nx )-> data ;// current gradient 7954float * gp = ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,nx )-> data ;// previous gradient 7955float * d = ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,nx )-> data ;// search direction 7956 7957float * pf = params .past > 0 ?ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,params .past )-> data :NULL ;// past function values 7958 7959float fx = 0.0f ;// cost function value 7960float xnorm = 0.0f ;// ||x|| 7961float gnorm = 0.0f ;// ||g|| 7962float step = 0.0f ; 7963 7964// initialize x from the graph nodes 7965ggml_opt_get_params (np ,ps ,x ); 7966 7967// the L-BFGS memory 7968struct ggml_lbfgs_iteration_data * lm = alloca (sizeof (struct ggml_lbfgs_iteration_data )* m ); 7969 7970for (int i = 0 ;i < m ;++ i ) { 7971lm [i ].alpha = 0.0f ; 7972lm [i ].ys = 0.0f ; 7973lm [i ].s = ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,nx )-> data ; 7974lm [i ].y = ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,nx )-> data ; 7975 } 7976 7977// evaluate the function value and its gradient 7978 { 7979ggml_opt_set_params (np ,ps ,x ); 7980 7981ggml_graph_reset (gf ); 7982ggml_set_f32 (f -> grad ,1.0f ); 7983ggml_graph_compute (ctx ,gb ); 7984 7985ggml_opt_get_grad (np ,ps ,g ); 7986 7987fx = ggml_get_f32_1d (f ,0 ); 7988 } 7989 7990if (pf ) { 7991pf [0 ]= fx ; 7992 } 7993 7994float fx_best = fx ; 7995 7996// search direction = -gradient 7997ggml_vec_neg_f32 (nx ,d ,g ); 7998 7999// ||x||, ||g|| 8000ggml_vec_norm_f32 (nx ,& xnorm ,x ); 8001ggml_vec_norm_f32 (nx ,& gnorm ,g ); 8002 8003if (xnorm < 1.0f ) { 8004xnorm = 1.0f ; 8005 } 8006 8007// already optimized 8008if (gnorm /xnorm <=params .lbfgs .eps ) { 8009return GGML_OPT_OK ; 8010 } 8011 8012// initial step 8013ggml_vec_norm_inv_f32 (nx ,& step ,d ); 8014 8015int j = 0 ; 8016int k = 1 ; 8017int ls = 0 ; 8018int end = 0 ; 8019int bound = 0 ; 8020int n_no_improvement = 0 ; 8021 8022float ys = 0.0f ; 8023float yy = 0.0f ; 8024float beta = 0.0f ; 8025 8026while (true) { 8027// store the current position and gradient vectors 8028ggml_vec_cpy_f32 (nx ,xp ,x ); 8029ggml_vec_cpy_f32 (nx ,gp ,g ); 8030 8031ls = linesearch_backtracking (ctx ,& params ,nx ,x ,& fx ,g ,d ,& step ,xp ,f ,gf ,gb ,np ,ps ); 8032 8033if (ls < 0 ) { 8034// linesearch failed - go back to the previous point and return 8035ggml_vec_cpy_f32 (nx ,x ,xp ); 8036ggml_vec_cpy_f32 (nx ,g ,gp ); 8037 8038return ls ; 8039 } 8040 8041ggml_vec_norm_f32 (nx ,& xnorm ,x ); 8042ggml_vec_norm_f32 (nx ,& gnorm ,g ); 8043 8044GGML_PRINT_DEBUG ("f = %10.6f\n" ,ggml_get_f32_1d (f ,0 )); 8045 8046if (xnorm < 1.0 ) { 8047xnorm = 1.0 ; 8048 } 8049if (gnorm /xnorm <=params .lbfgs .eps ) { 8050// converged 8051return GGML_OPT_OK ; 8052 } 8053 8054// delta-based convergence test 8055if (pf != NULL ) { 8056// need at least params.past iterations to start checking for convergence 8057if (params .past <=k ) { 8058const float rate = (pf [k %params .past ]- fx )/fx ; 8059 8060if (fabs (rate )< params .delta ) { 8061return GGML_OPT_OK ; 8062 } 8063 } 8064 8065pf [k %params .past ]= fx ; 8066 } 8067 8068// check for improvement 8069if (params .max_no_improvement > 0 ) { 8070if (fx < fx_best ) { 8071fx_best = fx ; 8072n_no_improvement = 0 ; 8073 }else { 8074n_no_improvement ++ ; 8075 8076if (n_no_improvement >=params .max_no_improvement ) { 8077return GGML_OPT_OK ; 8078 } 8079 } 8080 } 8081 8082if (params .lbfgs .n_iter != 0 && params .lbfgs .n_iter < k + 1 ) { 8083// reached the maximum number of iterations 8084return GGML_OPT_DID_NOT_CONVERGE ; 8085 } 8086 8087// update vectors s and y: 8088// s_{k+1} = x_{k+1} - x_{k} = \step * d_{k}. 8089// y_{k+1} = g_{k+1} - g_{k}. 8090// 8091ggml_vec_sub_f32 (nx ,lm [end ].s ,x ,xp ); 8092ggml_vec_sub_f32 (nx ,lm [end ].y ,g ,gp ); 8093 8094// compute scalars ys and yy: 8095// ys = y^t \cdot s -> 1 / \rho. 8096// yy = y^t \cdot y. 8097// 8098ggml_vec_dot_f32 (nx ,& ys ,lm [end ].y ,lm [end ].s ); 8099ggml_vec_dot_f32 (nx ,& yy ,lm [end ].y ,lm [end ].y ); 8100 8101lm [end ].ys = ys ; 8102 8103// find new search direction 8104// ref: https://en.wikipedia.org/wiki/Limited-memory_BFGS 8105 8106bound = (m <=k ) ?m :k ; 8107k ++ ; 8108end = (end + 1 )%m ; 8109 8110// initialize search direction with -g 8111ggml_vec_neg_f32 (nx ,d ,g ); 8112 8113j = end ; 8114for (int i = 0 ;i < bound ;++ i ) { 8115j = (j + m - 1 ) %m ; 8116// \alpha_{j} = \rho_{j} s^{t}_{j} \cdot q_{k+1} 8117ggml_vec_dot_f32 (nx ,& lm [j ].alpha ,lm [j ].s ,d ); 8118lm [j ].alpha /=lm [j ].ys ; 8119// q_{i} = q_{i+1} - \alpha_{i} y_{i} 8120ggml_vec_mad_f32 (nx ,d ,lm [j ].y ,- lm [j ].alpha ); 8121 } 8122 8123ggml_vec_scale_f32 (nx ,d ,ys /yy ); 8124 8125for (int i = 0 ;i < bound ;++ i ) { 8126// \beta_{j} = \rho_{j} y^t_{j} \cdot \gamma_{i} 8127ggml_vec_dot_f32 (nx ,& beta ,lm [j ].y ,d ); 8128beta /=lm [j ].ys ; 8129// \gamma_{i+1} = \gamma_{i} + (\alpha_{j} - \beta_{j}) s_{j} 8130ggml_vec_mad_f32 (nx ,d ,lm [j ].s ,lm [j ].alpha - beta ); 8131j = (j + 1 )%m ; 8132 } 8133 8134step = 1.0 ; 8135 } 8136 8137return GGML_OPT_DID_NOT_CONVERGE ; 8138} 8139 8140struct ggml_opt_params ggml_opt_default_params (enum ggml_opt_type type ) { 8141struct ggml_opt_params result ; 8142 8143switch (type ) { 8144case GGML_OPT_ADAM : 8145 { 8146result = (struct ggml_opt_params ) { 8147 .type = GGML_OPT_ADAM , 8148 .n_threads = 1 , 8149 .past = 0 , 8150 .delta = 1e-5f , 8151 8152 .max_no_improvement = 100 , 8153 8154 .print_forward_graph = true, 8155 .print_backward_graph = true, 8156 8157 .adam = { 8158 .n_iter = 10000 , 8159 .alpha = 0.001f , 8160 .beta1 = 0.9f , 8161 .beta2 = 0.999f , 8162 .eps = 1e-8f , 8163 .eps_f = 1e-5f , 8164 .eps_g = 1e-3f , 8165 }, 8166 }; 8167 }break ; 8168case GGML_OPT_LBFGS : 8169 { 8170result = (struct ggml_opt_params ) { 8171 .type = GGML_OPT_LBFGS , 8172 .n_threads = 1 , 8173 .past = 0 , 8174 .delta = 1e-5f , 8175 8176 .max_no_improvement = 0 , 8177 8178 .print_forward_graph = true, 8179 .print_backward_graph = true, 8180 8181 .lbfgs = { 8182 .m = 6 , 8183 .n_iter = 100 , 8184 .max_linesearch = 20 , 8185 8186 .eps = 1e-5f , 8187 .ftol = 1e-4f , 8188 .wolfe = 0.9f , 8189 .min_step = 1e-20f , 8190 .max_step = 1e+20f , 8191 8192 .linesearch = GGML_LINESEARCH_DEFAULT , 8193 }, 8194 }; 8195 }break ; 8196 } 8197 8198return result ; 8199} 8200 8201enum ggml_opt_result ggml_opt ( 8202struct ggml_context * ctx , 8203struct ggml_opt_params params , 8204struct ggml_tensor * f ) { 8205bool free_ctx = false; 8206if (ctx == NULL ) { 8207struct ggml_init_params params_ctx = { 8208 .mem_size = 16 * 1024 * 1024 , 8209 .mem_buffer = NULL , 8210 }; 8211 8212ctx = ggml_init (params_ctx ); 8213if (ctx == NULL ) { 8214return GGML_OPT_NO_CONTEXT ; 8215 } 8216 8217free_ctx = true; 8218 } 8219 8220enum ggml_opt_result result = GGML_OPT_OK ; 8221 8222// build forward + backward compute graphs 8223struct ggml_cgraph gf = ggml_build_forward (f ); 8224struct ggml_cgraph gb = ggml_build_backward (ctx ,& gf , false); 8225 8226switch (params .type ) { 8227case GGML_OPT_ADAM : 8228 { 8229result = ggml_opt_adam (ctx ,params ,f ,& gf ,& gb ); 8230 }break ; 8231case GGML_OPT_LBFGS : 8232 { 8233result = ggml_opt_lbfgs (ctx ,params ,f ,& gf ,& gb ); 8234 }break ; 8235 } 8236 8237if (params .print_forward_graph ) { 8238ggml_graph_print (& gf ); 8239ggml_graph_dump_dot (& gf ,NULL ,"opt-forward.dot" ); 8240 } 8241 8242if (params .print_backward_graph ) { 8243ggml_graph_print (& gb ); 8244ggml_graph_dump_dot (& gb ,& gf ,"opt-backward.dot" ); 8245 } 8246 8247if (free_ctx ) { 8248ggml_free (ctx ); 8249 } 8250 8251return result ; 8252} 8253 8254//////////////////////////////////////////////////////////////////////////////// 8255 8256int ggml_cpu_has_avx (void ) { 8257#if defined(__AVX__ ) 8258return 1 ; 8259#else 8260return 0 ; 8261#endif 8262} 8263 8264int ggml_cpu_has_avx2 (void ) { 8265#if defined(__AVX2__ ) 8266return 1 ; 8267#else 8268return 0 ; 8269#endif 8270} 8271 8272int ggml_cpu_has_avx512 (void ) { 8273#if defined(__AVX512F__ ) 8274return 1 ; 8275#else 8276return 0 ; 8277#endif 8278} 8279 8280int ggml_cpu_has_fma (void ) { 8281#if defined(__FMA__ ) 8282return 1 ; 8283#else 8284return 0 ; 8285#endif 8286} 8287 8288int ggml_cpu_has_neon (void ) { 8289#if defined(__ARM_NEON ) 8290return 1 ; 8291#else 8292return 0 ; 8293#endif 8294} 8295 8296int ggml_cpu_has_arm_fma (void ) { 8297#if defined(__ARM_FEATURE_FMA ) 8298return 1 ; 8299#else 8300return 0 ; 8301#endif 8302} 8303 8304int ggml_cpu_has_f16c (void ) { 8305#if defined(__F16C__ ) 8306return 1 ; 8307#else 8308return 0 ; 8309#endif 8310} 8311 8312int ggml_cpu_has_fp16_va (void ) { 8313#if defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC ) 8314return 1 ; 8315#else 8316return 0 ; 8317#endif 8318} 8319 8320int ggml_cpu_has_wasm_simd (void ) { 8321#if defined(__wasm_simd128__ ) 8322return 1 ; 8323#else 8324return 0 ; 8325#endif 8326} 8327 8328int ggml_cpu_has_blas (void ) { 8329#if defined(GGML_USE_ACCELERATE )|| defined(GGML_USE_OPENBLAS ) 8330return 1 ; 8331#else 8332return 0 ; 8333#endif 8334} 8335 8336////////////////////////////////////////////////////////////////////////////////