char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
5a6caa05f
char/aliceai-t5-moe
1#define _CRT_SECURE_NO_DEPRECATE // Disables "unsafe" warnings on Windows 2#define _USE_MATH_DEFINES // For M_PI on MSVC 3 4#include "ggml-version.h" 5#include "ggml-backend.h" 6#include "ggml-impl.h" 7#include "ggml-threading.h" 8#include "ggml-cpu.h" 9#include "ggml.h" 10 11// FIXME: required here for quantization functions 12#include "ggml-quants.h" 13 14#ifdef GGML_USE_CPU_HBM 15#include <hbwmalloc.h> 16#endif 17 18#if defined(_MSC_VER )|| defined(__MINGW32__ ) 19#include <malloc.h> // using malloc.h with MSC/MINGW 20#elif !defined(__FreeBSD__ )&& !defined(__NetBSD__ )&& !defined(__OpenBSD__ ) 21#include <alloca.h> 22#endif 23 24#include <assert.h> 25#include <errno.h> 26#include <time.h> 27#include <math.h> 28#include <stdlib.h> 29#include <string.h> 30#include <stdint.h> 31#include <inttypes.h> 32#include <stdio.h> 33#include <float.h> 34#include <limits.h> 35#include <stdarg.h> 36#include <signal.h> 37#if defined(__gnu_linux__ ) 38#include <syscall.h> 39#endif 40 41#if defined(__APPLE__ ) 42#include <unistd.h> 43#include <mach/mach.h> 44#include <TargetConditionals.h> 45#endif 46 47#if defined(_WIN32 ) 48#define WIN32_LEAN_AND_MEAN 49#ifndef NOMINMAX 50#define NOMINMAX 51#endif 52#include <windows.h> 53#endif 54 55#define UNUSED GGML_UNUSED 56 57uint64_t ggml_graph_next_uid (void ) { 58#ifdef _MSC_VER 59#if defined(_WIN32 ) 60static volatile LONG counter = 1 ; 61return (uint64_t )InterlockedIncrement (& counter )- 1 ; 62#else 63static volatile long long counter = 1 ; 64return (uint64_t )_InterlockedIncrement64 (& counter )- 1 ; 65#endif 66#else 67static uint64_t counter = 1 ; 68return __atomic_fetch_add (& counter ,1 ,__ATOMIC_RELAXED ); 69#endif 70} 71 72// Needed for ggml_fp32_to_bf16_row() 73#if defined(__AVX512BF16__ ) 74#if defined(_MSC_VER ) 75#define m512i (p ) p 76#else 77#include <immintrin.h> 78#define m512i (p ) (__m512i)(p) 79#endif // defined(_MSC_VER) 80#endif // defined(__AVX512BF16__) 81 82#if defined(__linux__ )|| \ 83 defined(__FreeBSD__ )|| defined(__NetBSD__ )|| defined(__OpenBSD__ )|| \ 84 (defined(__APPLE__ )&& !TARGET_OS_TV && !TARGET_OS_WATCH ) 85 86#include <unistd.h> 87#include <sys/types.h> 88#include <sys/stat.h> 89#include <sys/wait.h> 90#if defined(__linux__ ) 91#include <sys/prctl.h> 92#endif 93 94#if defined(__ANDROID__ ) 95#include <unwind.h> 96#include <dlfcn.h> 97#include <stdio.h> 98 99struct backtrace_state { 100void ** current ; 101void ** end ; 102}; 103 104static _Unwind_Reason_Code unwind_callback (struct _Unwind_Context * context ,void * arg ) { 105struct backtrace_state * state = (struct backtrace_state * )arg ; 106uintptr_t pc = _Unwind_GetIP (context ); 107if (pc ) { 108if (state -> current == state -> end ) { 109return _URC_END_OF_STACK ; 110 }else { 111* state -> current ++ = (void * )pc ; 112 } 113 } 114return _URC_NO_REASON ; 115} 116 117static void ggml_print_backtrace_symbols (void ) { 118const int max = 100 ; 119void * buffer [max ]; 120 121struct backtrace_state state = {buffer ,buffer + max }; 122_Unwind_Backtrace (unwind_callback ,& state ); 123 124int count = state .current - buffer ; 125 126for (int idx = 0 ;idx < count ;++ idx ) { 127const void * addr = buffer [idx ]; 128const char * symbol = "" ; 129 130Dl_info info ; 131if (dladdr (addr ,& info )&& info .dli_sname ) { 132symbol = info .dli_sname ; 133 } 134 135fprintf (stderr ,"%d: %p %s\n" ,idx ,addr ,symbol ); 136 } 137} 138#elif defined(__linux__ )&& defined(__GLIBC__ ) 139#include <execinfo.h> 140static void ggml_print_backtrace_symbols (void ) { 141void * trace [100 ]; 142int nptrs = backtrace (trace ,sizeof (trace )/sizeof (trace [0 ])); 143backtrace_symbols_fd (trace ,nptrs ,STDERR_FILENO ); 144} 145#elif defined(__APPLE__ ) 146#include <execinfo.h> 147static void ggml_print_backtrace_symbols (void ) { 148void * trace [100 ]; 149int nptrs = backtrace (trace ,sizeof (trace )/sizeof (trace [0 ])); 150backtrace_symbols_fd (trace ,nptrs ,STDERR_FILENO ); 151} 152#else 153static void ggml_print_backtrace_symbols (void ) { 154// platform not supported 155} 156#endif 157 158void ggml_print_backtrace (void ) { 159const char * GGML_NO_BACKTRACE = getenv ("GGML_NO_BACKTRACE" ); 160if (GGML_NO_BACKTRACE ) { 161return ; 162 } 163#if defined(__APPLE__ ) 164// On macOS, fork+debugger attachment is problematic due to: 165// 1. libdispatch "poisons" forked child processes 166// 2. lldb has issues attaching to parent from forked child 167// Use simple backtrace() instead to avoid Terminal.app crashes 168const char * GGML_BACKTRACE_LLDB = getenv ("GGML_BACKTRACE_LLDB" ); 169if (!GGML_BACKTRACE_LLDB ) { 170fprintf (stderr ,"WARNING: Using native backtrace. Set GGML_BACKTRACE_LLDB for more info.\n" ); 171fprintf (stderr ,"WARNING: GGML_BACKTRACE_LLDB may cause native MacOS Terminal.app to crash.\n" ); 172fprintf (stderr ,"See: https://github.com/ggml-org/llama.cpp/pull/17869\n" ); 173ggml_print_backtrace_symbols (); 174return ; 175 } 176#endif 177#if defined(__linux__ ) 178FILE * f = fopen ("/proc/self/status" ,"r" ); 179size_t size = 0 ; 180char * line = NULL ; 181ssize_t length = 0 ; 182while ((length = getline (& line ,& size ,f ))> 0 ) { 183if (!strncmp (line ,"TracerPid:" ,sizeof ("TracerPid:" )- 1 )&& 184 (length != sizeof ("TracerPid:\t0\n" )- 1 || line [length - 2 ]!= '0' )) { 185// Already being debugged, and the breakpoint is the later abort() 186free (line ); 187fclose (f ); 188return ; 189 } 190 } 191free (line ); 192fclose (f ); 193int lock [2 ]= {-1 ,-1 }; 194 (void ) !pipe (lock );// Don't start gdb until after PR_SET_PTRACER 195#endif 196const int parent_pid = getpid (); 197const int child_pid = fork (); 198if (child_pid < 0 ) {// error 199#if defined(__linux__ ) 200close (lock [1 ]); 201close (lock [0 ]); 202#endif 203return ; 204 }else if (child_pid == 0 ) {// child 205char attach [32 ]; 206snprintf (attach ,sizeof (attach ),"attach %d" ,parent_pid ); 207#if defined(__linux__ ) 208close (lock [1 ]); 209 (void ) !read (lock [0 ],lock ,1 ); 210close (lock [0 ]); 211#endif 212// try gdb 213execlp ("gdb" ,"gdb" ,"--batch" , 214"-ex" ,"set style enabled on" , 215"-ex" ,attach , 216"-ex" ,"bt -frame-info source-and-location" , 217"-ex" ,"detach" , 218"-ex" ,"quit" , 219 (char * )NULL ); 220// try lldb 221execlp ("lldb" ,"lldb" ,"--batch" , 222"-o" ,"bt" , 223"-o" ,"quit" , 224"-p" ,& attach [sizeof ("attach " )- 1 ], 225 (char * )NULL ); 226// gdb failed, fallback to backtrace_symbols 227ggml_print_backtrace_symbols (); 228_Exit (0 ); 229 }else {// parent 230#if defined(__linux__ ) 231prctl (PR_SET_PTRACER ,child_pid ); 232close (lock [1 ]); 233close (lock [0 ]); 234#endif 235waitpid (child_pid ,NULL ,0 ); 236 } 237} 238#else 239void ggml_print_backtrace (void ) { 240// platform not supported 241} 242#endif 243 244static ggml_abort_callback_t g_abort_callback = NULL ; 245 246// Set the abort callback (passing null will restore original abort functionality: printing a message to stdout) 247GGML_API ggml_abort_callback_t ggml_set_abort_callback (ggml_abort_callback_t callback ) { 248ggml_abort_callback_t ret_val = g_abort_callback ; 249g_abort_callback = callback ; 250return ret_val ; 251} 252 253void ggml_abort (const char * file ,int line ,const char * fmt , ...) { 254fflush (stdout ); 255 256char message [2048 ]; 257int offset = snprintf (message ,sizeof (message ),"%s:%d: " ,file ,line ); 258 259va_list args ; 260va_start (args ,fmt ); 261vsnprintf (message + offset ,sizeof (message )- offset ,fmt ,args ); 262va_end (args ); 263 264if (g_abort_callback ) { 265g_abort_callback (message ); 266 }else { 267// default: print error and backtrace to stderr 268fprintf (stderr ,"%s\n" ,message ); 269ggml_print_backtrace (); 270 } 271 272abort (); 273} 274 275// ggml_print_backtrace is registered with std::set_terminate by ggml.cpp 276 277// 278// logging 279// 280 281struct ggml_logger_state { 282ggml_log_callback log_callback ; 283void * log_callback_user_data ; 284}; 285static struct ggml_logger_state g_logger_state = {ggml_log_callback_default ,NULL }; 286 287static void ggml_log_internal_v (enum ggml_log_level level ,const char * format ,va_list args ) { 288if (format == NULL ) { 289return ; 290 } 291va_list args_copy ; 292va_copy (args_copy ,args ); 293char buffer [128 ]; 294int len = vsnprintf (buffer ,128 ,format ,args ); 295if (len < 128 ) { 296g_logger_state .log_callback (level ,buffer ,g_logger_state .log_callback_user_data ); 297 }else { 298char * buffer2 = (char * )calloc (len + 1 ,sizeof (char )); 299vsnprintf (buffer2 ,len + 1 ,format ,args_copy ); 300buffer2 [len ]= 0 ; 301g_logger_state .log_callback (level ,buffer2 ,g_logger_state .log_callback_user_data ); 302free (buffer2 ); 303 } 304va_end (args_copy ); 305} 306 307void ggml_log_internal (enum ggml_log_level level ,const char * format , ...) { 308va_list args ; 309va_start (args ,format ); 310ggml_log_internal_v (level ,format ,args ); 311va_end (args ); 312} 313 314void ggml_log_callback_default (enum ggml_log_level level ,const char * text ,void * user_data ) { 315 (void )level ; 316 (void )user_data ; 317fputs (text ,stderr ); 318fflush (stderr ); 319} 320 321// 322// end of logging block 323// 324 325#ifdef GGML_USE_ACCELERATE 326// uncomment to use vDSP for soft max computation 327// note: not sure if it is actually faster 328//#define GGML_SOFT_MAX_ACCELERATE 329#endif 330 331 332void * ggml_aligned_malloc (size_t size ) { 333#if defined(__s390x__ ) 334const int alignment = 256 ; 335#else 336const int alignment = 64 ; 337#endif 338 339#if defined(_MSC_VER )|| defined(__MINGW32__ ) 340return _aligned_malloc (size ,alignment ); 341#else 342if (size == 0 ) { 343GGML_LOG_WARN ("Behavior may be unexpected when allocating 0 bytes for ggml_aligned_malloc!\n" ); 344return NULL ; 345 } 346void * aligned_memory = NULL ; 347#ifdef GGML_USE_CPU_HBM 348int result = hbw_posix_memalign (& aligned_memory ,alignment ,size ); 349#elif TARGET_OS_OSX 350GGML_UNUSED (alignment ); 351kern_return_t alloc_status = vm_allocate ((vm_map_t )mach_task_self (), (vm_address_t * )& aligned_memory ,size ,VM_FLAGS_ANYWHERE ); 352int result = EFAULT ; 353switch (alloc_status ) { 354case KERN_SUCCESS : 355result = 0 ; 356break ; 357case KERN_INVALID_ADDRESS : 358result = EINVAL ; 359break ; 360case KERN_NO_SPACE : 361result = ENOMEM ; 362break ; 363default : 364result = EFAULT ; 365break ; 366 } 367#else 368int result = posix_memalign (& aligned_memory ,alignment ,size ); 369#endif 370if (result != 0 ) { 371// Handle allocation failure 372const char * error_desc = "unknown allocation error" ; 373switch (result ) { 374case EINVAL : 375error_desc = "invalid alignment value" ; 376break ; 377case ENOMEM : 378error_desc = "insufficient memory" ; 379break ; 380 } 381GGML_LOG_ERROR ("%s: %s (attempted to allocate %6.2f MB)\n" ,__func__ ,error_desc ,size /(1024.0 * 1024.0 )); 382return NULL ; 383 } 384return aligned_memory ; 385#endif 386} 387 388void ggml_aligned_free (void * ptr ,size_t size ) { 389GGML_UNUSED (size ); 390#if defined(_MSC_VER )|| defined(__MINGW32__ ) 391_aligned_free (ptr ); 392#elif GGML_USE_CPU_HBM 393if (ptr != NULL ) { 394hbw_free (ptr ); 395 } 396#elif TARGET_OS_OSX 397if (ptr != NULL ) { 398vm_deallocate ((vm_map_t )mach_task_self (), (vm_address_t )ptr ,size ); 399 } 400#else 401free (ptr ); 402#endif 403} 404 405 406inline static void * ggml_malloc (size_t size ) { 407if (size == 0 ) { 408GGML_LOG_WARN ("Behavior may be unexpected when allocating 0 bytes for ggml_malloc!\n" ); 409return NULL ; 410 } 411void * result = malloc (size ); 412if (result == NULL ) { 413GGML_LOG_ERROR ("%s: failed to allocate %6.2f MB\n" ,__func__ ,size /(1024.0 * 1024.0 )); 414GGML_ABORT ("fatal error" ); 415 } 416return result ; 417} 418 419// calloc 420inline static void * ggml_calloc (size_t num ,size_t size ) { 421if (num == 0 || size == 0 ) { 422GGML_LOG_WARN ("Behavior may be unexpected when allocating 0 bytes for ggml_calloc!\n" ); 423return NULL ; 424 } 425void * result = calloc (num ,size ); 426if (result == NULL ) { 427GGML_LOG_ERROR ("%s: failed to allocate %6.2f MB\n" ,__func__ ,size /(1024.0 * 1024.0 )); 428GGML_ABORT ("fatal error" ); 429 } 430return result ; 431} 432 433#define GGML_MALLOC (size ) ggml_malloc(size) 434#define GGML_CALLOC (num ,size ) ggml_calloc(num, size) 435 436#define GGML_FREE (ptr ) free(ptr) 437 438const char * ggml_status_to_string (enum ggml_status status ) { 439switch (status ) { 440case GGML_STATUS_ALLOC_FAILED :return "GGML status: error (failed to allocate memory)" ; 441case GGML_STATUS_FAILED :return "GGML status: error (operation failed)" ; 442case GGML_STATUS_SUCCESS :return "GGML status: success" ; 443case GGML_STATUS_ABORTED :return "GGML status: warning (operation aborted)" ; 444 } 445 446return "GGML status: unknown" ; 447} 448 449float ggml_fp16_to_fp32 (ggml_fp16_t x ) { 450#define ggml_fp16_to_fp32 do_not_use__ggml_fp16_to_fp32__in_ggml 451return GGML_FP16_TO_FP32 (x ); 452} 453 454ggml_fp16_t ggml_fp32_to_fp16 (float x ) { 455#define ggml_fp32_to_fp16 do_not_use__ggml_fp32_to_fp16__in_ggml 456return GGML_FP32_TO_FP16 (x ); 457} 458 459float ggml_bf16_to_fp32 (ggml_bf16_t x ) { 460#define ggml_bf16_to_fp32 do_not_use__ggml_bf16_to_fp32__in_ggml 461return GGML_BF16_TO_FP32 (x );// it just left shifts 462} 463 464ggml_bf16_t ggml_fp32_to_bf16 (float x ) { 465#define ggml_fp32_to_bf16 do_not_use__ggml_fp32_to_bf16__in_ggml 466return GGML_FP32_TO_BF16 (x ); 467} 468 469void ggml_fp16_to_fp32_row (const ggml_fp16_t * x ,float * y ,int64_t n ) { 470for (int64_t i = 0 ;i < n ;i ++ ) { 471y [i ]= GGML_FP16_TO_FP32 (x [i ]); 472 } 473} 474 475void ggml_fp32_to_fp16_row (const float * x ,ggml_fp16_t * y ,int64_t n ) { 476int i = 0 ; 477for (;i < n ;++ i ) { 478y [i ]= GGML_FP32_TO_FP16 (x [i ]); 479 } 480} 481 482void ggml_bf16_to_fp32_row (const ggml_bf16_t * x ,float * y ,int64_t n ) { 483int i = 0 ; 484for (;i < n ;++ i ) { 485y [i ]= GGML_BF16_TO_FP32 (x [i ]); 486 } 487} 488 489void ggml_fp32_to_bf16_row_ref (const float * x ,ggml_bf16_t * y ,int64_t n ) { 490for (int i = 0 ;i < n ;i ++ ) { 491y [i ]= ggml_compute_fp32_to_bf16 (x [i ]); 492 } 493} 494 495void ggml_fp32_to_bf16_row (const float * x ,ggml_bf16_t * y ,int64_t n ) { 496int i = 0 ; 497#if defined(__AVX512BF16__ ) 498// subnormals are flushed to zero on this platform 499for (;i + 32 <=n ;i += 32 ) { 500_mm512_storeu_si512 ( 501 (__m512i * )(y + i ), 502m512i (_mm512_cvtne2ps_pbh (_mm512_loadu_ps (x + i + 16 ), 503_mm512_loadu_ps (x + i )))); 504 } 505#endif 506for (;i < n ;i ++ ) { 507y [i ]= GGML_FP32_TO_BF16 (x [i ]); 508 } 509} 510 511bool ggml_guid_matches (ggml_guid_t guid_a ,ggml_guid_t guid_b ) { 512return memcmp (guid_a ,guid_b ,sizeof (ggml_guid ))== 0 ; 513} 514 515const char * ggml_version (void ) { 516return GGML_VERSION ; 517} 518 519const char * ggml_commit (void ) { 520return GGML_COMMIT ; 521} 522 523// 524// timing 525// 526 527#if defined(_MSC_VER )|| defined(__MINGW32__ ) 528static int64_t timer_freq ,timer_start ; 529static BOOL CALLBACK ggml_time_init_once (PINIT_ONCE once ,PVOID param ,PVOID * ctx ) { 530UNUSED (once ); 531UNUSED (param ); 532UNUSED (ctx ); 533 534LARGE_INTEGER t ; 535QueryPerformanceFrequency (& t ); 536timer_freq = t .QuadPart ; 537 538// The multiplication by 1000 or 1000000 below can cause an overflow if timer_freq 539// and the uptime is high enough. 540// We subtract the program start time to reduce the likelihood of that happening. 541QueryPerformanceCounter (& t ); 542timer_start = t .QuadPart ; 543 544return TRUE; 545} 546void ggml_time_init (void ) { 547static INIT_ONCE once = INIT_ONCE_STATIC_INIT ; 548InitOnceExecuteOnce (& once ,ggml_time_init_once ,NULL ,NULL ); 549} 550int64_t ggml_time_ms (void ) { 551LARGE_INTEGER t ; 552QueryPerformanceCounter (& t ); 553return ((t .QuadPart - timer_start )* 1000 ) /timer_freq ; 554} 555int64_t ggml_time_us (void ) { 556LARGE_INTEGER t ; 557QueryPerformanceCounter (& t ); 558return ((t .QuadPart - timer_start )* 1000000 ) /timer_freq ; 559} 560#else 561void ggml_time_init (void ) {} 562int64_t ggml_time_ms (void ) { 563struct timespec ts ; 564clock_gettime (CLOCK_MONOTONIC ,& ts ); 565return (int64_t )ts .tv_sec * 1000 + (int64_t )ts .tv_nsec /1000000 ; 566} 567 568int64_t ggml_time_us (void ) { 569struct timespec ts ; 570clock_gettime (CLOCK_MONOTONIC ,& ts ); 571return (int64_t )ts .tv_sec * 1000000 + (int64_t )ts .tv_nsec /1000 ; 572} 573#endif 574 575int64_t ggml_cycles (void ) { 576return clock (); 577} 578 579int64_t ggml_cycles_per_ms (void ) { 580return CLOCKS_PER_SEC /1000 ; 581} 582 583// 584// cross-platform UTF-8 file paths 585// 586 587#ifdef _WIN32 588static wchar_t * ggml_mbstowcs (const char * mbs ) { 589int wlen = MultiByteToWideChar (CP_UTF8 ,0 ,mbs ,-1 ,NULL ,0 ); 590if (!wlen ) { 591errno = EINVAL ; 592return NULL ; 593 } 594 595wchar_t * wbuf = GGML_MALLOC (wlen * sizeof (wchar_t )); 596wlen = MultiByteToWideChar (CP_UTF8 ,0 ,mbs ,-1 ,wbuf ,wlen ); 597if (!wlen ) { 598GGML_FREE (wbuf ); 599errno = EINVAL ; 600return NULL ; 601 } 602 603return wbuf ; 604} 605#endif 606 607FILE * ggml_fopen (const char * fname ,const char * mode ) { 608#ifdef _WIN32 609FILE * file = NULL ; 610 611// convert fname (UTF-8) 612wchar_t * wfname = ggml_mbstowcs (fname ); 613if (wfname ) { 614// convert mode (UTF-8) 615wchar_t * wmode = ggml_mbstowcs (mode ); 616if (wmode ) { 617// open file 618file = _wfopen (wfname ,wmode ); 619GGML_FREE (wmode ); 620 } 621 622GGML_FREE (wfname ); 623 } 624 625return file ; 626#else 627return fopen (fname ,mode ); 628#endif 629 630} 631 632static const struct ggml_type_traits type_traits [GGML_TYPE_COUNT ]= { 633 [GGML_TYPE_I8 ]= { 634 .type_name = "i8" , 635 .blck_size = 1 , 636 .type_size = sizeof (int8_t ), 637 .is_quantized = false, 638 }, 639 [GGML_TYPE_I16 ]= { 640 .type_name = "i16" , 641 .blck_size = 1 , 642 .type_size = sizeof (int16_t ), 643 .is_quantized = false, 644 }, 645 [GGML_TYPE_I32 ]= { 646 .type_name = "i32" , 647 .blck_size = 1 , 648 .type_size = sizeof (int32_t ), 649 .is_quantized = false, 650 }, 651 [GGML_TYPE_I64 ]= { 652 .type_name = "i64" , 653 .blck_size = 1 , 654 .type_size = sizeof (int64_t ), 655 .is_quantized = false, 656 }, 657 [GGML_TYPE_F64 ]= { 658 .type_name = "f64" , 659 .blck_size = 1 , 660 .type_size = sizeof (double ), 661 .is_quantized = false, 662 }, 663 [GGML_TYPE_F32 ]= { 664 .type_name = "f32" , 665 .blck_size = 1 , 666 .type_size = sizeof (float ), 667 .is_quantized = false, 668 }, 669 [GGML_TYPE_F16 ]= { 670 .type_name = "f16" , 671 .blck_size = 1 , 672 .type_size = sizeof (ggml_fp16_t ), 673 .is_quantized = false, 674 .to_float = (ggml_to_float_t )ggml_fp16_to_fp32_row , 675 .from_float_ref = (ggml_from_float_t )ggml_fp32_to_fp16_row , 676 }, 677 [GGML_TYPE_Q1_0 ]= { 678 .type_name = "q1_0" , 679 .blck_size = QK1_0 , 680 .type_size = sizeof (block_q1_0 ), 681 .is_quantized = true, 682 .to_float = (ggml_to_float_t )dequantize_row_q1_0 , 683 .from_float_ref = (ggml_from_float_t )quantize_row_q1_0_ref , 684 }, 685 [GGML_TYPE_Q2_0 ]= { 686 .type_name = "q2_0" , 687 .blck_size = QK2_0 , 688 .type_size = sizeof (block_q2_0 ), 689 .is_quantized = true, 690 .to_float = (ggml_to_float_t )dequantize_row_q2_0 , 691 .from_float_ref = (ggml_from_float_t )quantize_row_q2_0_ref , 692 }, 693 [GGML_TYPE_Q4_0 ]= { 694 .type_name = "q4_0" , 695 .blck_size = QK4_0 , 696 .type_size = sizeof (block_q4_0 ), 697 .is_quantized = true, 698 .to_float = (ggml_to_float_t )dequantize_row_q4_0 , 699 .from_float_ref = (ggml_from_float_t )quantize_row_q4_0_ref , 700 }, 701 [GGML_TYPE_Q4_1 ]= { 702 .type_name = "q4_1" , 703 .blck_size = QK4_1 , 704 .type_size = sizeof (block_q4_1 ), 705 .is_quantized = true, 706 .to_float = (ggml_to_float_t )dequantize_row_q4_1 , 707 .from_float_ref = (ggml_from_float_t )quantize_row_q4_1_ref , 708 }, 709 [4 ]= {// GGML_TYPE_Q4_2 710 .type_name = "DEPRECATED" , 711 .blck_size = 0 , 712 .type_size = 0 , 713 .is_quantized = false, 714 }, 715 [5 ]= {// GGML_TYPE_Q4_3 716 .type_name = "DEPRECATED" , 717 .blck_size = 0 , 718 .type_size = 0 , 719 .is_quantized = false, 720 }, 721 [GGML_TYPE_Q5_0 ]= { 722 .type_name = "q5_0" , 723 .blck_size = QK5_0 , 724 .type_size = sizeof (block_q5_0 ), 725 .is_quantized = true, 726 .to_float = (ggml_to_float_t )dequantize_row_q5_0 , 727 .from_float_ref = (ggml_from_float_t )quantize_row_q5_0_ref , 728 }, 729 [GGML_TYPE_Q5_1 ]= { 730 .type_name = "q5_1" , 731 .blck_size = QK5_1 , 732 .type_size = sizeof (block_q5_1 ), 733 .is_quantized = true, 734 .to_float = (ggml_to_float_t )dequantize_row_q5_1 , 735 .from_float_ref = (ggml_from_float_t )quantize_row_q5_1_ref , 736 }, 737 [GGML_TYPE_Q8_0 ]= { 738 .type_name = "q8_0" , 739 .blck_size = QK8_0 , 740 .type_size = sizeof (block_q8_0 ), 741 .is_quantized = true, 742 .to_float = (ggml_to_float_t )dequantize_row_q8_0 , 743 .from_float_ref = (ggml_from_float_t )quantize_row_q8_0_ref , 744 }, 745 [GGML_TYPE_Q8_1 ]= { 746 .type_name = "q8_1" , 747 .blck_size = QK8_1 , 748 .type_size = sizeof (block_q8_1 ), 749 .is_quantized = true, 750 .from_float_ref = (ggml_from_float_t )quantize_row_q8_1_ref , 751 }, 752 [GGML_TYPE_MXFP4 ]= { 753 .type_name = "mxfp4" , 754 .blck_size = QK_MXFP4 , 755 .type_size = sizeof (block_mxfp4 ), 756 .is_quantized = true, 757 .to_float = (ggml_to_float_t )dequantize_row_mxfp4 , 758 .from_float_ref = (ggml_from_float_t )quantize_row_mxfp4_ref , 759 }, 760 [GGML_TYPE_NVFP4 ]= { 761 .type_name = "nvfp4" , 762 .blck_size = QK_NVFP4 , 763 .type_size = sizeof (block_nvfp4 ), 764 .is_quantized = true, 765 .to_float = (ggml_to_float_t )dequantize_row_nvfp4 , 766 .from_float_ref = (ggml_from_float_t )quantize_row_nvfp4_ref , 767 }, 768 [GGML_TYPE_Q2_K ]= { 769 .type_name = "q2_K" , 770 .blck_size = QK_K , 771 .type_size = sizeof (block_q2_K ), 772 .is_quantized = true, 773 .to_float = (ggml_to_float_t )dequantize_row_q2_K , 774 .from_float_ref = (ggml_from_float_t )quantize_row_q2_K_ref , 775 }, 776 [GGML_TYPE_Q3_K ]= { 777 .type_name = "q3_K" , 778 .blck_size = QK_K , 779 .type_size = sizeof (block_q3_K ), 780 .is_quantized = true, 781 .to_float = (ggml_to_float_t )dequantize_row_q3_K , 782 .from_float_ref = (ggml_from_float_t )quantize_row_q3_K_ref , 783 }, 784 [GGML_TYPE_Q4_K ]= { 785 .type_name = "q4_K" , 786 .blck_size = QK_K , 787 .type_size = sizeof (block_q4_K ), 788 .is_quantized = true, 789 .to_float = (ggml_to_float_t )dequantize_row_q4_K , 790 .from_float_ref = (ggml_from_float_t )quantize_row_q4_K_ref , 791 }, 792 [GGML_TYPE_Q5_K ]= { 793 .type_name = "q5_K" , 794 .blck_size = QK_K , 795 .type_size = sizeof (block_q5_K ), 796 .is_quantized = true, 797 .to_float = (ggml_to_float_t )dequantize_row_q5_K , 798 .from_float_ref = (ggml_from_float_t )quantize_row_q5_K_ref , 799 }, 800 [GGML_TYPE_Q6_K ]= { 801 .type_name = "q6_K" , 802 .blck_size = QK_K , 803 .type_size = sizeof (block_q6_K ), 804 .is_quantized = true, 805 .to_float = (ggml_to_float_t )dequantize_row_q6_K , 806 .from_float_ref = (ggml_from_float_t )quantize_row_q6_K_ref , 807 }, 808 [GGML_TYPE_IQ2_XXS ]= { 809 .type_name = "iq2_xxs" , 810 .blck_size = QK_K , 811 .type_size = sizeof (block_iq2_xxs ), 812 .is_quantized = true, 813 .to_float = (ggml_to_float_t )dequantize_row_iq2_xxs , 814 .from_float_ref = NULL , 815 }, 816 [GGML_TYPE_IQ2_XS ]= { 817 .type_name = "iq2_xs" , 818 .blck_size = QK_K , 819 .type_size = sizeof (block_iq2_xs ), 820 .is_quantized = true, 821 .to_float = (ggml_to_float_t )dequantize_row_iq2_xs , 822 .from_float_ref = NULL , 823 }, 824 [GGML_TYPE_IQ3_XXS ]= { 825 .type_name = "iq3_xxs" , 826 .blck_size = QK_K , 827 .type_size = sizeof (block_iq3_xxs ), 828 .is_quantized = true, 829 .to_float = (ggml_to_float_t )dequantize_row_iq3_xxs , 830 .from_float_ref = (ggml_from_float_t )quantize_row_iq3_xxs_ref , 831 }, 832 [GGML_TYPE_IQ3_S ]= { 833 .type_name = "iq3_s" , 834 .blck_size = QK_K , 835 .type_size = sizeof (block_iq3_s ), 836 .is_quantized = true, 837 .to_float = (ggml_to_float_t )dequantize_row_iq3_s , 838 .from_float_ref = (ggml_from_float_t )quantize_row_iq3_s_ref , 839 }, 840 [GGML_TYPE_IQ2_S ]= { 841 .type_name = "iq2_s" , 842 .blck_size = QK_K , 843 .type_size = sizeof (block_iq2_s ), 844 .is_quantized = true, 845 .to_float = (ggml_to_float_t )dequantize_row_iq2_s , 846 .from_float_ref = (ggml_from_float_t )quantize_row_iq2_s_ref , 847 }, 848 [GGML_TYPE_IQ1_S ]= { 849 .type_name = "iq1_s" , 850 .blck_size = QK_K , 851 .type_size = sizeof (block_iq1_s ), 852 .is_quantized = true, 853 .to_float = (ggml_to_float_t )dequantize_row_iq1_s , 854 .from_float_ref = NULL , 855 }, 856 [GGML_TYPE_IQ1_M ]= { 857 .type_name = "iq1_m" , 858 .blck_size = QK_K , 859 .type_size = sizeof (block_iq1_m ), 860 .is_quantized = true, 861 .to_float = (ggml_to_float_t )dequantize_row_iq1_m , 862 .from_float_ref = NULL , 863 }, 864 [GGML_TYPE_IQ4_NL ]= { 865 .type_name = "iq4_nl" , 866 .blck_size = QK4_NL , 867 .type_size = sizeof (block_iq4_nl ), 868 .is_quantized = true, 869 .to_float = (ggml_to_float_t )dequantize_row_iq4_nl , 870 .from_float_ref = (ggml_from_float_t )quantize_row_iq4_nl_ref , 871 }, 872 [GGML_TYPE_IQ4_XS ]= { 873 .type_name = "iq4_xs" , 874 .blck_size = QK_K , 875 .type_size = sizeof (block_iq4_xs ), 876 .is_quantized = true, 877 .to_float = (ggml_to_float_t )dequantize_row_iq4_xs , 878 .from_float_ref = (ggml_from_float_t )quantize_row_iq4_xs_ref , 879 }, 880 [GGML_TYPE_Q8_K ]= { 881 .type_name = "q8_K" , 882 .blck_size = QK_K , 883 .type_size = sizeof (block_q8_K ), 884 .is_quantized = true, 885 }, 886 [GGML_TYPE_BF16 ]= { 887 .type_name = "bf16" , 888 .blck_size = 1 , 889 .type_size = sizeof (ggml_bf16_t ), 890 .is_quantized = false, 891 .to_float = (ggml_to_float_t )ggml_bf16_to_fp32_row , 892 .from_float_ref = (ggml_from_float_t )ggml_fp32_to_bf16_row_ref , 893 }, 894 [31 ]= {// GGML_TYPE_Q4_0_4_4 895 .type_name = "TYPE_Q4_0_4_4 REMOVED, use Q4_0 with runtime repacking" , 896 .blck_size = 0 , 897 .type_size = 0 , 898 .is_quantized = false, 899 }, 900 [32 ]= {// GGML_TYPE_Q4_0_4_8 901 .type_name = "TYPE_Q4_0_4_8 REMOVED, use Q4_0 with runtime repacking" , 902 .blck_size = 0 , 903 .type_size = 0 , 904 .is_quantized = false, 905 }, 906 [33 ]= {// GGML_TYPE_Q4_0_8_8 907 .type_name = "TYPE_Q4_0_8_8 REMOVED, use Q4_0 with runtime repacking" , 908 .blck_size = 0 , 909 .type_size = 0 , 910 .is_quantized = false, 911 }, 912 [GGML_TYPE_TQ1_0 ]= { 913 .type_name = "tq1_0" , 914 .blck_size = QK_K , 915 .type_size = sizeof (block_tq1_0 ), 916 .is_quantized = true, 917 .to_float = (ggml_to_float_t )dequantize_row_tq1_0 , 918 .from_float_ref = (ggml_from_float_t )quantize_row_tq1_0_ref , 919 }, 920 [GGML_TYPE_TQ2_0 ]= { 921 .type_name = "tq2_0" , 922 .blck_size = QK_K , 923 .type_size = sizeof (block_tq2_0 ), 924 .is_quantized = true, 925 .to_float = (ggml_to_float_t )dequantize_row_tq2_0 , 926 .from_float_ref = (ggml_from_float_t )quantize_row_tq2_0_ref , 927 }, 928 [36 ]= {// GGML_TYPE_IQ4_NL_4_4 929 .type_name = "TYPE_IQ4_NL_4_4 REMOVED, use IQ4_NL with runtime repacking" , 930 .blck_size = 0 , 931 .type_size = 0 , 932 .is_quantized = false, 933 }, 934 [37 ]= {// GGML_TYPE_IQ4_NL_4_8 935 .type_name = "TYPE_IQ4_NL_4_8 REMOVED, use IQ4_NL with runtime repacking" , 936 .blck_size = 0 , 937 .type_size = 0 , 938 .is_quantized = false, 939 }, 940 [38 ]= {// GGML_TYPE_IQ4_NL_8_8 941 .type_name = "TYPE_IQ4_NL_8_8 REMOVED, use IQ4_NL with runtime repacking" , 942 .blck_size = 0 , 943 .type_size = 0 , 944 .is_quantized = false, 945 }, 946}; 947 948const struct ggml_type_traits * ggml_get_type_traits (enum ggml_type type ) { 949assert (type >=0 ); 950assert (type < GGML_TYPE_COUNT ); 951return & type_traits [type ]; 952} 953 954// 955// ggml object 956// 957 958struct ggml_object { 959size_t offs ; 960size_t size ; 961 962struct ggml_object * next ; 963 964enum ggml_object_type type ; 965 966char padding [4 ]; 967}; 968 969static const size_t GGML_OBJECT_SIZE = sizeof (struct ggml_object ); 970 971// 972// ggml context 973// 974 975struct ggml_context { 976size_t mem_size ; 977void * mem_buffer ; 978bool mem_buffer_owned ; 979bool no_alloc ; 980 981int n_objects ; 982 983struct ggml_object * objects_begin ; 984struct ggml_object * objects_end ; 985}; 986 987// 988// data types 989// 990 991static const char * GGML_OP_NAME [GGML_OP_COUNT ]= { 992"NONE" , 993 994"DUP" , 995"ADD" , 996"ADD_ID" , 997"ADD1" , 998"ACC" , 999"SUB" , 1000"MUL" , 1001"DIV" , 1002"SQR" , 1003"SQRT" , 1004"LOG" , 1005"SIN" , 1006"COS" , 1007"SUM" , 1008"SUM_ROWS" , 1009"CUMSUM" , 1010"MEAN" , 1011"ARGMAX" , 1012"COUNT_EQUAL" , 1013"REPEAT" , 1014"REPEAT_BACK" , 1015"CONCAT" , 1016"SILU_BACK" , 1017"NORM" , 1018"RMS_NORM" , 1019"RMS_NORM_BACK" , 1020"GROUP_NORM" , 1021"L2_NORM" , 1022 1023"MUL_MAT" , 1024"MUL_MAT_ID" , 1025"OUT_PROD" , 1026 1027"SCALE" , 1028"SET" , 1029"CPY" , 1030"CONT" , 1031"RESHAPE" , 1032"VIEW" , 1033"PERMUTE" , 1034"TRANSPOSE" , 1035"GET_ROWS" , 1036"GET_ROWS_BACK" , 1037"SET_ROWS" , 1038"DIAG" , 1039"DIAG_MASK_INF" , 1040"DIAG_MASK_ZERO" , 1041"SOFT_MAX" , 1042"SOFT_MAX_BACK" , 1043"ROPE" , 1044"ROPE_BACK" , 1045"CLAMP" , 1046"CONV_TRANSPOSE_1D" , 1047"IM2COL" , 1048"IM2COL_BACK" , 1049"IM2COL_3D" , 1050"COL2IM_1D" , 1051"CONV_2D" , 1052"CONV_3D" , 1053"CONV_2D_DW" , 1054"CONV_TRANSPOSE_2D" , 1055"POOL_1D" , 1056"POOL_2D" , 1057"POOL_2D_BACK" , 1058"UPSCALE" , 1059"PAD" , 1060"PAD_REFLECT_1D" , 1061"ROLL" , 1062"ARANGE" , 1063"TIMESTEP_EMBEDDING" , 1064"ARGSORT" , 1065"TOP_K" , 1066"LEAKY_RELU" , 1067"TRI" , 1068"FILL" , 1069 1070"FLASH_ATTN_EXT" , 1071"FLASH_ATTN_BACK" , 1072"SSM_CONV" , 1073"SSM_SCAN" , 1074"WIN_PART" , 1075"WIN_UNPART" , 1076"GET_REL_POS" , 1077"ADD_REL_POS" , 1078"RWKV_WKV6" , 1079"GATED_LINEAR_ATTN" , 1080"RWKV_WKV7" , 1081"SOLVE_TRI" , 1082"GATED_DELTA_NET" , 1083"LIGHTNING_INDEXER" , 1084"DSV4_HC_COMB" , 1085"DSV4_HC_PRE" , 1086"DSV4_HC_POST" , 1087 1088"UNARY" , 1089 1090"MAP_CUSTOM1" , 1091"MAP_CUSTOM2" , 1092"MAP_CUSTOM3" , 1093 1094"CUSTOM" , 1095 1096"CROSS_ENTROPY_LOSS" , 1097"CROSS_ENTROPY_LOSS_BACK" , 1098"OPT_STEP_ADAMW" , 1099"OPT_STEP_SGD" , 1100 1101"GLU" , 1102}; 1103 1104static_assert (GGML_OP_COUNT == 101 ,"GGML_OP_COUNT != 101" ); 1105 1106static const char * GGML_OP_SYMBOL [GGML_OP_COUNT ]= { 1107"none" , 1108 1109"x" , 1110"x+y" , 1111"x[i]+y" , 1112"x+y" , 1113"view(x,nb,offset)+=y->x" , 1114"x-y" , 1115"x*y" , 1116"x/y" , 1117"x^2" , 1118"√x" , 1119"log(x)" , 1120"sin(x)" , 1121"cos(x)" , 1122"Σx" , 1123"Σx_k" , 1124"cumsum(x)" , 1125"Σx/n" , 1126"argmax(x)" , 1127"count_equal(x)" , 1128"repeat(x)" , 1129"repeat_back(x)" , 1130"concat(x, y)" , 1131"silu_back(x)" , 1132"norm(x)" , 1133"rms_norm(x)" , 1134"rms_norm_back(x)" , 1135"group_norm(x)" , 1136"l2_norm(x)" , 1137 1138"X*Y" , 1139"X[i]*Y" , 1140"X*Y" , 1141 1142"x*v" , 1143"y-\\>view(x)" , 1144"x-\\>y" , 1145"cont(x)" , 1146"reshape(x)" , 1147"view(x)" , 1148"permute(x)" , 1149"transpose(x)" , 1150"get_rows(x)" , 1151"get_rows_back(x)" , 1152"set_rows(x)" , 1153"diag(x)" , 1154"diag_mask_inf(x)" , 1155"diag_mask_zero(x)" , 1156"soft_max(x)" , 1157"soft_max_back(x)" , 1158"rope(x)" , 1159"rope_back(x)" , 1160"clamp(x)" , 1161"conv_transpose_1d(x)" , 1162"im2col(x)" , 1163"im2col_back(x)" , 1164"im2col_3d(x)" , 1165"col2im_1d(x)" , 1166"conv_2d(x)" , 1167"conv_3d(x)" , 1168"conv_2d_dw(x)" , 1169"conv_transpose_2d(x)" , 1170"pool_1d(x)" , 1171"pool_2d(x)" , 1172"pool_2d_back(x)" , 1173"upscale(x)" , 1174"pad(x)" , 1175"pad_reflect_1d(x)" , 1176"roll(x)" , 1177"arange(start, stop, step)" , 1178"timestep_embedding(timesteps, dim, max_period)" , 1179"argsort(x)" , 1180"top_k(x)" , 1181"leaky_relu(x)" , 1182"tri(x)" , 1183"fill(x, c)" , 1184 1185"flash_attn_ext(x)" , 1186"flash_attn_back(x)" , 1187"ssm_conv(x)" , 1188"ssm_scan(x)" , 1189"win_part(x)" , 1190"win_unpart(x)" , 1191"get_rel_pos(x)" , 1192"add_rel_pos(x)" , 1193"rwkv_wkv6(k, v, r, tf, td, s)" , 1194"gated_linear_attn(k, v, q, gate, s)" , 1195"rwkv_wkv7(r, w, k, v, a, b, s)" , 1196"A X = B, A triangular, solve X" , 1197"gated_delta_net(q, k, v, g, beta, s)" , 1198"lightning_indexer(q, k, weights, mask)" , 1199"dsv4_hc_comb(mixes, scale, base)" , 1200"dsv4_hc_pre(x, weights)" , 1201"dsv4_hc_post(x, residual, post, comb)" , 1202 1203"unary(x)" , 1204 1205"map_custom(x)" , 1206"map_custom(x,y)" , 1207"map_custom(x,y,z)" , 1208 1209"custom(x)" , 1210 1211"cross_entropy_loss(x,y)" , 1212"cross_entropy_loss_back(x,y)" , 1213"adamw(x)" , 1214"sgd(x)" , 1215 1216"glu(x)" , 1217}; 1218 1219static_assert (GGML_OP_COUNT == 101 ,"GGML_OP_COUNT != 101" ); 1220 1221static_assert (GGML_OP_POOL_COUNT == 2 ,"GGML_OP_POOL_COUNT != 2" ); 1222 1223static const char * GGML_UNARY_OP_NAME [GGML_UNARY_OP_COUNT ]= { 1224"ABS" , 1225"SGN" , 1226"NEG" , 1227"STEP" , 1228"TANH" , 1229"ELU" , 1230"RELU" , 1231"SIGMOID" , 1232"GELU" , 1233"GELU_QUICK" , 1234"SILU" , 1235"HARDSWISH" , 1236"HARDSIGMOID" , 1237"EXP" , 1238"EXPM1" , 1239"SOFTPLUS" , 1240"GELU_ERF" , 1241"XIELU" , 1242"FLOOR" , 1243"CEIL" , 1244"ROUND" , 1245"TRUNC" , 1246}; 1247 1248static_assert (GGML_UNARY_OP_COUNT == 22 ,"GGML_UNARY_OP_COUNT != 22" ); 1249 1250static const char * GGML_GLU_OP_NAME [GGML_GLU_OP_COUNT ]= { 1251"REGLU" , 1252"GEGLU" , 1253"SWIGLU" , 1254"SWIGLU_OAI" , 1255"GEGLU_ERF" , 1256"GEGLU_QUICK" , 1257"SWIGLU_CLAMP" , 1258}; 1259 1260static_assert (GGML_GLU_OP_COUNT == 7 ,"GGML_GLU_OP_COUNT != 7" ); 1261 1262static_assert (sizeof (struct ggml_object )%GGML_MEM_ALIGN == 0 ,"ggml_object size must be a multiple of GGML_MEM_ALIGN" ); 1263static_assert (sizeof (struct ggml_tensor )%GGML_MEM_ALIGN == 0 ,"ggml_tensor size must be a multiple of GGML_MEM_ALIGN" ); 1264 1265 1266//////////////////////////////////////////////////////////////////////////////// 1267 1268void ggml_print_object (const struct ggml_object * obj ) { 1269GGML_LOG_INFO (" - ggml_object: type = %d, offset = %zu, size = %zu, next = %p\n" , 1270obj -> type ,obj -> offs ,obj -> size , (const void * )obj -> next ); 1271} 1272 1273void ggml_print_objects (const struct ggml_context * ctx ) { 1274struct ggml_object * obj = ctx -> objects_begin ; 1275 1276GGML_LOG_INFO ("%s: objects in context %p:\n" ,__func__ , (const void * )ctx ); 1277 1278while (obj != NULL ) { 1279ggml_print_object (obj ); 1280obj = obj -> next ; 1281 } 1282 1283GGML_LOG_INFO ("%s: --- end ---\n" ,__func__ ); 1284} 1285 1286int64_t ggml_nelements (const struct ggml_tensor * tensor ) { 1287static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 1288 1289return tensor -> ne [0 ]* tensor -> ne [1 ]* tensor -> ne [2 ]* tensor -> ne [3 ]; 1290} 1291 1292int64_t ggml_nrows (const struct ggml_tensor * tensor ) { 1293static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 1294 1295return tensor -> ne [1 ]* tensor -> ne [2 ]* tensor -> ne [3 ]; 1296} 1297 1298size_t ggml_nbytes (const struct ggml_tensor * tensor ) { 1299for (int i = 0 ;i < GGML_MAX_DIMS ;++ i ) { 1300if (tensor -> ne [i ] <=0 ) { 1301return 0 ; 1302 } 1303 } 1304 1305size_t nbytes ; 1306const size_t blck_size = ggml_blck_size (tensor -> type ); 1307if (blck_size == 1 ) { 1308nbytes = ggml_type_size (tensor -> type ); 1309for (int i = 0 ;i < GGML_MAX_DIMS ;++ i ) { 1310nbytes += (tensor -> ne [i ]- 1 )* tensor -> nb [i ]; 1311 } 1312 } 1313else { 1314nbytes = tensor -> ne [0 ]* tensor -> nb [0 ]/blck_size ; 1315for (int i = 1 ;i < GGML_MAX_DIMS ;++ i ) { 1316nbytes += (tensor -> ne [i ]- 1 )* tensor -> nb [i ]; 1317 } 1318 } 1319 1320return nbytes ; 1321} 1322 1323size_t ggml_nbytes_pad (const struct ggml_tensor * tensor ) { 1324return GGML_PAD (ggml_nbytes (tensor ),GGML_MEM_ALIGN ); 1325} 1326 1327int64_t ggml_blck_size (enum ggml_type type ) { 1328assert (type >=0 ); 1329assert (type < GGML_TYPE_COUNT ); 1330return type_traits [type ].blck_size ; 1331} 1332 1333size_t ggml_type_size (enum ggml_type type ) { 1334assert (type >=0 ); 1335assert (type < GGML_TYPE_COUNT ); 1336return type_traits [type ].type_size ; 1337} 1338 1339size_t ggml_row_size (enum ggml_type type ,int64_t ne ) { 1340assert (type >=0 ); 1341assert (type < GGML_TYPE_COUNT ); 1342assert (ne %ggml_blck_size (type )== 0 ); 1343return ggml_type_size (type )* ne /ggml_blck_size (type ); 1344} 1345 1346double ggml_type_sizef (enum ggml_type type ) { 1347assert (type >=0 ); 1348assert (type < GGML_TYPE_COUNT ); 1349return ((double )(type_traits [type ].type_size ))/type_traits [type ].blck_size ; 1350} 1351 1352const char * ggml_type_name (enum ggml_type type ) { 1353assert (type >=0 ); 1354assert (type < GGML_TYPE_COUNT ); 1355return type_traits [type ].type_name ; 1356} 1357 1358bool ggml_is_quantized (enum ggml_type type ) { 1359assert (type >=0 ); 1360assert (type < GGML_TYPE_COUNT ); 1361return type_traits [type ].is_quantized ; 1362} 1363 1364const char * ggml_op_name (enum ggml_op op ) { 1365return GGML_OP_NAME [op ]; 1366} 1367 1368const char * ggml_op_symbol (enum ggml_op op ) { 1369return GGML_OP_SYMBOL [op ]; 1370} 1371 1372const char * ggml_unary_op_name (enum ggml_unary_op op ) { 1373return GGML_UNARY_OP_NAME [op ]; 1374} 1375 1376const char * ggml_glu_op_name (enum ggml_glu_op op ) { 1377return GGML_GLU_OP_NAME [op ]; 1378} 1379 1380const char * ggml_op_desc (const struct ggml_tensor * t ) { 1381if (t -> op == GGML_OP_UNARY ) { 1382enum ggml_unary_op uop = ggml_get_unary_op (t ); 1383return ggml_unary_op_name (uop ); 1384 } 1385if (t -> op == GGML_OP_GLU ) { 1386enum ggml_glu_op gop = ggml_get_glu_op (t ); 1387return ggml_glu_op_name (gop ); 1388 } 1389return ggml_op_name (t -> op ); 1390} 1391 1392size_t ggml_element_size (const struct ggml_tensor * tensor ) { 1393return ggml_type_size (tensor -> type ); 1394} 1395 1396bool ggml_is_scalar (const struct ggml_tensor * tensor ) { 1397static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 1398 1399return tensor -> ne [0 ]== 1 && tensor -> ne [1 ]== 1 && tensor -> ne [2 ]== 1 && tensor -> ne [3 ]== 1 ; 1400} 1401 1402bool ggml_is_vector (const struct ggml_tensor * tensor ) { 1403static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 1404 1405return tensor -> ne [1 ]== 1 && tensor -> ne [2 ]== 1 && tensor -> ne [3 ]== 1 ; 1406} 1407 1408bool ggml_is_matrix (const struct ggml_tensor * tensor ) { 1409static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 1410 1411return tensor -> ne [2 ]== 1 && tensor -> ne [3 ]== 1 ; 1412} 1413 1414bool ggml_is_3d (const struct ggml_tensor * tensor ) { 1415return tensor -> ne [3 ]== 1 ; 1416} 1417 1418int ggml_n_dims (const struct ggml_tensor * tensor ) { 1419for (int i = GGML_MAX_DIMS - 1 ;i >=1 ;-- i ) { 1420if (tensor -> ne [i ]> 1 ) { 1421return i + 1 ; 1422 } 1423 } 1424return 1 ; 1425} 1426 1427enum ggml_type ggml_ftype_to_ggml_type (enum ggml_ftype ftype ) { 1428enum ggml_type wtype = GGML_TYPE_COUNT ; 1429 1430switch (ftype ) { 1431case GGML_FTYPE_ALL_F32 :wtype = GGML_TYPE_F32 ;break ; 1432case GGML_FTYPE_MOSTLY_F16 :wtype = GGML_TYPE_F16 ;break ; 1433case GGML_FTYPE_MOSTLY_BF16 :wtype = GGML_TYPE_BF16 ;break ; 1434case GGML_FTYPE_MOSTLY_Q4_0 :wtype = GGML_TYPE_Q4_0 ;break ; 1435case GGML_FTYPE_MOSTLY_Q4_1 :wtype = GGML_TYPE_Q4_1 ;break ; 1436case GGML_FTYPE_MOSTLY_Q1_0 :wtype = GGML_TYPE_Q1_0 ;break ; 1437case GGML_FTYPE_MOSTLY_Q2_0 :wtype = GGML_TYPE_Q2_0 ;break ; 1438case GGML_FTYPE_MOSTLY_Q5_0 :wtype = GGML_TYPE_Q5_0 ;break ; 1439case GGML_FTYPE_MOSTLY_Q5_1 :wtype = GGML_TYPE_Q5_1 ;break ; 1440case GGML_FTYPE_MOSTLY_Q8_0 :wtype = GGML_TYPE_Q8_0 ;break ; 1441case GGML_FTYPE_MOSTLY_MXFP4 :wtype = GGML_TYPE_MXFP4 ;break ; 1442case GGML_FTYPE_MOSTLY_NVFP4 :wtype = GGML_TYPE_NVFP4 ;break ; 1443case GGML_FTYPE_MOSTLY_Q2_K :wtype = GGML_TYPE_Q2_K ;break ; 1444case GGML_FTYPE_MOSTLY_Q3_K :wtype = GGML_TYPE_Q3_K ;break ; 1445case GGML_FTYPE_MOSTLY_Q4_K :wtype = GGML_TYPE_Q4_K ;break ; 1446case GGML_FTYPE_MOSTLY_Q5_K :wtype = GGML_TYPE_Q5_K ;break ; 1447case GGML_FTYPE_MOSTLY_Q6_K :wtype = GGML_TYPE_Q6_K ;break ; 1448case GGML_FTYPE_MOSTLY_IQ2_XXS :wtype = GGML_TYPE_IQ2_XXS ;break ; 1449case GGML_FTYPE_MOSTLY_IQ2_XS :wtype = GGML_TYPE_IQ2_XS ;break ; 1450case GGML_FTYPE_MOSTLY_IQ3_XXS :wtype = GGML_TYPE_IQ3_XXS ;break ; 1451case GGML_FTYPE_MOSTLY_IQ1_S :wtype = GGML_TYPE_IQ1_S ;break ; 1452case GGML_FTYPE_MOSTLY_IQ1_M :wtype = GGML_TYPE_IQ1_M ;break ; 1453case GGML_FTYPE_MOSTLY_IQ4_NL :wtype = GGML_TYPE_IQ4_NL ;break ; 1454case GGML_FTYPE_MOSTLY_IQ4_XS :wtype = GGML_TYPE_IQ4_XS ;break ; 1455case GGML_FTYPE_MOSTLY_IQ3_S :wtype = GGML_TYPE_IQ3_S ;break ; 1456case GGML_FTYPE_MOSTLY_IQ2_S :wtype = GGML_TYPE_IQ2_S ;break ; 1457case GGML_FTYPE_UNKNOWN :wtype = GGML_TYPE_COUNT ;break ; 1458case GGML_FTYPE_MOSTLY_Q4_1_SOME_F16 :wtype = GGML_TYPE_COUNT ;break ; 1459 } 1460 1461GGML_ASSERT (wtype != GGML_TYPE_COUNT ); 1462 1463return wtype ; 1464} 1465 1466size_t ggml_tensor_overhead (void ) { 1467return GGML_OBJECT_SIZE + GGML_TENSOR_SIZE ; 1468} 1469 1470bool ggml_is_transposed (const struct ggml_tensor * tensor ) { 1471return tensor -> nb [0 ]> tensor -> nb [1 ]; 1472} 1473 1474static bool ggml_is_contiguous_m_n (const struct ggml_tensor * tensor ,int m ,int n ) { 1475size_t next_nb = ggml_type_size (tensor -> type ); 1476if (tensor -> ne [0 ]!= ggml_blck_size (tensor -> type )&& tensor -> nb [0 ]!= next_nb ) { 1477return false; 1478 } 1479next_nb *=tensor -> ne [0 ]/ggml_blck_size (tensor -> type ); 1480for (int i = 1 ;i < n ;i ++ ) { 1481if (i > m ) { 1482if (tensor -> ne [i ]!= 1 && tensor -> nb [i ]!= next_nb ) { 1483return false; 1484 } 1485next_nb *=tensor -> ne [i ]; 1486 }else { 1487// this dimension does not need to be contiguous 1488next_nb = tensor -> ne [i ]* tensor -> nb [i ]; 1489 } 1490 } 1491return true; 1492} 1493 1494bool ggml_is_contiguous (const struct ggml_tensor * tensor ) { 1495return ggml_is_contiguous_0 (tensor ); 1496} 1497 1498bool ggml_is_contiguous_0 (const struct ggml_tensor * tensor ) { 1499return ggml_is_contiguous_m_n (tensor ,0 ,GGML_MAX_DIMS ); 1500} 1501 1502bool ggml_is_contiguous_1 (const struct ggml_tensor * tensor ) { 1503return ggml_is_contiguous_m_n (tensor ,1 ,GGML_MAX_DIMS ); 1504} 1505 1506bool ggml_is_contiguous_2 (const struct ggml_tensor * tensor ) { 1507return ggml_is_contiguous_m_n (tensor ,2 ,GGML_MAX_DIMS ); 1508} 1509 1510bool ggml_is_contiguous_to_1 (const struct ggml_tensor * tensor ) { 1511return ggml_is_contiguous_m_n (tensor ,0 ,1 ); 1512} 1513 1514bool ggml_is_contiguous_to_2 (const struct ggml_tensor * tensor ) { 1515return ggml_is_contiguous_m_n (tensor ,0 ,2 ); 1516} 1517 1518bool ggml_is_contiguous_to_3 (const struct ggml_tensor * tensor ) { 1519return ggml_is_contiguous_m_n (tensor ,0 ,3 ); 1520} 1521 1522bool ggml_is_contiguously_allocated (const struct ggml_tensor * tensor ) { 1523return ggml_nbytes (tensor )== ggml_nelements (tensor )* ggml_type_size (tensor -> type )/ggml_blck_size (tensor -> type ); 1524} 1525 1526bool ggml_is_permuted (const struct ggml_tensor * tensor ) { 1527static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 1528 1529return tensor -> nb [0 ]> tensor -> nb [1 ]|| tensor -> nb [1 ]> tensor -> nb [2 ]|| tensor -> nb [2 ]> tensor -> nb [3 ]; 1530} 1531 1532bool ggml_is_contiguous_channels (const struct ggml_tensor * tensor ) { 1533return 1534tensor -> nb [0 ]> tensor -> nb [2 ]&& 1535tensor -> nb [1 ]> tensor -> nb [0 ]&& 1536tensor -> nb [2 ]== ggml_type_size (tensor -> type ); 1537} 1538 1539bool ggml_is_contiguous_rows (const struct ggml_tensor * tensor ) { 1540return 1541tensor -> ne [0 ]== ggml_blck_size (tensor -> type )|| 1542tensor -> nb [0 ]== ggml_type_size (tensor -> type ); 1543} 1544 1545static inline bool ggml_is_padded_1d (const struct ggml_tensor * tensor ) { 1546static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 1547 1548return 1549tensor -> nb [0 ]== ggml_type_size (tensor -> type )&& 1550tensor -> nb [2 ]== tensor -> nb [1 ]* tensor -> ne [1 ]&& 1551tensor -> nb [3 ]== tensor -> nb [2 ]* tensor -> ne [2 ]; 1552} 1553 1554bool ggml_is_empty (const struct ggml_tensor * tensor ) { 1555for (int i = 0 ;i < GGML_MAX_DIMS ;++ i ) { 1556if (tensor -> ne [i ]== 0 ) { 1557// empty if any dimension has no elements 1558return true; 1559 } 1560 } 1561return false; 1562} 1563 1564bool ggml_are_same_shape (const struct ggml_tensor * t0 ,const struct ggml_tensor * t1 ) { 1565static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 1566 1567return 1568 (t0 -> ne [0 ]== t1 -> ne [0 ])&& 1569 (t0 -> ne [1 ]== t1 -> ne [1 ])&& 1570 (t0 -> ne [2 ]== t1 -> ne [2 ])&& 1571 (t0 -> ne [3 ]== t1 -> ne [3 ]); 1572} 1573 1574bool ggml_are_same_stride (const struct ggml_tensor * t0 ,const struct ggml_tensor * t1 ) { 1575static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 1576 1577return 1578 (t0 -> nb [0 ]== t1 -> nb [0 ])&& 1579 (t0 -> nb [1 ]== t1 -> nb [1 ])&& 1580 (t0 -> nb [2 ]== t1 -> nb [2 ])&& 1581 (t0 -> nb [3 ]== t1 -> nb [3 ]); 1582} 1583 1584bool ggml_is_view (const struct ggml_tensor * t ) { 1585return ggml_impl_is_view (t ); 1586} 1587 1588// check if t1 can be represented as a repetition of t0 1589bool ggml_can_repeat (const struct ggml_tensor * t0 ,const struct ggml_tensor * t1 ) { 1590static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 1591 1592return ggml_is_empty (t0 ) ?ggml_is_empty (t1 ) : 1593 (t1 -> ne [0 ]%t0 -> ne [0 ]== 0 )&& 1594 (t1 -> ne [1 ]%t0 -> ne [1 ]== 0 )&& 1595 (t1 -> ne [2 ]%t0 -> ne [2 ]== 0 )&& 1596 (t1 -> ne [3 ]%t0 -> ne [3 ]== 0 ); 1597} 1598 1599static inline bool ggml_can_repeat_rows (const struct ggml_tensor * t0 ,const struct ggml_tensor * t1 ) { 1600static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 1601 1602return (t0 -> ne [0 ]== t1 -> ne [0 ])&& ggml_can_repeat (t0 ,t1 ); 1603} 1604 1605// assert that pointer is aligned to GGML_MEM_ALIGN 1606#define GGML_ASSERT_ALIGNED (ptr ) \ 1607 GGML_ASSERT(((uintptr_t) (ptr))%GGML_MEM_ALIGN == 0) 1608 1609//////////////////////////////////////////////////////////////////////////////// 1610 1611struct ggml_context * ggml_init (struct ggml_init_params params ) { 1612static bool is_first_call = true; 1613 1614ggml_critical_section_start (); 1615 1616if (is_first_call ) { 1617// initialize time system (required on Windows) 1618ggml_time_init (); 1619 1620is_first_call = false; 1621 } 1622 1623ggml_critical_section_end (); 1624 1625struct ggml_context * ctx = GGML_MALLOC (sizeof (struct ggml_context )); 1626 1627// allow to call ggml_init with 0 size 1628if (params .mem_size == 0 ) { 1629params .mem_size = GGML_MEM_ALIGN ; 1630 } 1631 1632const size_t mem_size = params .mem_buffer ?params .mem_size :GGML_PAD (params .mem_size ,GGML_MEM_ALIGN ); 1633 1634* ctx = (struct ggml_context ) { 1635/*.mem_size =*/ mem_size , 1636/*.mem_buffer =*/ params .mem_buffer ?params .mem_buffer :ggml_aligned_malloc (mem_size ), 1637/*.mem_buffer_owned =*/ params .mem_buffer ? false : true, 1638/*.no_alloc =*/ params .no_alloc , 1639/*.n_objects =*/ 0 , 1640/*.objects_begin =*/ NULL , 1641/*.objects_end =*/ NULL , 1642 }; 1643 1644GGML_ASSERT (ctx -> mem_buffer != NULL ); 1645 1646GGML_ASSERT_ALIGNED (ctx -> mem_buffer ); 1647 1648GGML_PRINT_DEBUG ("%s: context initialized\n" ,__func__ ); 1649 1650return ctx ; 1651} 1652 1653void ggml_reset (struct ggml_context * ctx ) { 1654if (ctx == NULL ) { 1655return ; 1656 } 1657 1658ctx -> n_objects = 0 ; 1659ctx -> objects_begin = NULL ; 1660ctx -> objects_end = NULL ; 1661} 1662 1663void ggml_free (struct ggml_context * ctx ) { 1664if (ctx == NULL ) { 1665return ; 1666 } 1667 1668if (ctx -> mem_buffer_owned ) { 1669ggml_aligned_free (ctx -> mem_buffer ,ctx -> mem_size ); 1670 } 1671 1672GGML_FREE (ctx ); 1673} 1674 1675size_t ggml_used_mem (const struct ggml_context * ctx ) { 1676return ctx -> objects_end == NULL ?0 :ctx -> objects_end -> offs + ctx -> objects_end -> size ; 1677} 1678 1679bool ggml_get_no_alloc (struct ggml_context * ctx ) { 1680return ctx -> no_alloc ; 1681} 1682 1683void ggml_set_no_alloc (struct ggml_context * ctx ,bool no_alloc ) { 1684ctx -> no_alloc = no_alloc ; 1685} 1686 1687void * ggml_get_mem_buffer (const struct ggml_context * ctx ) { 1688return ctx -> mem_buffer ; 1689} 1690 1691size_t ggml_get_mem_size (const struct ggml_context * ctx ) { 1692return ctx -> mem_size ; 1693} 1694 1695size_t ggml_get_max_tensor_size (const struct ggml_context * ctx ) { 1696size_t max_size = 0 ; 1697 1698for (struct ggml_tensor * tensor = ggml_get_first_tensor (ctx );tensor != NULL ;tensor = ggml_get_next_tensor (ctx ,tensor )) { 1699size_t bytes = ggml_nbytes (tensor ); 1700max_size = MAX (max_size ,bytes ); 1701 } 1702 1703return max_size ; 1704} 1705 1706//////////////////////////////////////////////////////////////////////////////// 1707 1708static struct ggml_object * ggml_new_object (struct ggml_context * ctx ,enum ggml_object_type type ,size_t size ) { 1709// always insert objects at the end of the context's memory pool 1710struct ggml_object * obj_cur = ctx -> objects_end ; 1711 1712const size_t cur_offs = obj_cur == NULL ?0 :obj_cur -> offs ; 1713const size_t cur_size = obj_cur == NULL ?0 :obj_cur -> size ; 1714const size_t cur_end = cur_offs + cur_size ; 1715 1716// align to GGML_MEM_ALIGN 1717GGML_ASSERT (size <=SIZE_MAX - (GGML_MEM_ALIGN - 1 )); 1718size_t size_needed = GGML_PAD (size ,GGML_MEM_ALIGN ); 1719 1720char * const mem_buffer = ctx -> mem_buffer ; 1721struct ggml_object * const obj_new = (struct ggml_object * )(mem_buffer + cur_end ); 1722 1723// integer overflow checks 1724if (cur_end > SIZE_MAX - size_needed ) { 1725GGML_LOG_WARN ("%s: overflow detected in cur_end (%zu) + size_needed (%zu)\n" ,__func__ ,cur_end ,size_needed ); 1726return NULL ; 1727 } 1728if (cur_end + size_needed > SIZE_MAX - GGML_OBJECT_SIZE ) { 1729GGML_LOG_WARN ("%s: overflow detected in cur_end (%zu) + size_needed (%zu) + GGML_OBJECT_SIZE (%zu)\n" ,__func__ , 1730cur_end ,size_needed , (size_t )GGML_OBJECT_SIZE ); 1731return NULL ; 1732 } 1733 1734if (cur_end + size_needed + GGML_OBJECT_SIZE > ctx -> mem_size ) { 1735GGML_LOG_WARN ("%s: not enough space in the context's memory pool (needed %zu, available %zu)\n" , 1736__func__ ,cur_end + size_needed + GGML_OBJECT_SIZE ,ctx -> mem_size ); 1737#ifndef NDEBUG 1738GGML_ABORT ("not enough space in the context's memory pool" ); 1739#endif 1740return NULL ; 1741 } 1742 1743* obj_new = (struct ggml_object ) { 1744 .offs = cur_end + GGML_OBJECT_SIZE , 1745 .size = size_needed , 1746 .next = NULL , 1747 .type = type , 1748 }; 1749 1750GGML_ASSERT_ALIGNED (mem_buffer + obj_new -> offs ); 1751 1752if (obj_cur != NULL ) { 1753obj_cur -> next = obj_new ; 1754 }else { 1755// this is the first object in this context 1756ctx -> objects_begin = obj_new ; 1757 } 1758 1759ctx -> objects_end = obj_new ; 1760 1761//printf("%s: inserted new object at %zu, size = %zu\n", __func__, cur_end, obj_new->size); 1762 1763return obj_new ; 1764} 1765 1766static struct ggml_tensor * ggml_new_tensor_impl ( 1767struct ggml_context * ctx , 1768enum ggml_type type , 1769int n_dims , 1770const int64_t * ne , 1771struct ggml_tensor * view_src , 1772size_t view_offs ) { 1773 1774GGML_ASSERT (type >=0 && type < GGML_TYPE_COUNT ); 1775GGML_ASSERT (n_dims >=1 && n_dims <=GGML_MAX_DIMS ); 1776 1777// find the base tensor and absolute offset 1778if (view_src != NULL && view_src -> view_src != NULL ) { 1779view_offs += view_src -> view_offs ; 1780view_src = view_src -> view_src ; 1781 } 1782 1783size_t data_size = ggml_row_size (type ,ne [0 ]); 1784for (int i = 1 ;i < n_dims ;i ++ ) { 1785data_size *=ne [i ]; 1786 } 1787 1788GGML_ASSERT (view_src == NULL || data_size == 0 || data_size + view_offs <=ggml_nbytes (view_src )); 1789 1790void * data = view_src != NULL ?view_src -> data :NULL ; 1791if (data != NULL ) { 1792data = (char * )data + view_offs ; 1793 } 1794 1795size_t obj_alloc_size = 0 ; 1796 1797if (view_src == NULL && !ctx -> no_alloc ) { 1798// allocate tensor data in the context's memory pool 1799obj_alloc_size = data_size ; 1800 } 1801 1802GGML_ASSERT (GGML_TENSOR_SIZE <=SIZE_MAX - obj_alloc_size ); 1803 1804struct ggml_object * const obj_new = ggml_new_object (ctx ,GGML_OBJECT_TYPE_TENSOR ,GGML_TENSOR_SIZE + obj_alloc_size ); 1805GGML_ASSERT (obj_new ); 1806 1807struct ggml_tensor * const result = (struct ggml_tensor * )((char * )ctx -> mem_buffer + obj_new -> offs ); 1808 1809* result = (struct ggml_tensor ) { 1810/*.type =*/ type , 1811/*.buffer =*/ NULL , 1812/*.ne =*/ {1 ,1 ,1 ,1 }, 1813/*.nb =*/ {0 ,0 ,0 ,0 }, 1814/*.op =*/ GGML_OP_NONE , 1815/*.op_params =*/ {0 }, 1816/*.flags =*/ 0 , 1817/*.src =*/ {NULL }, 1818/*.view_src =*/ view_src , 1819/*.view_offs =*/ view_offs , 1820/*.data =*/ obj_alloc_size > 0 ? (void * )(result + 1 ) :data , 1821/*.name =*/ {0 }, 1822/*.extra =*/ NULL , 1823/*.padding =*/ {0 }, 1824 }; 1825 1826// TODO: this should not be needed as long as we don't rely on aligned SIMD loads 1827//GGML_ASSERT_ALIGNED(result->data); 1828 1829for (int i = 0 ;i < n_dims ;i ++ ) { 1830result -> ne [i ]= ne [i ]; 1831 } 1832 1833result -> nb [0 ]= ggml_type_size (type ); 1834result -> nb [1 ]= result -> nb [0 ]* (result -> ne [0 ]/ggml_blck_size (type )); 1835for (int i = 2 ;i < GGML_MAX_DIMS ;i ++ ) { 1836result -> nb [i ]= result -> nb [i - 1 ]* result -> ne [i - 1 ]; 1837 } 1838 1839ctx -> n_objects ++ ; 1840 1841return result ; 1842} 1843 1844struct ggml_tensor * ggml_new_tensor ( 1845struct ggml_context * ctx , 1846enum ggml_type type , 1847int n_dims , 1848const int64_t * ne ) { 1849return ggml_new_tensor_impl (ctx ,type ,n_dims ,ne ,NULL ,0 ); 1850} 1851 1852struct ggml_tensor * ggml_new_tensor_1d ( 1853struct ggml_context * ctx , 1854enum ggml_type type , 1855int64_t ne0 ) { 1856return ggml_new_tensor (ctx ,type ,1 ,& ne0 ); 1857} 1858 1859struct ggml_tensor * ggml_new_tensor_2d ( 1860struct ggml_context * ctx , 1861enum ggml_type type , 1862int64_t ne0 , 1863int64_t ne1 ) { 1864const int64_t ne [2 ]= {ne0 ,ne1 }; 1865return ggml_new_tensor (ctx ,type ,2 ,ne ); 1866} 1867 1868struct ggml_tensor * ggml_new_tensor_3d ( 1869struct ggml_context * ctx , 1870enum ggml_type type , 1871int64_t ne0 , 1872int64_t ne1 , 1873int64_t ne2 ) { 1874const int64_t ne [3 ]= {ne0 ,ne1 ,ne2 }; 1875return ggml_new_tensor (ctx ,type ,3 ,ne ); 1876} 1877 1878struct ggml_tensor * ggml_new_tensor_4d ( 1879struct ggml_context * ctx , 1880enum ggml_type type , 1881int64_t ne0 , 1882int64_t ne1 , 1883int64_t ne2 , 1884int64_t ne3 ) { 1885const int64_t ne [4 ]= {ne0 ,ne1 ,ne2 ,ne3 }; 1886return ggml_new_tensor (ctx ,type ,4 ,ne ); 1887} 1888 1889void * ggml_new_buffer (struct ggml_context * ctx ,size_t nbytes ) { 1890struct ggml_object * obj = ggml_new_object (ctx ,GGML_OBJECT_TYPE_WORK_BUFFER ,nbytes ); 1891 1892return (uint8_t * )ctx -> mem_buffer + obj -> offs ; 1893} 1894 1895struct ggml_tensor * ggml_dup_tensor (struct ggml_context * ctx ,const struct ggml_tensor * src ) { 1896return ggml_new_tensor (ctx ,src -> type ,GGML_MAX_DIMS ,src -> ne ); 1897} 1898 1899void ggml_unravel_index (const struct ggml_tensor * tensor ,int64_t i ,int64_t * i0 ,int64_t * i1 ,int64_t * i2 ,int64_t * i3 ) { 1900const int64_t ne2 = tensor -> ne [2 ]; 1901const int64_t ne1 = tensor -> ne [1 ]; 1902const int64_t ne0 = tensor -> ne [0 ]; 1903 1904const int64_t i3_ = (i /(ne2 * ne1 * ne0 )); 1905const int64_t i2_ = (i - i3_ * ne2 * ne1 * ne0 )/(ne1 * ne0 ); 1906const int64_t i1_ = (i - i3_ * ne2 * ne1 * ne0 - i2_ * ne1 * ne0 )/ne0 ; 1907const int64_t i0_ = (i - i3_ * ne2 * ne1 * ne0 - i2_ * ne1 * ne0 - i1_ * ne0 ); 1908 1909if (i0 ) { 1910* i0 = i0_ ; 1911 } 1912if (i1 ) { 1913* i1 = i1_ ; 1914 } 1915if (i2 ) { 1916* i2 = i2_ ; 1917 } 1918if (i3 ) { 1919* i3 = i3_ ; 1920 } 1921} 1922 1923void * ggml_get_data (const struct ggml_tensor * tensor ) { 1924return tensor -> data ; 1925} 1926 1927float * ggml_get_data_f32 (const struct ggml_tensor * tensor ) { 1928assert (tensor -> type == GGML_TYPE_F32 ); 1929return (float * )(tensor -> data ); 1930} 1931 1932enum ggml_unary_op ggml_get_unary_op (const struct ggml_tensor * tensor ) { 1933GGML_ASSERT (tensor -> op == GGML_OP_UNARY ); 1934return (enum ggml_unary_op )ggml_get_op_params_i32 (tensor ,0 ); 1935} 1936 1937enum ggml_glu_op ggml_get_glu_op (const struct ggml_tensor * tensor ) { 1938GGML_ASSERT (tensor -> op == GGML_OP_GLU ); 1939return (enum ggml_glu_op )ggml_get_op_params_i32 (tensor ,0 ); 1940} 1941 1942const char * ggml_get_name (const struct ggml_tensor * tensor ) { 1943return tensor -> name ; 1944} 1945 1946struct ggml_tensor * ggml_set_name (struct ggml_tensor * tensor ,const char * name ) { 1947size_t i ; 1948for (i = 0 ;i < sizeof (tensor -> name )- 1 && name [i ]!= '\0' ;i ++ ) { 1949tensor -> name [i ]= name [i ]; 1950 } 1951tensor -> name [i ]= '\0' ; 1952return tensor ; 1953} 1954 1955struct ggml_tensor * ggml_format_name (struct ggml_tensor * tensor ,const char * fmt , ...) { 1956va_list args ; 1957va_start (args ,fmt ); 1958vsnprintf (tensor -> name ,sizeof (tensor -> name ),fmt ,args ); 1959va_end (args ); 1960return tensor ; 1961} 1962 1963struct ggml_tensor * ggml_view_tensor ( 1964struct ggml_context * ctx , 1965struct ggml_tensor * src ) { 1966struct ggml_tensor * result = ggml_new_tensor_impl (ctx ,src -> type ,GGML_MAX_DIMS ,src -> ne ,src ,0 ); 1967ggml_format_name (result ,"%s (view)" ,src -> name ); 1968 1969for (int i = 0 ;i < GGML_MAX_DIMS ;i ++ ) { 1970result -> nb [i ]= src -> nb [i ]; 1971 } 1972 1973return result ; 1974} 1975 1976struct ggml_tensor * ggml_get_first_tensor (const struct ggml_context * ctx ) { 1977struct ggml_object * obj = ctx -> objects_begin ; 1978 1979char * const mem_buffer = ctx -> mem_buffer ; 1980 1981while (obj != NULL ) { 1982if (obj -> type == GGML_OBJECT_TYPE_TENSOR ) { 1983return (struct ggml_tensor * )(mem_buffer + obj -> offs ); 1984 } 1985 1986obj = obj -> next ; 1987 } 1988 1989return NULL ; 1990} 1991 1992struct ggml_tensor * ggml_get_next_tensor (const struct ggml_context * ctx ,struct ggml_tensor * tensor ) { 1993struct ggml_object * obj = (struct ggml_object * ) ((char * )tensor - GGML_OBJECT_SIZE ); 1994obj = obj -> next ; 1995 1996char * const mem_buffer = ctx -> mem_buffer ; 1997 1998while (obj != NULL ) { 1999if (obj -> type == GGML_OBJECT_TYPE_TENSOR ) { 2000return (struct ggml_tensor * )(mem_buffer + obj -> offs ); 2001 } 2002 2003obj = obj -> next ; 2004 } 2005 2006return NULL ; 2007} 2008 2009struct ggml_tensor * ggml_get_tensor (struct ggml_context * ctx ,const char * name ) { 2010struct ggml_object * obj = ctx -> objects_begin ; 2011 2012char * const mem_buffer = ctx -> mem_buffer ; 2013 2014while (obj != NULL ) { 2015if (obj -> type == GGML_OBJECT_TYPE_TENSOR ) { 2016struct ggml_tensor * cur = (struct ggml_tensor * )(mem_buffer + obj -> offs ); 2017if (strcmp (cur -> name ,name )== 0 ) { 2018return cur ; 2019 } 2020 } 2021 2022obj = obj -> next ; 2023 } 2024 2025return NULL ; 2026} 2027 2028//////////////////////////////////////////////////////////////////////////////// 2029 2030// ggml_dup 2031 2032static struct ggml_tensor * ggml_dup_impl ( 2033struct ggml_context * ctx , 2034struct ggml_tensor * a , 2035bool inplace ) { 2036struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2037 2038result -> op = GGML_OP_DUP ; 2039result -> src [0 ]= a ; 2040 2041return result ; 2042} 2043 2044struct ggml_tensor * ggml_dup ( 2045struct ggml_context * ctx , 2046struct ggml_tensor * a ) { 2047return ggml_dup_impl (ctx ,a , false); 2048} 2049 2050struct ggml_tensor * ggml_dup_inplace ( 2051struct ggml_context * ctx , 2052struct ggml_tensor * a ) { 2053return ggml_dup_impl (ctx ,a , true); 2054} 2055 2056// ggml_add 2057 2058static struct ggml_tensor * ggml_add_impl ( 2059struct ggml_context * ctx , 2060struct ggml_tensor * a , 2061struct ggml_tensor * b , 2062bool inplace ) { 2063GGML_ASSERT (ggml_can_repeat (b ,a )); 2064 2065struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2066 2067result -> op = GGML_OP_ADD ; 2068result -> src [0 ]= a ; 2069result -> src [1 ]= b ; 2070 2071return result ; 2072} 2073 2074struct ggml_tensor * ggml_add ( 2075struct ggml_context * ctx , 2076struct ggml_tensor * a , 2077struct ggml_tensor * b ) { 2078return ggml_add_impl (ctx ,a ,b , false); 2079} 2080 2081struct ggml_tensor * ggml_add_inplace ( 2082struct ggml_context * ctx , 2083struct ggml_tensor * a , 2084struct ggml_tensor * b ) { 2085return ggml_add_impl (ctx ,a ,b , true); 2086} 2087 2088// ggml_add_cast 2089 2090static struct ggml_tensor * ggml_add_cast_impl ( 2091struct ggml_context * ctx , 2092struct ggml_tensor * a , 2093struct ggml_tensor * b , 2094enum ggml_type type ) { 2095// TODO: support less-strict constraint 2096// GGML_ASSERT(ggml_can_repeat(b, a)); 2097GGML_ASSERT (ggml_can_repeat_rows (b ,a )); 2098 2099// currently only supported for quantized input and f16 2100GGML_ASSERT (ggml_is_quantized (a -> type )|| 2101a -> type == GGML_TYPE_F16 || 2102a -> type == GGML_TYPE_BF16 ); 2103 2104struct ggml_tensor * result = ggml_new_tensor (ctx ,type ,GGML_MAX_DIMS ,a -> ne ); 2105 2106result -> op = GGML_OP_ADD ; 2107result -> src [0 ]= a ; 2108result -> src [1 ]= b ; 2109 2110return result ; 2111} 2112 2113struct ggml_tensor * ggml_add_cast ( 2114struct ggml_context * ctx , 2115struct ggml_tensor * a , 2116struct ggml_tensor * b , 2117enum ggml_type type ) { 2118return ggml_add_cast_impl (ctx ,a ,b ,type ); 2119} 2120 2121struct ggml_tensor * ggml_add_id ( 2122struct ggml_context * ctx , 2123struct ggml_tensor * a , 2124struct ggml_tensor * b , 2125struct ggml_tensor * ids ) { 2126 2127GGML_ASSERT (a -> ne [0 ]== b -> ne [0 ]); 2128GGML_ASSERT (a -> ne [1 ]== ids -> ne [0 ]); 2129GGML_ASSERT (a -> ne [2 ]== ids -> ne [1 ]); 2130GGML_ASSERT (ids -> type == GGML_TYPE_I32 ); 2131 2132struct ggml_tensor * result = ggml_dup_tensor (ctx ,a ); 2133 2134result -> op = GGML_OP_ADD_ID ; 2135result -> src [0 ]= a ; 2136result -> src [1 ]= b ; 2137result -> src [2 ]= ids ; 2138 2139return result ; 2140} 2141 2142// ggml_add1 2143 2144static struct ggml_tensor * ggml_add1_impl ( 2145struct ggml_context * ctx , 2146struct ggml_tensor * a , 2147struct ggml_tensor * b , 2148bool inplace ) { 2149GGML_ASSERT (ggml_is_scalar (b )); 2150GGML_ASSERT (ggml_is_padded_1d (a )); 2151 2152struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2153 2154result -> op = GGML_OP_ADD1 ; 2155result -> src [0 ]= a ; 2156result -> src [1 ]= b ; 2157 2158return result ; 2159} 2160 2161struct ggml_tensor * ggml_add1 ( 2162struct ggml_context * ctx , 2163struct ggml_tensor * a , 2164struct ggml_tensor * b ) { 2165return ggml_add1_impl (ctx ,a ,b , false); 2166} 2167 2168struct ggml_tensor * ggml_add1_inplace ( 2169struct ggml_context * ctx , 2170struct ggml_tensor * a , 2171struct ggml_tensor * b ) { 2172return ggml_add1_impl (ctx ,a ,b , true); 2173} 2174 2175// ggml_acc 2176 2177static struct ggml_tensor * ggml_acc_impl ( 2178struct ggml_context * ctx , 2179struct ggml_tensor * a , 2180struct ggml_tensor * b , 2181size_t nb1 , 2182size_t nb2 , 2183size_t nb3 , 2184size_t offset , 2185bool inplace ) { 2186GGML_ASSERT (ggml_nelements (b ) <=ggml_nelements (a )); 2187GGML_ASSERT (ggml_is_contiguous (a )); 2188GGML_ASSERT (a -> type == GGML_TYPE_F32 ); 2189GGML_ASSERT (b -> type == GGML_TYPE_F32 ); 2190 2191struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2192 2193int32_t params []= {nb1 ,nb2 ,nb3 ,offset ,inplace ?1 :0 }; 2194ggml_set_op_params (result ,params ,sizeof (params )); 2195 2196result -> op = GGML_OP_ACC ; 2197result -> src [0 ]= a ; 2198result -> src [1 ]= b ; 2199 2200return result ; 2201} 2202 2203struct ggml_tensor * ggml_acc ( 2204struct ggml_context * ctx , 2205struct ggml_tensor * a , 2206struct ggml_tensor * b , 2207size_t nb1 , 2208size_t nb2 , 2209size_t nb3 , 2210size_t offset ) { 2211return ggml_acc_impl (ctx ,a ,b ,nb1 ,nb2 ,nb3 ,offset , false); 2212} 2213 2214struct ggml_tensor * ggml_acc_inplace ( 2215struct ggml_context * ctx , 2216struct ggml_tensor * a , 2217struct ggml_tensor * b , 2218size_t nb1 , 2219size_t nb2 , 2220size_t nb3 , 2221size_t offset ) { 2222return ggml_acc_impl (ctx ,a ,b ,nb1 ,nb2 ,nb3 ,offset , true); 2223} 2224 2225// ggml_sub 2226 2227static struct ggml_tensor * ggml_sub_impl ( 2228struct ggml_context * ctx , 2229struct ggml_tensor * a , 2230struct ggml_tensor * b , 2231bool inplace ) { 2232GGML_ASSERT (ggml_can_repeat (b ,a )); 2233 2234struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2235 2236result -> op = GGML_OP_SUB ; 2237result -> src [0 ]= a ; 2238result -> src [1 ]= b ; 2239 2240return result ; 2241} 2242 2243struct ggml_tensor * ggml_sub ( 2244struct ggml_context * ctx , 2245struct ggml_tensor * a , 2246struct ggml_tensor * b ) { 2247return ggml_sub_impl (ctx ,a ,b , false); 2248} 2249 2250struct ggml_tensor * ggml_sub_inplace ( 2251struct ggml_context * ctx , 2252struct ggml_tensor * a , 2253struct ggml_tensor * b ) { 2254return ggml_sub_impl (ctx ,a ,b , true); 2255} 2256 2257// ggml_mul 2258 2259static struct ggml_tensor * ggml_mul_impl ( 2260struct ggml_context * ctx , 2261struct ggml_tensor * a , 2262struct ggml_tensor * b , 2263bool inplace ) { 2264GGML_ASSERT (ggml_can_repeat (b ,a )); 2265 2266struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2267 2268result -> op = GGML_OP_MUL ; 2269result -> src [0 ]= a ; 2270result -> src [1 ]= b ; 2271 2272return result ; 2273} 2274 2275struct ggml_tensor * ggml_mul ( 2276struct ggml_context * ctx , 2277struct ggml_tensor * a , 2278struct ggml_tensor * b ) { 2279return ggml_mul_impl (ctx ,a ,b , false); 2280} 2281 2282struct ggml_tensor * ggml_mul_inplace ( 2283struct ggml_context * ctx , 2284struct ggml_tensor * a , 2285struct ggml_tensor * b ) { 2286return ggml_mul_impl (ctx ,a ,b , true); 2287} 2288 2289// ggml_div 2290 2291static struct ggml_tensor * ggml_div_impl ( 2292struct ggml_context * ctx , 2293struct ggml_tensor * a , 2294struct ggml_tensor * b , 2295bool inplace ) { 2296GGML_ASSERT (ggml_can_repeat (b ,a )); 2297 2298struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2299 2300result -> op = GGML_OP_DIV ; 2301result -> src [0 ]= a ; 2302result -> src [1 ]= b ; 2303 2304return result ; 2305} 2306 2307struct ggml_tensor * ggml_div ( 2308struct ggml_context * ctx , 2309struct ggml_tensor * a , 2310struct ggml_tensor * b ) { 2311return ggml_div_impl (ctx ,a ,b , false); 2312} 2313 2314struct ggml_tensor * ggml_div_inplace ( 2315struct ggml_context * ctx , 2316struct ggml_tensor * a , 2317struct ggml_tensor * b ) { 2318return ggml_div_impl (ctx ,a ,b , true); 2319} 2320 2321// ggml_sqr 2322 2323static struct ggml_tensor * ggml_sqr_impl ( 2324struct ggml_context * ctx , 2325struct ggml_tensor * a , 2326bool inplace ) { 2327struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2328 2329result -> op = GGML_OP_SQR ; 2330result -> src [0 ]= a ; 2331 2332return result ; 2333} 2334 2335struct ggml_tensor * ggml_sqr ( 2336struct ggml_context * ctx , 2337struct ggml_tensor * a ) { 2338return ggml_sqr_impl (ctx ,a , false); 2339} 2340 2341struct ggml_tensor * ggml_sqr_inplace ( 2342struct ggml_context * ctx , 2343struct ggml_tensor * a ) { 2344return ggml_sqr_impl (ctx ,a , true); 2345} 2346 2347// ggml_sqrt 2348 2349static struct ggml_tensor * ggml_sqrt_impl ( 2350struct ggml_context * ctx , 2351struct ggml_tensor * a , 2352bool inplace ) { 2353struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2354 2355result -> op = GGML_OP_SQRT ; 2356result -> src [0 ]= a ; 2357 2358return result ; 2359} 2360 2361struct ggml_tensor * ggml_sqrt ( 2362struct ggml_context * ctx , 2363struct ggml_tensor * a ) { 2364return ggml_sqrt_impl (ctx ,a , false); 2365} 2366 2367struct ggml_tensor * ggml_sqrt_inplace ( 2368struct ggml_context * ctx , 2369struct ggml_tensor * a ) { 2370return ggml_sqrt_impl (ctx ,a , true); 2371} 2372 2373// ggml_log 2374 2375static struct ggml_tensor * ggml_log_impl ( 2376struct ggml_context * ctx , 2377struct ggml_tensor * a , 2378bool inplace ) { 2379struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2380 2381result -> op = GGML_OP_LOG ; 2382result -> src [0 ]= a ; 2383 2384return result ; 2385} 2386 2387struct ggml_tensor * ggml_log ( 2388struct ggml_context * ctx , 2389struct ggml_tensor * a ) { 2390return ggml_log_impl (ctx ,a , false); 2391} 2392 2393struct ggml_tensor * ggml_log_inplace ( 2394struct ggml_context * ctx , 2395struct ggml_tensor * a ) { 2396return ggml_log_impl (ctx ,a , true); 2397} 2398 2399struct ggml_tensor * ggml_expm1 ( 2400struct ggml_context * ctx , 2401struct ggml_tensor * a ) { 2402return ggml_unary (ctx ,a ,GGML_UNARY_OP_EXPM1 ); 2403} 2404 2405struct ggml_tensor * ggml_expm1_inplace ( 2406struct ggml_context * ctx , 2407struct ggml_tensor * a ) { 2408return ggml_unary_inplace (ctx ,a ,GGML_UNARY_OP_EXPM1 ); 2409} 2410 2411struct ggml_tensor * ggml_softplus ( 2412struct ggml_context * ctx , 2413struct ggml_tensor * a ) { 2414return ggml_unary (ctx ,a ,GGML_UNARY_OP_SOFTPLUS ); 2415} 2416 2417struct ggml_tensor * ggml_softplus_inplace ( 2418struct ggml_context * ctx , 2419struct ggml_tensor * a ) { 2420return ggml_unary_inplace (ctx ,a ,GGML_UNARY_OP_SOFTPLUS ); 2421} 2422 2423// ggml_sin 2424 2425static struct ggml_tensor * ggml_sin_impl ( 2426struct ggml_context * ctx , 2427struct ggml_tensor * a , 2428bool inplace ) { 2429struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2430 2431result -> op = GGML_OP_SIN ; 2432result -> src [0 ]= a ; 2433 2434return result ; 2435} 2436 2437struct ggml_tensor * ggml_sin ( 2438struct ggml_context * ctx , 2439struct ggml_tensor * a ) { 2440return ggml_sin_impl (ctx ,a , false); 2441} 2442 2443struct ggml_tensor * ggml_sin_inplace ( 2444struct ggml_context * ctx , 2445struct ggml_tensor * a ) { 2446return ggml_sin_impl (ctx ,a , true); 2447} 2448 2449// ggml_cos 2450 2451static struct ggml_tensor * ggml_cos_impl ( 2452struct ggml_context * ctx , 2453struct ggml_tensor * a , 2454bool inplace ) { 2455struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2456 2457result -> op = GGML_OP_COS ; 2458result -> src [0 ]= a ; 2459 2460return result ; 2461} 2462 2463struct ggml_tensor * ggml_cos ( 2464struct ggml_context * ctx , 2465struct ggml_tensor * a ) { 2466return ggml_cos_impl (ctx ,a , false); 2467} 2468 2469struct ggml_tensor * ggml_cos_inplace ( 2470struct ggml_context * ctx , 2471struct ggml_tensor * a ) { 2472return ggml_cos_impl (ctx ,a , true); 2473} 2474 2475// ggml_sum 2476 2477struct ggml_tensor * ggml_sum ( 2478struct ggml_context * ctx , 2479struct ggml_tensor * a ) { 2480struct ggml_tensor * result = ggml_new_tensor_1d (ctx ,a -> type ,1 ); 2481 2482result -> op = GGML_OP_SUM ; 2483result -> src [0 ]= a ; 2484 2485return result ; 2486} 2487 2488// ggml_sum_rows 2489 2490struct ggml_tensor * ggml_sum_rows ( 2491struct ggml_context * ctx , 2492struct ggml_tensor * a ) { 2493int64_t ne [GGML_MAX_DIMS ]= {1 }; 2494for (int i = 1 ;i < GGML_MAX_DIMS ;++ i ) { 2495ne [i ]= a -> ne [i ]; 2496 } 2497 2498struct ggml_tensor * result = ggml_new_tensor (ctx ,a -> type ,GGML_MAX_DIMS ,ne ); 2499 2500result -> op = GGML_OP_SUM_ROWS ; 2501result -> src [0 ]= a ; 2502 2503return result ; 2504} 2505 2506// ggml_cumsum 2507 2508struct ggml_tensor * ggml_cumsum ( 2509struct ggml_context * ctx , 2510struct ggml_tensor * a ) { 2511GGML_ASSERT (a -> type == GGML_TYPE_F32 ); 2512 2513struct ggml_tensor * result = ggml_dup_tensor (ctx ,a ); 2514 2515result -> op = GGML_OP_CUMSUM ; 2516result -> src [0 ]= a ; 2517 2518return result ; 2519} 2520 2521// ggml_mean 2522 2523struct ggml_tensor * ggml_mean ( 2524struct ggml_context * ctx , 2525struct ggml_tensor * a ) { 2526int64_t ne [4 ]= {1 ,a -> ne [1 ],a -> ne [2 ],a -> ne [3 ] }; 2527struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,4 ,ne ); 2528 2529result -> op = GGML_OP_MEAN ; 2530result -> src [0 ]= a ; 2531 2532return result ; 2533} 2534 2535// ggml_argmax 2536 2537struct ggml_tensor * ggml_argmax ( 2538struct ggml_context * ctx , 2539struct ggml_tensor * a ) { 2540GGML_ASSERT (ggml_is_matrix (a )); 2541GGML_ASSERT (a -> ne [0 ] <=INT32_MAX ); 2542 2543struct ggml_tensor * result = ggml_new_tensor_1d (ctx ,GGML_TYPE_I32 ,a -> ne [1 ]); 2544 2545result -> op = GGML_OP_ARGMAX ; 2546result -> src [0 ]= a ; 2547 2548return result ; 2549} 2550 2551// ggml_count_equal 2552 2553struct ggml_tensor * ggml_count_equal ( 2554struct ggml_context * ctx , 2555struct ggml_tensor * a , 2556struct ggml_tensor * b ) { 2557GGML_ASSERT (ggml_are_same_shape (a ,b )); 2558 2559struct ggml_tensor * result = ggml_new_tensor_1d (ctx ,GGML_TYPE_I64 ,1 ); 2560 2561result -> op = GGML_OP_COUNT_EQUAL ; 2562result -> src [0 ]= a ; 2563result -> src [1 ]= b ; 2564 2565return result ; 2566} 2567 2568// ggml_repeat 2569 2570struct ggml_tensor * ggml_repeat ( 2571struct ggml_context * ctx , 2572struct ggml_tensor * a , 2573struct ggml_tensor * b ) { 2574GGML_ASSERT (ggml_can_repeat (a ,b )); 2575 2576struct ggml_tensor * result = ggml_new_tensor (ctx ,a -> type ,GGML_MAX_DIMS ,b -> ne ); 2577 2578result -> op = GGML_OP_REPEAT ; 2579result -> src [0 ]= a ; 2580 2581return result ; 2582} 2583 2584struct ggml_tensor * ggml_repeat_4d ( 2585struct ggml_context * ctx , 2586struct ggml_tensor * a , 2587int64_t ne0 ,int64_t ne1 ,int64_t ne2 ,int64_t ne3 ) { 2588const bool can_repeat = ggml_is_empty (a )|| ( 2589 (ne0 %a -> ne [0 ]== 0 )&& 2590 (ne1 %a -> ne [1 ]== 0 )&& 2591 (ne2 %a -> ne [2 ]== 0 )&& 2592 (ne3 %a -> ne [3 ]== 0 ) 2593 ); 2594GGML_ASSERT (can_repeat ); 2595 2596struct ggml_tensor * result = ggml_new_tensor_4d (ctx ,a -> type ,ne0 ,ne1 ,ne2 ,ne3 ); 2597 2598result -> op = GGML_OP_REPEAT ; 2599result -> src [0 ]= a ; 2600 2601return result ; 2602} 2603 2604// ggml_repeat_back 2605 2606struct ggml_tensor * ggml_repeat_back ( 2607struct ggml_context * ctx , 2608struct ggml_tensor * a , 2609struct ggml_tensor * b ) { 2610GGML_ASSERT (ggml_can_repeat (b ,a )); 2611 2612struct ggml_tensor * result = ggml_new_tensor (ctx ,a -> type ,GGML_MAX_DIMS ,b -> ne ); 2613 2614result -> op = GGML_OP_REPEAT_BACK ; 2615result -> src [0 ]= a ; 2616 2617return result ; 2618} 2619 2620// ggml_concat 2621 2622struct ggml_tensor * ggml_concat ( 2623struct ggml_context * ctx , 2624struct ggml_tensor * a , 2625struct ggml_tensor * b , 2626int dim ) { 2627GGML_ASSERT (dim >=0 && dim < GGML_MAX_DIMS ); 2628GGML_ASSERT (a -> type == b -> type ); 2629 2630int64_t ne [GGML_MAX_DIMS ]; 2631for (int d = 0 ;d < GGML_MAX_DIMS ;++ d ) { 2632if (d == dim ) { 2633ne [d ]= a -> ne [d ]+ b -> ne [d ]; 2634continue ; 2635 } 2636GGML_ASSERT (a -> ne [d ]== b -> ne [d ]); 2637ne [d ]= a -> ne [d ]; 2638 } 2639 2640struct ggml_tensor * result = ggml_new_tensor (ctx ,a -> type ,GGML_MAX_DIMS ,ne ); 2641 2642ggml_set_op_params_i32 (result ,0 ,dim ); 2643 2644result -> op = GGML_OP_CONCAT ; 2645result -> src [0 ]= a ; 2646result -> src [1 ]= b ; 2647 2648return result ; 2649} 2650 2651// ggml_abs 2652 2653struct ggml_tensor * ggml_abs ( 2654struct ggml_context * ctx , 2655struct ggml_tensor * a ) { 2656return ggml_unary (ctx ,a ,GGML_UNARY_OP_ABS ); 2657} 2658 2659struct ggml_tensor * ggml_abs_inplace ( 2660struct ggml_context * ctx , 2661struct ggml_tensor * a ) { 2662return ggml_unary_inplace (ctx ,a ,GGML_UNARY_OP_ABS ); 2663} 2664 2665// ggml_sgn 2666 2667struct ggml_tensor * ggml_sgn ( 2668struct ggml_context * ctx , 2669struct ggml_tensor * a ) { 2670return ggml_unary (ctx ,a ,GGML_UNARY_OP_SGN ); 2671} 2672 2673struct ggml_tensor * ggml_sgn_inplace ( 2674struct ggml_context * ctx , 2675struct ggml_tensor * a ) { 2676return ggml_unary_inplace (ctx ,a ,GGML_UNARY_OP_SGN ); 2677} 2678 2679// ggml_neg 2680 2681struct ggml_tensor * ggml_neg ( 2682struct ggml_context * ctx , 2683struct ggml_tensor * a ) { 2684return ggml_unary (ctx ,a ,GGML_UNARY_OP_NEG ); 2685} 2686 2687struct ggml_tensor * ggml_neg_inplace ( 2688struct ggml_context * ctx , 2689struct ggml_tensor * a ) { 2690return ggml_unary_inplace (ctx ,a ,GGML_UNARY_OP_NEG ); 2691} 2692 2693// ggml_step 2694 2695struct ggml_tensor * ggml_step ( 2696struct ggml_context * ctx , 2697struct ggml_tensor * a ) { 2698return ggml_unary (ctx ,a ,GGML_UNARY_OP_STEP ); 2699} 2700 2701struct ggml_tensor * ggml_step_inplace ( 2702struct ggml_context * ctx , 2703struct ggml_tensor * a ) { 2704return ggml_unary_inplace (ctx ,a ,GGML_UNARY_OP_STEP ); 2705} 2706 2707// ggml_tanh 2708 2709struct ggml_tensor * ggml_tanh ( 2710struct ggml_context * ctx , 2711struct ggml_tensor * a ) { 2712return ggml_unary (ctx ,a ,GGML_UNARY_OP_TANH ); 2713} 2714 2715struct ggml_tensor * ggml_tanh_inplace ( 2716struct ggml_context * ctx , 2717struct ggml_tensor * a ) { 2718return ggml_unary_inplace (ctx ,a ,GGML_UNARY_OP_TANH ); 2719} 2720 2721// ggml_elu 2722 2723struct ggml_tensor * ggml_elu ( 2724struct ggml_context * ctx , 2725struct ggml_tensor * a ) { 2726return ggml_unary (ctx ,a ,GGML_UNARY_OP_ELU ); 2727} 2728 2729struct ggml_tensor * ggml_elu_inplace ( 2730struct ggml_context * ctx , 2731struct ggml_tensor * a ) { 2732return ggml_unary_inplace (ctx ,a ,GGML_UNARY_OP_ELU ); 2733} 2734 2735// ggml_relu 2736 2737struct ggml_tensor * ggml_relu ( 2738struct ggml_context * ctx , 2739struct ggml_tensor * a ) { 2740return ggml_unary (ctx ,a ,GGML_UNARY_OP_RELU ); 2741} 2742 2743struct ggml_tensor * ggml_relu_inplace ( 2744struct ggml_context * ctx , 2745struct ggml_tensor * a ) { 2746return ggml_unary_inplace (ctx ,a ,GGML_UNARY_OP_RELU ); 2747} 2748 2749// ggml_leaky_relu 2750 2751struct ggml_tensor * ggml_leaky_relu ( 2752struct ggml_context * ctx , 2753struct ggml_tensor * a , 2754float negative_slope , 2755bool inplace ) { 2756struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 2757 2758ggml_set_op_params (result ,& negative_slope ,sizeof (negative_slope )); 2759 2760result -> op = GGML_OP_LEAKY_RELU ; 2761result -> src [0 ]= a ; 2762 2763return result ; 2764} 2765 2766// ggml_sigmoid 2767 2768struct ggml_tensor * ggml_sigmoid ( 2769struct ggml_context * ctx , 2770struct ggml_tensor * a ) { 2771return ggml_unary (ctx ,a ,GGML_UNARY_OP_SIGMOID ); 2772} 2773 2774struct ggml_tensor * ggml_sigmoid_inplace ( 2775struct ggml_context * ctx , 2776struct ggml_tensor * a ) { 2777return ggml_unary_inplace (ctx ,a ,GGML_UNARY_OP_SIGMOID ); 2778} 2779 2780// ggml_gelu 2781 2782struct ggml_tensor * ggml_gelu ( 2783struct ggml_context * ctx , 2784struct ggml_tensor * a ) { 2785return ggml_unary (ctx ,a ,GGML_UNARY_OP_GELU ); 2786} 2787 2788struct ggml_tensor * ggml_gelu_inplace ( 2789struct ggml_context * ctx , 2790struct ggml_tensor * a ) { 2791return ggml_unary_inplace (ctx ,a ,GGML_UNARY_OP_GELU ); 2792} 2793 2794// ggml_gelu_erf 2795 2796struct ggml_tensor * ggml_gelu_erf ( 2797struct ggml_context * ctx , 2798struct ggml_tensor * a ) { 2799return ggml_unary (ctx ,a ,GGML_UNARY_OP_GELU_ERF ); 2800} 2801 2802struct ggml_tensor * ggml_gelu_erf_inplace ( 2803struct ggml_context * ctx , 2804struct ggml_tensor * a ) { 2805return ggml_unary_inplace (ctx ,a ,GGML_UNARY_OP_GELU_ERF ); 2806} 2807 2808// ggml_gelu_quick 2809 2810struct ggml_tensor * ggml_gelu_quick ( 2811struct ggml_context * ctx , 2812struct ggml_tensor * a ) { 2813return ggml_unary (ctx ,a ,GGML_UNARY_OP_GELU_QUICK ); 2814} 2815 2816struct ggml_tensor * ggml_gelu_quick_inplace ( 2817struct ggml_context * ctx , 2818struct ggml_tensor * a ) { 2819return ggml_unary_inplace (ctx ,a ,GGML_UNARY_OP_GELU_QUICK ); 2820} 2821 2822// ggml_silu 2823 2824struct ggml_tensor * ggml_silu ( 2825struct ggml_context * ctx , 2826struct ggml_tensor * a ) { 2827return ggml_unary (ctx ,a ,GGML_UNARY_OP_SILU ); 2828} 2829 2830struct ggml_tensor * ggml_silu_inplace ( 2831struct ggml_context * ctx , 2832struct ggml_tensor * a ) { 2833return ggml_unary_inplace (ctx ,a ,GGML_UNARY_OP_SILU ); 2834} 2835 2836// ggml_xielu 2837 2838struct ggml_tensor * ggml_xielu ( 2839struct ggml_context * ctx , 2840struct ggml_tensor * a , 2841float alpha_n , 2842float alpha_p , 2843float beta , 2844float eps ) { 2845struct ggml_tensor * result = ggml_dup_tensor (ctx ,a ); 2846 2847ggml_set_op_params_i32 (result ,0 , (int32_t )GGML_UNARY_OP_XIELU ); 2848ggml_set_op_params_f32 (result ,1 ,beta + ggml_compute_softplus_f32 (alpha_n )); 2849ggml_set_op_params_f32 (result ,2 ,ggml_compute_softplus_f32 (alpha_p )); 2850ggml_set_op_params_f32 (result ,3 ,beta ); 2851ggml_set_op_params_f32 (result ,4 ,eps ); 2852 2853result -> op = GGML_OP_UNARY ; 2854result -> src [0 ]= a ; 2855 2856return result ; 2857} 2858 2859// ggml_silu_back 2860 2861struct ggml_tensor * ggml_silu_back ( 2862struct ggml_context * ctx , 2863struct ggml_tensor * a , 2864struct ggml_tensor * b ) { 2865struct ggml_tensor * result = ggml_dup_tensor (ctx ,a ); 2866 2867result -> op = GGML_OP_SILU_BACK ; 2868result -> src [0 ]= a ; 2869result -> src [1 ]= b ; 2870 2871return result ; 2872} 2873 2874// ggml hardswish 2875 2876struct ggml_tensor * ggml_hardswish ( 2877struct ggml_context * ctx , 2878struct ggml_tensor * a ) { 2879return ggml_unary (ctx ,a ,GGML_UNARY_OP_HARDSWISH ); 2880} 2881 2882// ggml hardsigmoid 2883 2884struct ggml_tensor * ggml_hardsigmoid ( 2885struct ggml_context * ctx , 2886struct ggml_tensor * a ) { 2887return ggml_unary (ctx ,a ,GGML_UNARY_OP_HARDSIGMOID ); 2888} 2889 2890// ggml exp 2891 2892struct ggml_tensor * ggml_exp ( 2893struct ggml_context * ctx , 2894struct ggml_tensor * a ) { 2895return ggml_unary (ctx ,a ,GGML_UNARY_OP_EXP ); 2896} 2897 2898struct ggml_tensor * ggml_exp_inplace ( 2899struct ggml_context * ctx , 2900struct ggml_tensor * a ) { 2901return ggml_unary_inplace (ctx ,a ,GGML_UNARY_OP_EXP ); 2902} 2903 2904// ggml_glu 2905 2906static struct ggml_tensor * ggml_glu_impl ( 2907struct ggml_context * ctx , 2908struct ggml_tensor * a , 2909struct ggml_tensor * b , 2910enum ggml_glu_op op , 2911bool swapped ) { 2912GGML_ASSERT (ggml_is_contiguous_1 (a )); 2913 2914if (b ) { 2915GGML_ASSERT (ggml_is_contiguous_1 (b )); 2916GGML_ASSERT (ggml_are_same_shape (a ,b )); 2917GGML_ASSERT (a -> type == b -> type ); 2918 } 2919 2920int64_t ne [GGML_MAX_DIMS ]= {a -> ne [0 ] /2 };for (int i = 1 ;i < GGML_MAX_DIMS ;i ++ )ne [i ]= a -> ne [i ]; 2921struct ggml_tensor * result = ggml_new_tensor_impl (ctx ,a -> type ,GGML_MAX_DIMS ,b ?a -> ne :ne ,NULL ,0 ); 2922 2923ggml_set_op_params_i32 (result ,0 , (int32_t )op ); 2924ggml_set_op_params_i32 (result ,1 , (int32_t )swapped ); 2925 2926result -> op = GGML_OP_GLU ; 2927result -> src [0 ]= a ; 2928result -> src [1 ]= b ; 2929 2930return result ; 2931} 2932 2933// ggml_floor 2934 2935struct ggml_tensor * ggml_floor ( 2936struct ggml_context * ctx , 2937struct ggml_tensor * a ) { 2938return ggml_unary (ctx ,a ,GGML_UNARY_OP_FLOOR ); 2939} 2940 2941struct ggml_tensor * ggml_floor_inplace ( 2942struct ggml_context * ctx , 2943struct ggml_tensor * a ) { 2944return ggml_unary_inplace (ctx ,a ,GGML_UNARY_OP_FLOOR ); 2945} 2946 2947// ggml_ceil 2948 2949struct ggml_tensor * ggml_ceil ( 2950struct ggml_context * ctx , 2951struct ggml_tensor * a ) { 2952return ggml_unary (ctx ,a ,GGML_UNARY_OP_CEIL ); 2953} 2954 2955struct ggml_tensor * ggml_ceil_inplace ( 2956struct ggml_context * ctx , 2957struct ggml_tensor * a ) { 2958return ggml_unary_inplace (ctx ,a ,GGML_UNARY_OP_CEIL ); 2959} 2960 2961//ggml_round 2962 2963struct ggml_tensor * ggml_round ( 2964struct ggml_context * ctx , 2965struct ggml_tensor * a ) { 2966return ggml_unary (ctx ,a ,GGML_UNARY_OP_ROUND ); 2967} 2968 2969struct ggml_tensor * ggml_round_inplace ( 2970struct ggml_context * ctx , 2971struct ggml_tensor * a ) { 2972return ggml_unary_inplace (ctx ,a ,GGML_UNARY_OP_ROUND ); 2973} 2974 2975//ggml_trunc 2976 2977struct ggml_tensor * ggml_trunc ( 2978struct ggml_context * ctx , 2979struct ggml_tensor * a ) { 2980return ggml_unary (ctx ,a ,GGML_UNARY_OP_TRUNC ); 2981} 2982 2983struct ggml_tensor * ggml_trunc_inplace ( 2984struct ggml_context * ctx , 2985struct ggml_tensor * a ) { 2986return ggml_unary_inplace (ctx ,a ,GGML_UNARY_OP_TRUNC ); 2987} 2988 2989struct ggml_tensor * ggml_glu ( 2990struct ggml_context * ctx , 2991struct ggml_tensor * a , 2992enum ggml_glu_op op , 2993bool swapped ) { 2994return ggml_glu_impl (ctx ,a ,NULL ,op ,swapped ); 2995} 2996 2997struct ggml_tensor * ggml_glu_split ( 2998struct ggml_context * ctx , 2999struct ggml_tensor * a , 3000struct ggml_tensor * b , 3001enum ggml_glu_op op ) { 3002return ggml_glu_impl (ctx ,a ,b ,op , false); 3003} 3004 3005// ggml_reglu 3006 3007struct ggml_tensor * ggml_reglu ( 3008struct ggml_context * ctx , 3009struct ggml_tensor * a ) { 3010return ggml_glu_impl (ctx ,a ,NULL ,GGML_GLU_OP_REGLU , false); 3011} 3012 3013struct ggml_tensor * ggml_reglu_swapped ( 3014struct ggml_context * ctx , 3015struct ggml_tensor * a ) { 3016return ggml_glu_impl (ctx ,a ,NULL ,GGML_GLU_OP_REGLU , true); 3017} 3018 3019struct ggml_tensor * ggml_reglu_split ( 3020struct ggml_context * ctx , 3021struct ggml_tensor * a , 3022struct ggml_tensor * b ) { 3023return ggml_glu_impl (ctx ,a ,b ,GGML_GLU_OP_REGLU , false); 3024} 3025 3026// ggml_geglu 3027 3028struct ggml_tensor * ggml_geglu ( 3029struct ggml_context * ctx , 3030struct ggml_tensor * a ) { 3031return ggml_glu_impl (ctx ,a ,NULL ,GGML_GLU_OP_GEGLU , false); 3032} 3033 3034struct ggml_tensor * ggml_geglu_swapped ( 3035struct ggml_context * ctx , 3036struct ggml_tensor * a ) { 3037return ggml_glu_impl (ctx ,a ,NULL ,GGML_GLU_OP_GEGLU , true); 3038} 3039 3040struct ggml_tensor * ggml_geglu_split ( 3041struct ggml_context * ctx , 3042struct ggml_tensor * a , 3043struct ggml_tensor * b ) { 3044return ggml_glu_impl (ctx ,a ,b ,GGML_GLU_OP_GEGLU , false); 3045} 3046 3047// ggml_swiglu 3048 3049struct ggml_tensor * ggml_swiglu ( 3050struct ggml_context * ctx , 3051struct ggml_tensor * a ) { 3052return ggml_glu_impl (ctx ,a ,NULL ,GGML_GLU_OP_SWIGLU , false); 3053} 3054 3055struct ggml_tensor * ggml_swiglu_swapped ( 3056struct ggml_context * ctx , 3057struct ggml_tensor * a ) { 3058return ggml_glu_impl (ctx ,a ,NULL ,GGML_GLU_OP_SWIGLU , true); 3059} 3060 3061struct ggml_tensor * ggml_swiglu_split ( 3062struct ggml_context * ctx , 3063struct ggml_tensor * a , 3064struct ggml_tensor * b ) { 3065return ggml_glu_impl (ctx ,a ,b ,GGML_GLU_OP_SWIGLU , false); 3066} 3067 3068// ggml_geglu_erf 3069 3070struct ggml_tensor * ggml_geglu_erf ( 3071struct ggml_context * ctx , 3072struct ggml_tensor * a ) { 3073return ggml_glu_impl (ctx ,a ,NULL ,GGML_GLU_OP_GEGLU_ERF , false); 3074} 3075 3076struct ggml_tensor * ggml_geglu_erf_swapped ( 3077struct ggml_context * ctx , 3078struct ggml_tensor * a ) { 3079return ggml_glu_impl (ctx ,a ,NULL ,GGML_GLU_OP_GEGLU_ERF , true); 3080} 3081 3082struct ggml_tensor * ggml_geglu_erf_split ( 3083struct ggml_context * ctx , 3084struct ggml_tensor * a , 3085struct ggml_tensor * b ) { 3086return ggml_glu_impl (ctx ,a ,b ,GGML_GLU_OP_GEGLU_ERF , false); 3087} 3088 3089// ggml_geglu_quick 3090 3091struct ggml_tensor * ggml_geglu_quick ( 3092struct ggml_context * ctx , 3093struct ggml_tensor * a ) { 3094return ggml_glu_impl (ctx ,a ,NULL ,GGML_GLU_OP_GEGLU_QUICK , false); 3095} 3096 3097struct ggml_tensor * ggml_geglu_quick_swapped ( 3098struct ggml_context * ctx , 3099struct ggml_tensor * a ) { 3100return ggml_glu_impl (ctx ,a ,NULL ,GGML_GLU_OP_GEGLU_QUICK , true); 3101} 3102 3103struct ggml_tensor * ggml_geglu_quick_split ( 3104struct ggml_context * ctx , 3105struct ggml_tensor * a , 3106struct ggml_tensor * b ) { 3107return ggml_glu_impl (ctx ,a ,b ,GGML_GLU_OP_GEGLU_QUICK , false); 3108} 3109 3110struct ggml_tensor * ggml_swiglu_oai ( 3111struct ggml_context * ctx , 3112struct ggml_tensor * a , 3113struct ggml_tensor * b , 3114float alpha , 3115float limit ) { 3116struct ggml_tensor * result = ggml_glu_impl (ctx ,a ,b ,GGML_GLU_OP_SWIGLU_OAI , false); 3117ggml_set_op_params_f32 (result ,2 ,alpha ); 3118ggml_set_op_params_f32 (result ,3 ,limit ); 3119 3120return result ; 3121} 3122 3123struct ggml_tensor * ggml_swiglu_clamp ( 3124struct ggml_context * ctx , 3125struct ggml_tensor * a , 3126struct ggml_tensor * b , 3127float limit ) { 3128struct ggml_tensor * result = ggml_glu_impl (ctx ,a ,b ,GGML_GLU_OP_SWIGLU_CLAMP , false); 3129ggml_set_op_params_f32 (result ,3 ,limit ); 3130 3131return result ; 3132} 3133 3134// ggml_norm 3135 3136static struct ggml_tensor * ggml_norm_impl ( 3137struct ggml_context * ctx , 3138struct ggml_tensor * a , 3139float eps , 3140bool inplace ) { 3141struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 3142 3143ggml_set_op_params (result ,& eps ,sizeof (eps )); 3144 3145result -> op = GGML_OP_NORM ; 3146result -> src [0 ]= a ; 3147 3148return result ; 3149} 3150 3151struct ggml_tensor * ggml_norm ( 3152struct ggml_context * ctx , 3153struct ggml_tensor * a , 3154float eps ) { 3155return ggml_norm_impl (ctx ,a ,eps , false); 3156} 3157 3158struct ggml_tensor * ggml_norm_inplace ( 3159struct ggml_context * ctx , 3160struct ggml_tensor * a , 3161float eps ) { 3162return ggml_norm_impl (ctx ,a ,eps , true); 3163} 3164 3165// ggml_rms_norm 3166 3167static struct ggml_tensor * ggml_rms_norm_impl ( 3168struct ggml_context * ctx , 3169struct ggml_tensor * a , 3170float eps , 3171bool inplace ) { 3172struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 3173 3174ggml_set_op_params (result ,& eps ,sizeof (eps )); 3175 3176result -> op = GGML_OP_RMS_NORM ; 3177result -> src [0 ]= a ; 3178 3179return result ; 3180} 3181 3182struct ggml_tensor * ggml_rms_norm ( 3183struct ggml_context * ctx , 3184struct ggml_tensor * a , 3185float eps ) { 3186return ggml_rms_norm_impl (ctx ,a ,eps , false); 3187} 3188 3189struct ggml_tensor * ggml_rms_norm_inplace ( 3190struct ggml_context * ctx , 3191struct ggml_tensor * a , 3192float eps ) { 3193return ggml_rms_norm_impl (ctx ,a ,eps , true); 3194} 3195 3196// ggml_rms_norm_back 3197 3198struct ggml_tensor * ggml_rms_norm_back ( 3199struct ggml_context * ctx , 3200struct ggml_tensor * a , 3201struct ggml_tensor * b , 3202float eps ) { 3203struct ggml_tensor * result = ggml_dup_tensor (ctx ,a ); 3204 3205ggml_set_op_params (result ,& eps ,sizeof (eps )); 3206 3207result -> op = GGML_OP_RMS_NORM_BACK ; 3208result -> src [0 ]= a ; 3209result -> src [1 ]= b ; 3210 3211return result ; 3212} 3213 3214// ggml_group_norm 3215 3216static struct ggml_tensor * ggml_group_norm_impl ( 3217struct ggml_context * ctx , 3218struct ggml_tensor * a , 3219int n_groups , 3220float eps , 3221bool inplace ) { 3222struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 3223 3224ggml_set_op_params_i32 (result ,0 ,n_groups ); 3225ggml_set_op_params_f32 (result ,1 ,eps ); 3226 3227result -> op = GGML_OP_GROUP_NORM ; 3228result -> src [0 ]= a ; 3229 3230return result ; 3231} 3232 3233struct ggml_tensor * ggml_group_norm ( 3234struct ggml_context * ctx , 3235struct ggml_tensor * a , 3236int n_groups , 3237float eps ) { 3238return ggml_group_norm_impl (ctx ,a ,n_groups ,eps , false); 3239} 3240 3241struct ggml_tensor * ggml_group_norm_inplace ( 3242struct ggml_context * ctx , 3243struct ggml_tensor * a , 3244int n_groups , 3245float eps ) { 3246return ggml_group_norm_impl (ctx ,a ,n_groups ,eps , true); 3247} 3248 3249// ggml_l2_norm 3250 3251static struct ggml_tensor * ggml_l2_norm_impl ( 3252struct ggml_context * ctx , 3253struct ggml_tensor * a , 3254float eps , 3255bool inplace ) { 3256struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 3257 3258ggml_set_op_params_f32 (result ,0 ,eps ); 3259 3260result -> op = GGML_OP_L2_NORM ; 3261result -> src [0 ]= a ; 3262 3263return result ; 3264} 3265 3266struct ggml_tensor * ggml_l2_norm ( 3267struct ggml_context * ctx , 3268struct ggml_tensor * a , 3269float eps ) { 3270return ggml_l2_norm_impl (ctx ,a ,eps , false); 3271} 3272 3273struct ggml_tensor * ggml_l2_norm_inplace ( 3274struct ggml_context * ctx , 3275struct ggml_tensor * a , 3276float eps ) { 3277return ggml_l2_norm_impl (ctx ,a ,eps , true); 3278} 3279 3280// ggml_prec 3281 3282bool ggml_prec_set_acc ( 3283struct ggml_tensor * a , 3284enum ggml_prec prec ) { 3285switch (a -> op ) { 3286case GGML_OP_MUL_MAT : 3287case GGML_OP_MUL_MAT_ID : 3288 { 3289const int32_t prec_i32 = (int32_t )prec ; 3290ggml_set_op_params_i32 (a ,0 ,prec_i32 ); 3291 } 3292break ; 3293case GGML_OP_FLASH_ATTN_EXT : 3294 { 3295const int32_t prec_i32 = (int32_t )prec ; 3296ggml_set_op_params_i32 (a ,3 ,prec_i32 ); 3297 } 3298break ; 3299default : 3300return false; 3301 }; 3302 3303return true; 3304} 3305 3306bool ggml_prec_set_src ( 3307struct ggml_tensor * a , 3308enum ggml_prec prec , 3309int idx ) { 3310GGML_ASSERT (idx >=0 && idx < GGML_MAX_SRC ); 3311 3312switch (a -> op ) { 3313case GGML_OP_MUL_MAT : 3314case GGML_OP_MUL_MAT_ID : 3315 { 3316if (idx != 1 ) { 3317return false; 3318 } 3319 3320const int32_t prec_i32 = (int32_t )prec ; 3321ggml_set_op_params_i32 (a ,2 + idx ,prec_i32 ); 3322 } 3323break ; 3324default : 3325return false; 3326 }; 3327 3328return true; 3329} 3330 3331// ggml_mul_mat 3332 3333static inline bool ggml_can_mul_mat (const struct ggml_tensor * t0 ,const struct ggml_tensor * t1 ) { 3334static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 3335 3336return (t0 -> ne [0 ]== t1 -> ne [0 ])&& 3337 (t1 -> ne [2 ]%t0 -> ne [2 ]== 0 )&& // verify t0 is broadcastable 3338 (t1 -> ne [3 ]%t0 -> ne [3 ]== 0 ); 3339} 3340 3341struct ggml_tensor * ggml_mul_mat ( 3342struct ggml_context * ctx , 3343struct ggml_tensor * a , 3344struct ggml_tensor * b ) { 3345GGML_ASSERT (ggml_can_mul_mat (a ,b )); 3346GGML_ASSERT (!ggml_is_transposed (a )); 3347 3348const int64_t ne [4 ]= {a -> ne [1 ],b -> ne [1 ],b -> ne [2 ],b -> ne [3 ] }; 3349struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,4 ,ne ); 3350 3351result -> op = GGML_OP_MUL_MAT ; 3352result -> src [0 ]= a ; 3353result -> src [1 ]= b ; 3354 3355return result ; 3356} 3357 3358void ggml_mul_mat_set_prec ( 3359struct ggml_tensor * a , 3360enum ggml_prec prec ) { 3361GGML_ASSERT (a -> op == GGML_OP_MUL_MAT ); 3362 3363const int32_t prec_i32 = (int32_t )prec ; 3364 3365ggml_set_op_params_i32 (a ,0 ,prec_i32 ); 3366} 3367 3368void ggml_mul_mat_set_hint ( 3369struct ggml_tensor * a , 3370enum ggml_op_hint hint ) { 3371GGML_ASSERT (a -> op == GGML_OP_MUL_MAT ); 3372 3373const int32_t hint_i32 = (int32_t )hint ; 3374 3375ggml_set_op_params_i32 (a ,1 ,hint_i32 ); 3376} 3377 3378// ggml_mul_mat_id 3379 3380/* 3381c = ggml_mul_mat_id(ctx, as, b, ids); 3382 3383as -> [cols, rows, n_expert] 3384b -> [cols, n_expert_used, n_tokens] 3385ids -> [n_expert_used, n_tokens] (i32) 3386c -> [rows, n_expert_used, n_tokens] 3387 3388in b, n_expert_used can be broadcasted to match the n_expert_used of ids 3389 3390c ~= as[:,:,i] @ b[:,i%r,t], i = ids[e,t] for all e,t in ids 3391*/ 3392struct ggml_tensor * ggml_mul_mat_id ( 3393struct ggml_context * ctx , 3394struct ggml_tensor * as , 3395struct ggml_tensor * b , 3396struct ggml_tensor * ids ) { 3397GGML_ASSERT (!ggml_is_transposed (as )); 3398GGML_ASSERT (ids -> type == GGML_TYPE_I32 ); 3399 3400GGML_ASSERT (as -> ne [3 ]== 1 );// as is 3d (one matrix per expert) 3401GGML_ASSERT (b -> ne [3 ]== 1 );// b is 3d 3402GGML_ASSERT (ids -> ne [2 ]== 1 && ids -> ne [3 ]== 1 );// ids is 2d 3403GGML_ASSERT (ids -> ne [1 ]== b -> ne [2 ]);// must have an expert list per b row 3404GGML_ASSERT (as -> ne [0 ]== b -> ne [0 ]);// can_mul_mat 3405GGML_ASSERT (ids -> ne [0 ] %b -> ne [1 ]== 0 );// can broadcast 3406 3407const int64_t ne [4 ]= {as -> ne [1 ],ids -> ne [0 ],b -> ne [2 ],1 }; 3408struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,4 ,ne ); 3409 3410result -> op = GGML_OP_MUL_MAT_ID ; 3411result -> src [0 ]= as ; 3412result -> src [1 ]= b ; 3413result -> src [2 ]= ids ; 3414 3415return result ; 3416} 3417 3418// ggml_out_prod 3419 3420static inline bool ggml_can_out_prod (const struct ggml_tensor * t0 ,const struct ggml_tensor * t1 ) { 3421static_assert (GGML_MAX_DIMS == 4 ,"GGML_MAX_DIMS is not 4 - update this function" ); 3422 3423return (t0 -> ne [1 ]== t1 -> ne [1 ])&& 3424 (t1 -> ne [2 ]%t0 -> ne [2 ]== 0 )&& // verify t0 is broadcastable 3425 (t1 -> ne [3 ]%t0 -> ne [3 ]== 0 ); 3426} 3427 3428struct ggml_tensor * ggml_out_prod ( 3429struct ggml_context * ctx , 3430struct ggml_tensor * a , 3431struct ggml_tensor * b ) { 3432GGML_ASSERT (ggml_can_out_prod (a ,b )); 3433GGML_ASSERT (!ggml_is_transposed (a )); 3434 3435// a is broadcastable to b for ne[2] and ne[3] -> use b->ne[2] and b->ne[3] 3436const int64_t ne [4 ]= {a -> ne [0 ],b -> ne [0 ],b -> ne [2 ],b -> ne [3 ] }; 3437struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,4 ,ne ); 3438 3439result -> op = GGML_OP_OUT_PROD ; 3440result -> src [0 ]= a ; 3441result -> src [1 ]= b ; 3442 3443return result ; 3444} 3445 3446// ggml_scale 3447 3448static struct ggml_tensor * ggml_scale_impl ( 3449struct ggml_context * ctx , 3450struct ggml_tensor * a , 3451float s , 3452float b , 3453bool inplace ) { 3454GGML_ASSERT (ggml_is_padded_1d (a )); 3455 3456struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 3457 3458float params [2 ]= {s ,b }; 3459ggml_set_op_params (result ,& params ,sizeof (params )); 3460 3461result -> op = GGML_OP_SCALE ; 3462result -> src [0 ]= a ; 3463 3464return result ; 3465} 3466 3467struct ggml_tensor * ggml_scale ( 3468struct ggml_context * ctx , 3469struct ggml_tensor * a , 3470float s ) { 3471return ggml_scale_impl (ctx ,a ,s ,0.0 , false); 3472} 3473 3474struct ggml_tensor * ggml_scale_inplace ( 3475struct ggml_context * ctx , 3476struct ggml_tensor * a , 3477float s ) { 3478return ggml_scale_impl (ctx ,a ,s ,0.0 , true); 3479} 3480 3481struct ggml_tensor * ggml_scale_bias ( 3482struct ggml_context * ctx , 3483struct ggml_tensor * a , 3484float s , 3485float b ) { 3486return ggml_scale_impl (ctx ,a ,s ,b , false); 3487} 3488 3489struct ggml_tensor * ggml_scale_bias_inplace ( 3490struct ggml_context * ctx , 3491struct ggml_tensor * a , 3492float s , 3493float b ) { 3494return ggml_scale_impl (ctx ,a ,s ,b , true); 3495} 3496 3497// ggml_set 3498 3499static struct ggml_tensor * ggml_set_impl ( 3500struct ggml_context * ctx , 3501struct ggml_tensor * a , 3502struct ggml_tensor * b , 3503size_t nb1 , 3504size_t nb2 , 3505size_t nb3 , 3506size_t offset , 3507bool inplace ) { 3508GGML_ASSERT (ggml_nelements (a ) >=ggml_nelements (b )); 3509 3510// make a view of the destination 3511struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 3512 3513GGML_ASSERT (offset < (size_t )(1 <<30 )); 3514int32_t params []= {nb1 ,nb2 ,nb3 ,offset ,inplace ?1 :0 }; 3515ggml_set_op_params (result ,params ,sizeof (params )); 3516 3517result -> op = GGML_OP_SET ; 3518result -> src [0 ]= a ; 3519result -> src [1 ]= b ; 3520 3521return result ; 3522} 3523 3524struct ggml_tensor * ggml_set ( 3525struct ggml_context * ctx , 3526struct ggml_tensor * a , 3527struct ggml_tensor * b , 3528size_t nb1 , 3529size_t nb2 , 3530size_t nb3 , 3531size_t offset ) { 3532return ggml_set_impl (ctx ,a ,b ,nb1 ,nb2 ,nb3 ,offset , false); 3533} 3534 3535struct ggml_tensor * ggml_set_inplace ( 3536struct ggml_context * ctx , 3537struct ggml_tensor * a , 3538struct ggml_tensor * b , 3539size_t nb1 , 3540size_t nb2 , 3541size_t nb3 , 3542size_t offset ) { 3543return ggml_set_impl (ctx ,a ,b ,nb1 ,nb2 ,nb3 ,offset , true); 3544} 3545 3546struct ggml_tensor * ggml_set_1d ( 3547struct ggml_context * ctx , 3548struct ggml_tensor * a , 3549struct ggml_tensor * b , 3550size_t offset ) { 3551return ggml_set_impl (ctx ,a ,b ,a -> nb [1 ],a -> nb [2 ],a -> nb [3 ],offset , false); 3552} 3553 3554struct ggml_tensor * ggml_set_1d_inplace ( 3555struct ggml_context * ctx , 3556struct ggml_tensor * a , 3557struct ggml_tensor * b , 3558size_t offset ) { 3559return ggml_set_impl (ctx ,a ,b ,a -> nb [1 ],a -> nb [2 ],a -> nb [3 ],offset , true); 3560} 3561 3562struct ggml_tensor * ggml_set_2d ( 3563struct ggml_context * ctx , 3564struct ggml_tensor * a , 3565struct ggml_tensor * b , 3566size_t nb1 , 3567size_t offset ) { 3568return ggml_set_impl (ctx ,a ,b ,nb1 ,a -> nb [2 ],a -> nb [3 ],offset , false); 3569} 3570 3571struct ggml_tensor * ggml_set_2d_inplace ( 3572struct ggml_context * ctx , 3573struct ggml_tensor * a , 3574struct ggml_tensor * b , 3575size_t nb1 , 3576size_t offset ) { 3577return ggml_set_impl (ctx ,a ,b ,nb1 ,a -> nb [2 ],a -> nb [3 ],offset , true); 3578} 3579 3580// ggml_cpy 3581 3582static struct ggml_tensor * ggml_cpy_impl ( 3583struct ggml_context * ctx , 3584struct ggml_tensor * a , 3585struct ggml_tensor * b ) { 3586GGML_ASSERT (ggml_nelements (a )== ggml_nelements (b )); 3587 3588// make a view of the destination 3589struct ggml_tensor * result = ggml_view_tensor (ctx ,b ); 3590if (strlen (b -> name )> 0 ) { 3591ggml_format_name (result ,"%s (copy of %s)" ,b -> name ,a -> name ); 3592 }else { 3593ggml_format_name (result ,"%s (copy)" ,a -> name ); 3594 } 3595 3596result -> op = GGML_OP_CPY ; 3597result -> src [0 ]= a ; 3598result -> src [1 ]= b ; 3599 3600return result ; 3601} 3602 3603struct ggml_tensor * ggml_cpy ( 3604struct ggml_context * ctx , 3605struct ggml_tensor * a , 3606struct ggml_tensor * b ) { 3607return ggml_cpy_impl (ctx ,a ,b ); 3608} 3609 3610struct ggml_tensor * ggml_cast ( 3611struct ggml_context * ctx , 3612struct ggml_tensor * a , 3613enum ggml_type type ) { 3614struct ggml_tensor * result = ggml_new_tensor (ctx ,type ,GGML_MAX_DIMS ,a -> ne ); 3615ggml_format_name (result ,"%s (copy)" ,a -> name ); 3616 3617result -> op = GGML_OP_CPY ; 3618result -> src [0 ]= a ; 3619result -> src [1 ]= result ;// note: this self-reference might seem redundant, but it's actually needed by some 3620// backends for consistency with ggml_cpy_impl() above 3621 3622return result ; 3623} 3624 3625// ggml_cont 3626 3627static struct ggml_tensor * ggml_cont_impl ( 3628struct ggml_context * ctx , 3629struct ggml_tensor * a ) { 3630struct ggml_tensor * result = ggml_dup_tensor (ctx ,a ); 3631ggml_format_name (result ,"%s (cont)" ,a -> name ); 3632 3633result -> op = GGML_OP_CONT ; 3634result -> src [0 ]= a ; 3635 3636return result ; 3637} 3638 3639struct ggml_tensor * ggml_cont ( 3640struct ggml_context * ctx , 3641struct ggml_tensor * a ) { 3642return ggml_cont_impl (ctx ,a ); 3643} 3644 3645// make contiguous, with new shape 3646GGML_API struct ggml_tensor * ggml_cont_1d ( 3647struct ggml_context * ctx , 3648struct ggml_tensor * a , 3649int64_t ne0 ) { 3650return ggml_cont_4d (ctx ,a ,ne0 ,1 ,1 ,1 ); 3651} 3652 3653GGML_API struct ggml_tensor * ggml_cont_2d ( 3654struct ggml_context * ctx , 3655struct ggml_tensor * a , 3656int64_t ne0 , 3657int64_t ne1 ) { 3658return ggml_cont_4d (ctx ,a ,ne0 ,ne1 ,1 ,1 ); 3659} 3660 3661GGML_API struct ggml_tensor * ggml_cont_3d ( 3662struct ggml_context * ctx , 3663struct ggml_tensor * a , 3664int64_t ne0 , 3665int64_t ne1 , 3666int64_t ne2 ) { 3667return ggml_cont_4d (ctx ,a ,ne0 ,ne1 ,ne2 ,1 ); 3668} 3669 3670struct ggml_tensor * ggml_cont_4d ( 3671struct ggml_context * ctx , 3672struct ggml_tensor * a , 3673int64_t ne0 , 3674int64_t ne1 , 3675int64_t ne2 , 3676int64_t ne3 ) { 3677GGML_ASSERT (ggml_nelements (a )== (ne0 * ne1 * ne2 * ne3 )); 3678 3679struct ggml_tensor * result = ggml_new_tensor_4d (ctx ,a -> type ,ne0 ,ne1 ,ne2 ,ne3 ); 3680ggml_format_name (result ,"%s (cont)" ,a -> name ); 3681 3682result -> op = GGML_OP_CONT ; 3683result -> src [0 ]= a ; 3684 3685return result ; 3686} 3687 3688// ggml_reshape 3689 3690struct ggml_tensor * ggml_reshape ( 3691struct ggml_context * ctx , 3692struct ggml_tensor * a , 3693struct ggml_tensor * b ) { 3694GGML_ASSERT (ggml_is_contiguous (a )); 3695// as only the shape of b is relevant, and not its memory layout, b is allowed to be non contiguous. 3696GGML_ASSERT (ggml_nelements (a )== ggml_nelements (b )); 3697 3698struct ggml_tensor * result = ggml_new_tensor_impl (ctx ,a -> type ,GGML_MAX_DIMS ,b -> ne ,a ,0 ); 3699ggml_format_name (result ,"%s (reshaped)" ,a -> name ); 3700 3701result -> op = GGML_OP_RESHAPE ; 3702result -> src [0 ]= a ; 3703 3704return result ; 3705} 3706 3707struct ggml_tensor * ggml_reshape_1d ( 3708struct ggml_context * ctx , 3709struct ggml_tensor * a , 3710int64_t ne0 ) { 3711GGML_ASSERT (ggml_is_contiguous (a )); 3712GGML_ASSERT (ggml_nelements (a )== ne0 ); 3713 3714const int64_t ne [1 ]= {ne0 }; 3715struct ggml_tensor * result = ggml_new_tensor_impl (ctx ,a -> type ,1 ,ne ,a ,0 ); 3716ggml_format_name (result ,"%s (reshaped)" ,a -> name ); 3717 3718result -> op = GGML_OP_RESHAPE ; 3719result -> src [0 ]= a ; 3720 3721return result ; 3722} 3723 3724struct ggml_tensor * ggml_reshape_2d ( 3725struct ggml_context * ctx , 3726struct ggml_tensor * a , 3727int64_t ne0 , 3728int64_t ne1 ) { 3729GGML_ASSERT (ggml_is_contiguous (a )); 3730GGML_ASSERT (ggml_nelements (a )== ne0 * ne1 ); 3731 3732const int64_t ne [2 ]= {ne0 ,ne1 }; 3733struct ggml_tensor * result = ggml_new_tensor_impl (ctx ,a -> type ,2 ,ne ,a ,0 ); 3734ggml_format_name (result ,"%s (reshaped)" ,a -> name ); 3735 3736result -> op = GGML_OP_RESHAPE ; 3737result -> src [0 ]= a ; 3738 3739return result ; 3740} 3741 3742struct ggml_tensor * ggml_reshape_3d ( 3743struct ggml_context * ctx , 3744struct ggml_tensor * a , 3745int64_t ne0 , 3746int64_t ne1 , 3747int64_t ne2 ) { 3748GGML_ASSERT (ggml_is_contiguous (a )); 3749GGML_ASSERT (ggml_nelements (a )== ne0 * ne1 * ne2 ); 3750 3751const int64_t ne [3 ]= {ne0 ,ne1 ,ne2 }; 3752struct ggml_tensor * result = ggml_new_tensor_impl (ctx ,a -> type ,3 ,ne ,a ,0 ); 3753ggml_format_name (result ,"%s (reshaped)" ,a -> name ); 3754 3755result -> op = GGML_OP_RESHAPE ; 3756result -> src [0 ]= a ; 3757 3758return result ; 3759} 3760 3761struct ggml_tensor * ggml_reshape_4d ( 3762struct ggml_context * ctx , 3763struct ggml_tensor * a , 3764int64_t ne0 , 3765int64_t ne1 , 3766int64_t ne2 , 3767int64_t ne3 ) { 3768GGML_ASSERT (ggml_is_contiguous (a )); 3769GGML_ASSERT (ggml_nelements (a )== ne0 * ne1 * ne2 * ne3 ); 3770 3771const int64_t ne [4 ]= {ne0 ,ne1 ,ne2 ,ne3 }; 3772struct ggml_tensor * result = ggml_new_tensor_impl (ctx ,a -> type ,4 ,ne ,a ,0 ); 3773ggml_format_name (result ,"%s (reshaped)" ,a -> name ); 3774 3775result -> op = GGML_OP_RESHAPE ; 3776result -> src [0 ]= a ; 3777 3778return result ; 3779} 3780 3781static struct ggml_tensor * ggml_view_impl ( 3782struct ggml_context * ctx , 3783struct ggml_tensor * a , 3784int n_dims , 3785const int64_t * ne , 3786size_t offset ) { 3787struct ggml_tensor * result = ggml_new_tensor_impl (ctx ,a -> type ,n_dims ,ne ,a ,offset ); 3788ggml_format_name (result ,"%s (view)" ,a -> name ); 3789 3790ggml_set_op_params (result ,& offset ,sizeof (offset )); 3791 3792result -> op = GGML_OP_VIEW ; 3793result -> src [0 ]= a ; 3794 3795return result ; 3796} 3797 3798// ggml_view_1d 3799 3800struct ggml_tensor * ggml_view_1d ( 3801struct ggml_context * ctx , 3802struct ggml_tensor * a , 3803int64_t ne0 , 3804size_t offset ) { 3805struct ggml_tensor * result = ggml_view_impl (ctx ,a ,1 ,& ne0 ,offset ); 3806 3807return result ; 3808} 3809 3810// ggml_view_2d 3811 3812struct ggml_tensor * ggml_view_2d ( 3813struct ggml_context * ctx , 3814struct ggml_tensor * a , 3815int64_t ne0 , 3816int64_t ne1 , 3817size_t nb1 , 3818size_t offset ) { 3819const int64_t ne [2 ]= {ne0 ,ne1 }; 3820 3821struct ggml_tensor * result = ggml_view_impl (ctx ,a ,2 ,ne ,offset ); 3822 3823result -> nb [1 ]= nb1 ; 3824result -> nb [2 ]= result -> nb [1 ]* ne1 ; 3825result -> nb [3 ]= result -> nb [2 ]; 3826 3827return result ; 3828} 3829 3830// ggml_view_3d 3831 3832struct ggml_tensor * ggml_view_3d ( 3833struct ggml_context * ctx , 3834struct ggml_tensor * a , 3835int64_t ne0 , 3836int64_t ne1 , 3837int64_t ne2 , 3838size_t nb1 , 3839size_t nb2 , 3840size_t offset ) { 3841const int64_t ne [3 ]= {ne0 ,ne1 ,ne2 }; 3842 3843struct ggml_tensor * result = ggml_view_impl (ctx ,a ,3 ,ne ,offset ); 3844 3845result -> nb [1 ]= nb1 ; 3846result -> nb [2 ]= nb2 ; 3847result -> nb [3 ]= result -> nb [2 ]* ne2 ; 3848 3849return result ; 3850} 3851 3852// ggml_view_4d 3853 3854struct ggml_tensor * ggml_view_4d ( 3855struct ggml_context * ctx , 3856struct ggml_tensor * a , 3857int64_t ne0 , 3858int64_t ne1 , 3859int64_t ne2 , 3860int64_t ne3 , 3861size_t nb1 , 3862size_t nb2 , 3863size_t nb3 , 3864size_t offset ) { 3865const int64_t ne [4 ]= {ne0 ,ne1 ,ne2 ,ne3 }; 3866 3867struct ggml_tensor * result = ggml_view_impl (ctx ,a ,4 ,ne ,offset ); 3868 3869result -> nb [1 ]= nb1 ; 3870result -> nb [2 ]= nb2 ; 3871result -> nb [3 ]= nb3 ; 3872 3873return result ; 3874} 3875 3876// ggml_permute 3877 3878struct ggml_tensor * ggml_permute ( 3879struct ggml_context * ctx , 3880struct ggml_tensor * a , 3881int axis0 , 3882int axis1 , 3883int axis2 , 3884int axis3 ) { 3885GGML_ASSERT (axis0 >=0 && axis0 < GGML_MAX_DIMS ); 3886GGML_ASSERT (axis1 >=0 && axis1 < GGML_MAX_DIMS ); 3887GGML_ASSERT (axis2 >=0 && axis2 < GGML_MAX_DIMS ); 3888GGML_ASSERT (axis3 >=0 && axis3 < GGML_MAX_DIMS ); 3889 3890GGML_ASSERT (axis0 != axis1 ); 3891GGML_ASSERT (axis0 != axis2 ); 3892GGML_ASSERT (axis0 != axis3 ); 3893GGML_ASSERT (axis1 != axis2 ); 3894GGML_ASSERT (axis1 != axis3 ); 3895GGML_ASSERT (axis2 != axis3 ); 3896 3897struct ggml_tensor * result = ggml_view_tensor (ctx ,a ); 3898ggml_format_name (result ,"%s (permuted)" ,a -> name ); 3899 3900int ne [GGML_MAX_DIMS ]; 3901int nb [GGML_MAX_DIMS ]; 3902 3903ne [axis0 ]= a -> ne [0 ]; 3904ne [axis1 ]= a -> ne [1 ]; 3905ne [axis2 ]= a -> ne [2 ]; 3906ne [axis3 ]= a -> ne [3 ]; 3907 3908nb [axis0 ]= a -> nb [0 ]; 3909nb [axis1 ]= a -> nb [1 ]; 3910nb [axis2 ]= a -> nb [2 ]; 3911nb [axis3 ]= a -> nb [3 ]; 3912 3913result -> ne [0 ]= ne [0 ]; 3914result -> ne [1 ]= ne [1 ]; 3915result -> ne [2 ]= ne [2 ]; 3916result -> ne [3 ]= ne [3 ]; 3917 3918result -> nb [0 ]= nb [0 ]; 3919result -> nb [1 ]= nb [1 ]; 3920result -> nb [2 ]= nb [2 ]; 3921result -> nb [3 ]= nb [3 ]; 3922 3923result -> op = GGML_OP_PERMUTE ; 3924result -> src [0 ]= a ; 3925 3926int32_t params []= {axis0 ,axis1 ,axis2 ,axis3 }; 3927ggml_set_op_params (result ,params ,sizeof (params )); 3928 3929return result ; 3930} 3931 3932// ggml_transpose 3933 3934struct ggml_tensor * ggml_transpose ( 3935struct ggml_context * ctx , 3936struct ggml_tensor * a ) { 3937struct ggml_tensor * result = ggml_view_tensor (ctx ,a ); 3938ggml_format_name (result ,"%s (transposed)" ,a -> name ); 3939 3940result -> ne [0 ]= a -> ne [1 ]; 3941result -> ne [1 ]= a -> ne [0 ]; 3942 3943result -> nb [0 ]= a -> nb [1 ]; 3944result -> nb [1 ]= a -> nb [0 ]; 3945 3946result -> op = GGML_OP_TRANSPOSE ; 3947result -> src [0 ]= a ; 3948 3949return result ; 3950} 3951 3952// ggml_get_rows 3953 3954struct ggml_tensor * ggml_get_rows ( 3955struct ggml_context * ctx , 3956struct ggml_tensor * a , 3957struct ggml_tensor * b ) { 3958GGML_ASSERT (a -> ne [2 ]== b -> ne [1 ]); 3959GGML_ASSERT (a -> ne [3 ]== b -> ne [2 ]); 3960GGML_ASSERT (b -> ne [3 ]== 1 ); 3961GGML_ASSERT (b -> type == GGML_TYPE_I32 ); 3962 3963// TODO: implement non F32 return 3964enum ggml_type type = GGML_TYPE_F32 ; 3965if (a -> type == GGML_TYPE_I32 ) { 3966type = a -> type ; 3967 } 3968struct ggml_tensor * result = ggml_new_tensor_4d (ctx ,type ,a -> ne [0 ],b -> ne [0 ],b -> ne [1 ],b -> ne [2 ]); 3969 3970result -> op = GGML_OP_GET_ROWS ; 3971result -> src [0 ]= a ; 3972result -> src [1 ]= b ; 3973 3974return result ; 3975} 3976 3977// ggml_get_rows_back 3978 3979struct ggml_tensor * ggml_get_rows_back ( 3980struct ggml_context * ctx , 3981struct ggml_tensor * a , 3982struct ggml_tensor * b , 3983struct ggml_tensor * c ) { 3984GGML_ASSERT (ggml_is_matrix (a )&& ggml_is_vector (b )&& b -> type == GGML_TYPE_I32 ); 3985GGML_ASSERT (ggml_is_matrix (c )&& (a -> ne [0 ]== c -> ne [0 ])); 3986 3987// TODO: implement non F32 return 3988//struct ggml_tensor * result = ggml_new_tensor_2d(ctx, a->type, a->ne[0], b->ne[0]); 3989struct ggml_tensor * result = ggml_new_tensor_2d (ctx ,GGML_TYPE_F32 ,c -> ne [0 ],c -> ne [1 ]); 3990 3991result -> op = GGML_OP_GET_ROWS_BACK ; 3992result -> src [0 ]= a ; 3993result -> src [1 ]= b ; 3994 3995return result ; 3996} 3997 3998// ggml_set_rows 3999 4000struct ggml_tensor * ggml_set_rows ( 4001struct ggml_context * ctx , 4002struct ggml_tensor * a , 4003struct ggml_tensor * b , 4004struct ggml_tensor * c ) { 4005GGML_ASSERT (a -> ne [0 ]== b -> ne [0 ]); 4006GGML_ASSERT (a -> ne [2 ]== b -> ne [2 ]); 4007GGML_ASSERT (a -> ne [3 ]== b -> ne [3 ]); 4008GGML_ASSERT (b -> ne [1 ]== c -> ne [0 ]); 4009GGML_ASSERT (b -> ne [2 ] %c -> ne [1 ]== 0 ); 4010GGML_ASSERT (b -> ne [3 ] %c -> ne [2 ]== 0 ); 4011GGML_ASSERT (c -> ne [3 ]== 1 ); 4012GGML_ASSERT (b -> type == GGML_TYPE_F32 || b -> type == GGML_TYPE_F16 ); 4013GGML_ASSERT (c -> type == GGML_TYPE_I64 || c -> type == GGML_TYPE_I32 ); 4014 4015GGML_ASSERT (ggml_is_contiguous_rows (a )); 4016GGML_ASSERT (ggml_is_contiguous_rows (b )); 4017 4018struct ggml_tensor * result = ggml_view_tensor (ctx ,a ); 4019 4020result -> op = GGML_OP_SET_ROWS ; 4021result -> src [0 ]= b ; 4022result -> src [1 ]= c ; 4023result -> src [2 ]= a ;// note: order is weird due to legacy reasons (https://github.com/ggml-org/llama.cpp/pull/16063#discussion_r2385795931) 4024 4025return result ; 4026} 4027 4028// ggml_diag 4029 4030struct ggml_tensor * ggml_diag ( 4031struct ggml_context * ctx , 4032struct ggml_tensor * a ) { 4033GGML_ASSERT (a -> ne [1 ]== 1 ); 4034 4035const int64_t ne [4 ]= {a -> ne [0 ],a -> ne [0 ],a -> ne [2 ],a -> ne [3 ] }; 4036struct ggml_tensor * result = ggml_new_tensor (ctx ,a -> type ,4 ,ne ); 4037 4038result -> op = GGML_OP_DIAG ; 4039result -> src [0 ]= a ; 4040 4041return result ; 4042} 4043 4044// ggml_diag_mask_inf 4045 4046static struct ggml_tensor * ggml_diag_mask_inf_impl ( 4047struct ggml_context * ctx , 4048struct ggml_tensor * a , 4049int n_past , 4050bool inplace ) { 4051struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 4052 4053int32_t params []= {n_past }; 4054ggml_set_op_params (result ,params ,sizeof (params )); 4055 4056result -> op = GGML_OP_DIAG_MASK_INF ; 4057result -> src [0 ]= a ; 4058 4059return result ; 4060} 4061 4062struct ggml_tensor * ggml_diag_mask_inf ( 4063struct ggml_context * ctx , 4064struct ggml_tensor * a , 4065int n_past ) { 4066return ggml_diag_mask_inf_impl (ctx ,a ,n_past , false); 4067} 4068 4069struct ggml_tensor * ggml_diag_mask_inf_inplace ( 4070struct ggml_context * ctx , 4071struct ggml_tensor * a , 4072int n_past ) { 4073return ggml_diag_mask_inf_impl (ctx ,a ,n_past , true); 4074} 4075 4076// ggml_diag_mask_zero 4077 4078static struct ggml_tensor * ggml_diag_mask_zero_impl ( 4079struct ggml_context * ctx , 4080struct ggml_tensor * a , 4081int n_past , 4082bool inplace ) { 4083struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 4084 4085int32_t params []= {n_past }; 4086ggml_set_op_params (result ,params ,sizeof (params )); 4087 4088result -> op = GGML_OP_DIAG_MASK_ZERO ; 4089result -> src [0 ]= a ; 4090 4091return result ; 4092} 4093 4094struct ggml_tensor * ggml_diag_mask_zero ( 4095struct ggml_context * ctx , 4096struct ggml_tensor * a , 4097int n_past ) { 4098return ggml_diag_mask_zero_impl (ctx ,a ,n_past , false); 4099} 4100 4101struct ggml_tensor * ggml_diag_mask_zero_inplace ( 4102struct ggml_context * ctx , 4103struct ggml_tensor * a , 4104int n_past ) { 4105return ggml_diag_mask_zero_impl (ctx ,a ,n_past , true); 4106} 4107 4108// ggml_clamp 4109 4110static struct ggml_tensor * ggml_clamp_impl ( 4111struct ggml_context * ctx , 4112struct ggml_tensor * a , 4113float min , 4114float max , 4115bool inplace ) { 4116struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 4117 4118float params []= {min ,max }; 4119ggml_set_op_params (result ,params ,sizeof (params )); 4120 4121result -> op = GGML_OP_CLAMP ; 4122result -> src [0 ]= a ; 4123 4124return result ; 4125} 4126 4127struct ggml_tensor * ggml_clamp ( 4128struct ggml_context * ctx , 4129struct ggml_tensor * a , 4130float min , 4131float max ) { 4132return ggml_clamp_impl (ctx ,a ,min ,max , false); 4133} 4134 4135struct ggml_tensor * ggml_clamp_inplace ( 4136struct ggml_context * ctx , 4137struct ggml_tensor * a , 4138float min , 4139float max ) { 4140return ggml_clamp_impl (ctx ,a ,min ,max , true); 4141} 4142 4143// ggml_soft_max 4144 4145static struct ggml_tensor * ggml_soft_max_impl ( 4146struct ggml_context * ctx , 4147struct ggml_tensor * a , 4148struct ggml_tensor * mask , 4149float scale , 4150float max_bias , 4151bool inplace ) { 4152GGML_ASSERT (ggml_is_contiguous (a )); 4153 4154if (mask ) { 4155GGML_ASSERT (mask -> type == GGML_TYPE_F16 || mask -> type == GGML_TYPE_F32 ); 4156GGML_ASSERT (ggml_is_contiguous (mask )); 4157GGML_ASSERT (mask -> ne [0 ]== a -> ne [0 ]); 4158GGML_ASSERT (mask -> ne [1 ] >=a -> ne [1 ]); 4159GGML_ASSERT (a -> ne [2 ]%mask -> ne [2 ]== 0 ); 4160GGML_ASSERT (a -> ne [3 ]%mask -> ne [3 ]== 0 ); 4161 } 4162 4163if (max_bias > 0.0f ) { 4164GGML_ASSERT (mask ); 4165 } 4166 4167struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 4168 4169float params []= {scale ,max_bias }; 4170ggml_set_op_params (result ,params ,sizeof (params )); 4171 4172result -> op = GGML_OP_SOFT_MAX ; 4173result -> src [0 ]= a ; 4174result -> src [1 ]= mask ; 4175 4176return result ; 4177} 4178 4179struct ggml_tensor * ggml_soft_max ( 4180struct ggml_context * ctx , 4181struct ggml_tensor * a ) { 4182return ggml_soft_max_impl (ctx ,a ,NULL ,1.0f ,0.0f , false); 4183} 4184 4185struct ggml_tensor * ggml_soft_max_inplace ( 4186struct ggml_context * ctx , 4187struct ggml_tensor * a ) { 4188return ggml_soft_max_impl (ctx ,a ,NULL ,1.0f ,0.0f , true); 4189} 4190 4191struct ggml_tensor * ggml_soft_max_ext ( 4192struct ggml_context * ctx , 4193struct ggml_tensor * a , 4194struct ggml_tensor * mask , 4195float scale , 4196float max_bias ) { 4197return ggml_soft_max_impl (ctx ,a ,mask ,scale ,max_bias , false); 4198} 4199 4200struct ggml_tensor * ggml_soft_max_ext_inplace ( 4201struct ggml_context * ctx , 4202struct ggml_tensor * a , 4203struct ggml_tensor * mask , 4204float scale , 4205float max_bias ) { 4206return ggml_soft_max_impl (ctx ,a ,mask ,scale ,max_bias , true); 4207} 4208 4209void ggml_soft_max_add_sinks ( 4210struct ggml_tensor * a , 4211struct ggml_tensor * sinks ) { 4212if (!sinks ) { 4213a -> src [2 ]= NULL ; 4214return ; 4215 } 4216 4217GGML_ASSERT (a -> op == GGML_OP_SOFT_MAX ); 4218GGML_ASSERT (a -> src [2 ]== NULL ); 4219GGML_ASSERT (a -> src [0 ]-> ne [2 ]== sinks -> ne [0 ]); 4220GGML_ASSERT (sinks -> type == GGML_TYPE_F32 ); 4221 4222a -> src [2 ]= sinks ; 4223} 4224 4225// ggml_soft_max_ext_back 4226 4227static struct ggml_tensor * ggml_soft_max_ext_back_impl ( 4228struct ggml_context * ctx , 4229struct ggml_tensor * a , 4230struct ggml_tensor * b , 4231float scale , 4232float max_bias , 4233bool inplace ) { 4234struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 4235 4236result -> op = GGML_OP_SOFT_MAX_BACK ; 4237result -> src [0 ]= a ; 4238result -> src [1 ]= b ; 4239 4240memcpy ((float * )result -> op_params + 0 ,& scale ,sizeof (float )); 4241memcpy ((float * )result -> op_params + 1 ,& max_bias ,sizeof (float )); 4242 4243return result ; 4244} 4245 4246struct ggml_tensor * ggml_soft_max_ext_back ( 4247struct ggml_context * ctx , 4248struct ggml_tensor * a , 4249struct ggml_tensor * b , 4250float scale , 4251float max_bias ) { 4252return ggml_soft_max_ext_back_impl (ctx ,a ,b ,scale ,max_bias , false); 4253} 4254 4255struct ggml_tensor * ggml_soft_max_ext_back_inplace ( 4256struct ggml_context * ctx , 4257struct ggml_tensor * a , 4258struct ggml_tensor * b , 4259float scale , 4260float max_bias ) { 4261return ggml_soft_max_ext_back_impl (ctx ,a ,b ,scale ,max_bias , true); 4262} 4263 4264// ggml_rope 4265 4266static struct ggml_tensor * ggml_rope_impl ( 4267struct ggml_context * ctx , 4268struct ggml_tensor * a , 4269struct ggml_tensor * b , 4270struct ggml_tensor * c , 4271int n_dims , 4272int sections [GGML_MROPE_SECTIONS ], 4273int mode , 4274int n_ctx_orig , 4275float freq_base , 4276float freq_scale , 4277float ext_factor , 4278float attn_factor , 4279float beta_fast , 4280float beta_slow , 4281bool inplace ) { 4282GGML_ASSERT ((mode & 1 )== 0 && "mode & 1 == 1 is no longer supported" ); 4283 4284GGML_ASSERT (ggml_is_vector (b )); 4285GGML_ASSERT (b -> type == GGML_TYPE_I32 ); 4286 4287bool mrope_used = mode & GGML_ROPE_TYPE_MROPE ; 4288if (mrope_used ) { 4289GGML_ASSERT (a -> ne [2 ]* 4 == b -> ne [0 ]);// mrope expecting 4 position ids per token 4290 }else { 4291GGML_ASSERT (a -> ne [2 ]== b -> ne [0 ]); 4292 } 4293 4294if (c ) { 4295GGML_ASSERT (c -> type == GGML_TYPE_F32 ); 4296GGML_ASSERT (c -> ne [0 ] >=n_dims /2 ); 4297 } 4298 4299struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 4300 4301int32_t params [16 ]= {/*n_past*/ 0 ,n_dims ,mode ,/*n_ctx*/ 0 ,n_ctx_orig }; 4302memcpy (params + 5 ,& freq_base ,sizeof (float )); 4303memcpy (params + 6 ,& freq_scale ,sizeof (float )); 4304memcpy (params + 7 ,& ext_factor ,sizeof (float )); 4305memcpy (params + 8 ,& attn_factor ,sizeof (float )); 4306memcpy (params + 9 ,& beta_fast ,sizeof (float )); 4307memcpy (params + 10 ,& beta_slow ,sizeof (float )); 4308if (mrope_used && sections ) { 4309memcpy (params + 11 ,sections ,sizeof (int32_t )* GGML_MROPE_SECTIONS ); 4310 }else { 4311memset (params + 11 ,0 ,sizeof (int32_t )* GGML_MROPE_SECTIONS ); 4312 } 4313params [15 ]= 0 ;// n_offs, set via ggml_rope_set_offset() 4314 4315ggml_set_op_params (result ,params ,sizeof (params )); 4316 4317result -> op = GGML_OP_ROPE ; 4318result -> src [0 ]= a ; 4319result -> src [1 ]= b ; 4320result -> src [2 ]= c ; 4321 4322return result ; 4323} 4324 4325struct ggml_tensor * ggml_rope ( 4326struct ggml_context * ctx , 4327struct ggml_tensor * a , 4328struct ggml_tensor * b , 4329int n_dims , 4330int mode ) { 4331return ggml_rope_impl ( 4332ctx ,a ,b ,NULL ,n_dims ,NULL ,mode ,0 ,10000.0f ,1.0f ,0.0f ,1.0f ,0.0f ,0.0f , false 4333 ); 4334} 4335 4336struct ggml_tensor * ggml_rope_multi ( 4337struct ggml_context * ctx , 4338struct ggml_tensor * a , 4339struct ggml_tensor * b , 4340struct ggml_tensor * c , 4341int n_dims , 4342int sections [GGML_MROPE_SECTIONS ], 4343int mode , 4344int n_ctx_orig , 4345float freq_base , 4346float freq_scale , 4347float ext_factor , 4348float attn_factor , 4349float beta_fast , 4350float beta_slow ) { 4351return ggml_rope_impl ( 4352ctx ,a ,b ,c ,n_dims ,sections ,mode ,n_ctx_orig ,freq_base ,freq_scale , 4353ext_factor ,attn_factor ,beta_fast ,beta_slow , false 4354 ); 4355} 4356 4357struct ggml_tensor * ggml_rope_multi_inplace ( 4358struct ggml_context * ctx , 4359struct ggml_tensor * a , 4360struct ggml_tensor * b , 4361struct ggml_tensor * c , 4362int n_dims , 4363int sections [GGML_MROPE_SECTIONS ], 4364int mode , 4365int n_ctx_orig , 4366float freq_base , 4367float freq_scale , 4368float ext_factor , 4369float attn_factor , 4370float beta_fast , 4371float beta_slow ) { 4372return ggml_rope_impl ( 4373ctx ,a ,b ,c ,n_dims ,sections ,mode ,n_ctx_orig ,freq_base ,freq_scale , 4374ext_factor ,attn_factor ,beta_fast ,beta_slow , true 4375 ); 4376} 4377 4378struct ggml_tensor * ggml_rope_inplace ( 4379struct ggml_context * ctx , 4380struct ggml_tensor * a , 4381struct ggml_tensor * b , 4382int n_dims , 4383int mode ) { 4384return ggml_rope_impl ( 4385ctx ,a ,b ,NULL ,n_dims ,NULL ,mode ,0 ,10000.0f ,1.0f ,0.0f ,1.0f ,0.0f ,0.0f , true 4386 ); 4387} 4388 4389struct ggml_tensor * ggml_rope_ext ( 4390struct ggml_context * ctx , 4391struct ggml_tensor * a , 4392struct ggml_tensor * b , 4393struct ggml_tensor * c , 4394int n_dims , 4395int mode , 4396int n_ctx_orig , 4397float freq_base , 4398float freq_scale , 4399float ext_factor , 4400float attn_factor , 4401float beta_fast , 4402float beta_slow ) { 4403return ggml_rope_impl ( 4404ctx ,a ,b ,c ,n_dims ,NULL ,mode ,n_ctx_orig ,freq_base ,freq_scale , 4405ext_factor ,attn_factor ,beta_fast ,beta_slow , false 4406 ); 4407} 4408 4409struct ggml_tensor * ggml_rope_ext_inplace ( 4410struct ggml_context * ctx , 4411struct ggml_tensor * a , 4412struct ggml_tensor * b , 4413struct ggml_tensor * c , 4414int n_dims , 4415int mode , 4416int n_ctx_orig , 4417float freq_base , 4418float freq_scale , 4419float ext_factor , 4420float attn_factor , 4421float beta_fast , 4422float beta_slow ) { 4423return ggml_rope_impl ( 4424ctx ,a ,b ,c ,n_dims ,NULL ,mode ,n_ctx_orig ,freq_base ,freq_scale , 4425ext_factor ,attn_factor ,beta_fast ,beta_slow , true 4426 ); 4427} 4428 4429struct ggml_tensor * ggml_rope_custom ( 4430struct ggml_context * ctx , 4431struct ggml_tensor * a , 4432struct ggml_tensor * b , 4433int n_dims , 4434int mode , 4435int n_ctx_orig , 4436float freq_base , 4437float freq_scale , 4438float ext_factor , 4439float attn_factor , 4440float beta_fast , 4441float beta_slow ) { 4442return ggml_rope_impl ( 4443ctx ,a ,b ,NULL ,n_dims ,NULL ,mode ,n_ctx_orig ,freq_base ,freq_scale , 4444ext_factor ,attn_factor ,beta_fast ,beta_slow , false 4445 ); 4446} 4447 4448struct ggml_tensor * ggml_rope_custom_inplace ( 4449struct ggml_context * ctx , 4450struct ggml_tensor * a , 4451struct ggml_tensor * b , 4452int n_dims , 4453int mode , 4454int n_ctx_orig , 4455float freq_base , 4456float freq_scale , 4457float ext_factor , 4458float attn_factor , 4459float beta_fast , 4460float beta_slow ) { 4461return ggml_rope_impl ( 4462ctx ,a ,b ,NULL ,n_dims ,NULL ,mode ,n_ctx_orig ,freq_base ,freq_scale , 4463ext_factor ,attn_factor ,beta_fast ,beta_slow , true 4464 ); 4465} 4466 4467// Apparently solving `n_rot = 2pi * x * base^((2 * max_pos_emb) / n_dims)` for x, we get 4468// `corr_dim(n_rot) = n_dims * log(max_pos_emb / (n_rot * 2pi)) / (2 * log(base))` 4469static float ggml_rope_yarn_corr_dim (int n_dims ,int n_ctx_orig ,float n_rot ,float base ) { 4470return n_dims * logf (n_ctx_orig / (n_rot * 2 * (float )M_PI )) / (2 * logf (base )); 4471} 4472 4473void ggml_rope_yarn_corr_dims ( 4474int n_dims ,int n_ctx_orig ,float freq_base ,float beta_fast ,float beta_slow ,float dims [2 ] 4475) { 4476// start and end correction dims 4477float start = floorf (ggml_rope_yarn_corr_dim (n_dims ,n_ctx_orig ,beta_fast ,freq_base )); 4478float end = ceilf (ggml_rope_yarn_corr_dim (n_dims ,n_ctx_orig ,beta_slow ,freq_base )); 4479dims [0 ]= MAX (0 ,start ); 4480dims [1 ]= MIN (n_dims - 1 ,end ); 4481} 4482 4483// ggml_rope_back 4484 4485struct ggml_tensor * ggml_rope_ext_back ( 4486struct ggml_context * ctx , 4487struct ggml_tensor * a , 4488struct ggml_tensor * b , 4489struct ggml_tensor * c , 4490int n_dims , 4491int mode , 4492int n_ctx_orig , 4493float freq_base , 4494float freq_scale , 4495float ext_factor , 4496float attn_factor , 4497float beta_fast , 4498float beta_slow ) { 4499struct ggml_tensor * result = ggml_rope_ext ( 4500ctx ,a ,b ,c ,n_dims ,mode ,n_ctx_orig ,freq_base ,freq_scale ,ext_factor ,attn_factor ,beta_fast ,beta_slow ); 4501result -> op = GGML_OP_ROPE_BACK ; 4502return result ; 4503} 4504 4505struct ggml_tensor * ggml_rope_multi_back ( 4506struct ggml_context * ctx , 4507struct ggml_tensor * a , 4508struct ggml_tensor * b , 4509struct ggml_tensor * c , 4510int n_dims , 4511int sections [4 ], 4512int mode , 4513int n_ctx_orig , 4514float freq_base , 4515float freq_scale , 4516float ext_factor , 4517float attn_factor , 4518float beta_fast , 4519float beta_slow ) { 4520struct ggml_tensor * result = ggml_rope_multi ( 4521ctx ,a ,b ,c ,n_dims ,sections ,mode ,n_ctx_orig ,freq_base ,freq_scale ,ext_factor ,attn_factor ,beta_fast ,beta_slow ); 4522result -> op = GGML_OP_ROPE_BACK ; 4523return result ; 4524} 4525 4526struct ggml_tensor * ggml_rope_set_offset ( 4527struct ggml_tensor * a , 4528int n_offs ) { 4529GGML_ASSERT (a -> op == GGML_OP_ROPE || a -> op == GGML_OP_ROPE_BACK ); 4530GGML_ASSERT (n_offs >=0 ); 4531 4532const int32_t mode = ggml_get_op_params_i32 (a ,2 ); 4533GGML_ASSERT (mode != GGML_ROPE_TYPE_VISION ); 4534 4535ggml_set_op_params_i32 (a ,15 ,n_offs ); 4536return a ; 4537} 4538 4539static int64_t ggml_calc_conv_output_size (int64_t ins ,int64_t ks ,int s ,int p ,int d ) { 4540return (ins + 2 * p - d * (ks - 1 )- 1 ) /s + 1 ; 4541} 4542 4543// im2col: [N, IC, IH, IW] => [N, OH, OW, IC*KH*KW] 4544// a: [OC,IC, KH, KW] 4545// b: [N, IC, IH, IW] 4546// result: [N, OH, OW, IC*KH*KW] 4547struct ggml_tensor * ggml_im2col ( 4548struct ggml_context * ctx , 4549struct ggml_tensor * a , 4550struct ggml_tensor * b , 4551int s0 , 4552int s1 , 4553int p0 , 4554int p1 , 4555int d0 , 4556int d1 , 4557bool is_2D , 4558enum ggml_type dst_type ) { 4559if (is_2D ) { 4560GGML_ASSERT (a -> ne [2 ]== b -> ne [2 ]); 4561 }else { 4562//GGML_ASSERT(b->ne[1] % a->ne[1] == 0); 4563GGML_ASSERT (b -> ne [1 ]== a -> ne [1 ]); 4564GGML_ASSERT (b -> ne [3 ]== 1 ); 4565 } 4566 4567const int64_t OH = is_2D ?ggml_calc_conv_output_size (b -> ne [1 ],a -> ne [1 ],s1 ,p1 ,d1 ) :0 ; 4568const int64_t OW = ggml_calc_conv_output_size (b -> ne [0 ],a -> ne [0 ],s0 ,p0 ,d0 ); 4569 4570GGML_ASSERT ((!is_2D || OH > 0 )&& "b too small compared to a" ); 4571GGML_ASSERT ((OW > 0 )&& "b too small compared to a" ); 4572 4573const int64_t ne [4 ]= { 4574is_2D ? (a -> ne [2 ]* a -> ne [1 ]* a -> ne [0 ]) :a -> ne [1 ]* a -> ne [0 ], 4575OW , 4576is_2D ?OH :b -> ne [2 ], 4577is_2D ?b -> ne [3 ] :1 , 4578 }; 4579 4580struct ggml_tensor * result = ggml_new_tensor (ctx ,dst_type ,4 ,ne ); 4581int32_t params []= {s0 ,s1 ,p0 ,p1 ,d0 ,d1 , (is_2D ?1 :0 ) }; 4582ggml_set_op_params (result ,params ,sizeof (params )); 4583 4584result -> op = GGML_OP_IM2COL ; 4585result -> src [0 ]= a ; 4586result -> src [1 ]= b ; 4587 4588return result ; 4589} 4590 4591struct ggml_tensor * ggml_im2col_back ( 4592struct ggml_context * ctx , 4593struct ggml_tensor * a , 4594struct ggml_tensor * b , 4595int64_t * ne , 4596int s0 , 4597int s1 , 4598int p0 , 4599int p1 , 4600int d0 , 4601int d1 , 4602bool is_2D ) { 4603struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,4 ,ne ); 4604int32_t params []= {s0 ,s1 ,p0 ,p1 ,d0 ,d1 , (is_2D ?1 :0 ) }; 4605ggml_set_op_params (result ,params ,sizeof (params )); 4606 4607result -> op = GGML_OP_IM2COL_BACK ; 4608result -> src [0 ]= a ; 4609result -> src [1 ]= b ; 4610 4611return result ; 4612} 4613 4614// ggml_conv_1d 4615 4616struct ggml_tensor * ggml_conv_1d ( 4617struct ggml_context * ctx , 4618struct ggml_tensor * a , 4619struct ggml_tensor * b , 4620int s0 , 4621int p0 , 4622int d0 ) { 4623struct ggml_tensor * im2col = ggml_im2col (ctx ,a ,b ,s0 ,0 ,p0 ,0 ,d0 ,0 , false,a -> type == GGML_TYPE_BF16 ?GGML_TYPE_F32 :GGML_TYPE_F16 );// [N, OL, IC * K] 4624 4625struct ggml_tensor * result = 4626ggml_mul_mat (ctx , 4627ggml_reshape_2d (ctx ,im2col ,im2col -> ne [0 ], (im2col -> ne [2 ]* im2col -> ne [1 ])),// [N, OL, IC * K] => [N*OL, IC * K] 4628ggml_reshape_2d (ctx ,a , (a -> ne [0 ]* a -> ne [1 ]),a -> ne [2 ]));// [OC,IC, K] => [OC, IC * K] 4629 4630result = ggml_reshape_3d (ctx ,result ,im2col -> ne [1 ],a -> ne [2 ],im2col -> ne [2 ]);// [N, OC, OL] 4631 4632return result ; 4633} 4634 4635// ggml_conv_1d_ph 4636 4637struct ggml_tensor * ggml_conv_1d_ph ( 4638struct ggml_context * ctx , 4639struct ggml_tensor * a , 4640struct ggml_tensor * b , 4641int s , 4642int d ) { 4643return ggml_conv_1d (ctx ,a ,b ,s ,a -> ne [0 ] /2 ,d ); 4644} 4645 4646// ggml_conv_1d_dw 4647 4648struct ggml_tensor * ggml_conv_1d_dw ( 4649struct ggml_context * ctx , 4650struct ggml_tensor * a , 4651struct ggml_tensor * b , 4652int s0 , 4653int p0 , 4654int d0 ) { 4655struct ggml_tensor * new_b = ggml_reshape_4d (ctx ,b ,b -> ne [0 ],1 ,b -> ne [1 ],b -> ne [2 ]); 4656 4657struct ggml_tensor * im2col = ggml_im2col (ctx ,a ,new_b ,s0 ,0 ,p0 ,0 ,d0 ,0 , false,a -> type == GGML_TYPE_BF16 ?GGML_TYPE_F32 :GGML_TYPE_F16 ); 4658 4659struct ggml_tensor * result = ggml_mul_mat (ctx ,im2col ,a ); 4660 4661result = ggml_reshape_3d (ctx ,result ,result -> ne [0 ],result -> ne [2 ],1 ); 4662 4663return result ; 4664} 4665 4666// ggml_conv_1d_dw_ph 4667 4668struct ggml_tensor * ggml_conv_1d_dw_ph ( 4669struct ggml_context * ctx , 4670struct ggml_tensor * a , 4671struct ggml_tensor * b , 4672int s0 , 4673int d0 ) { 4674return ggml_conv_1d_dw (ctx ,a ,b ,s0 ,a -> ne [0 ] /2 ,d0 ); 4675} 4676 4677// ggml_col2im_1d 4678 4679struct ggml_tensor * ggml_col2im_1d ( 4680struct ggml_context * ctx , 4681struct ggml_tensor * a , 4682int s0 , 4683int oc , 4684int p0 ) { 4685GGML_ASSERT (ggml_is_matrix (a )); 4686GGML_ASSERT (ggml_is_contiguous (a )); 4687GGML_ASSERT (a -> type == GGML_TYPE_F32 || a -> type == GGML_TYPE_F16 || a -> type == GGML_TYPE_BF16 ); 4688GGML_ASSERT (s0 > 0 ); 4689GGML_ASSERT (oc > 0 ); 4690GGML_ASSERT (p0 >=0 ); 4691 4692const int64_t K_OC = a -> ne [0 ]; 4693const int64_t T_in = a -> ne [1 ]; 4694const int64_t K = K_OC /oc ; 4695const int64_t T_out = (T_in - 1 )* s0 + K - 2 * p0 ; 4696 4697GGML_ASSERT (K_OC == K * oc );// a->ne[0] must be a whole number of oc blocks 4698GGML_ASSERT (K > 0 && T_out > 0 ); 4699 4700const int64_t ne [4 ]= {T_out ,oc ,1 ,1 }; 4701struct ggml_tensor * result = ggml_new_tensor (ctx ,a -> type ,2 ,ne ); 4702 4703int32_t params []= {s0 , (int32_t )oc , (int32_t )p0 }; 4704ggml_set_op_params (result ,params ,sizeof (params )); 4705 4706result -> op = GGML_OP_COL2IM_1D ; 4707result -> src [0 ]= a ; 4708 4709return result ; 4710} 4711 4712// ggml_conv_transpose_1d 4713 4714static int64_t ggml_calc_conv_transpose_1d_output_size (int64_t ins ,int64_t ks ,int s ,int p ,int d ) { 4715return (ins - 1 )* s - 2 * p + d * (ks - 1 )+ 1 ; 4716} 4717 4718GGML_API struct ggml_tensor * ggml_conv_transpose_1d ( 4719struct ggml_context * ctx , 4720struct ggml_tensor * a , 4721struct ggml_tensor * b , 4722int s0 , 4723int p0 , 4724int d0 ) { 4725GGML_ASSERT (ggml_is_matrix (b )); 4726GGML_ASSERT (a -> ne [2 ]== b -> ne [1 ]); 4727GGML_ASSERT (a -> ne [3 ]== 1 ); 4728 4729GGML_ASSERT (p0 == 0 ); 4730GGML_ASSERT (d0 == 1 ); 4731 4732const int64_t ne [4 ]= { 4733ggml_calc_conv_transpose_1d_output_size (b -> ne [0 ],a -> ne [0 ],s0 ,0 /*p0*/ ,1 /*d0*/ ), 4734a -> ne [1 ],b -> ne [2 ],1 , 4735 }; 4736struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,4 ,ne ); 4737 4738int32_t params []= {s0 ,p0 ,d0 }; 4739ggml_set_op_params (result ,params ,sizeof (params )); 4740 4741result -> op = GGML_OP_CONV_TRANSPOSE_1D ; 4742result -> src [0 ]= a ; 4743result -> src [1 ]= b ; 4744 4745return result ; 4746} 4747 4748// ggml_conv_2d 4749 4750// a: [OC,IC, KH, KW] 4751// b: [N, IC, IH, IW] 4752// result: [N, OC, OH, OW] 4753struct ggml_tensor * ggml_conv_2d ( 4754struct ggml_context * ctx , 4755struct ggml_tensor * a , 4756struct ggml_tensor * b , 4757int s0 , 4758int s1 , 4759int p0 , 4760int p1 , 4761int d0 , 4762int d1 ) { 4763struct ggml_tensor * im2col = ggml_im2col (ctx ,a ,b ,s0 ,s1 ,p0 ,p1 ,d0 ,d1 , true,a -> type == GGML_TYPE_BF16 ?GGML_TYPE_F32 :GGML_TYPE_F16 );// [N, OH, OW, IC * KH * KW] 4764 4765struct ggml_tensor * result = 4766ggml_mul_mat (ctx , 4767ggml_reshape_2d (ctx ,im2col ,im2col -> ne [0 ],im2col -> ne [3 ]* im2col -> ne [2 ]* im2col -> ne [1 ]),// [N, OH, OW, IC * KH * KW] => [N*OH*OW, IC * KH * KW] 4768ggml_reshape_2d (ctx ,a , (a -> ne [0 ]* a -> ne [1 ]* a -> ne [2 ]),a -> ne [3 ]));// [OC,IC, KH, KW] => [OC, IC * KH * KW] 4769 4770result = ggml_reshape_4d (ctx ,result ,im2col -> ne [1 ],im2col -> ne [2 ],im2col -> ne [3 ],a -> ne [3 ]);// [OC, N, OH, OW] 4771result = ggml_cont (ctx ,ggml_permute (ctx ,result ,0 ,1 ,3 ,2 ));// [N, OC, OH, OW] 4772 4773 4774return result ; 4775} 4776 4777// a: [OC*IC, KD, KH, KW] 4778// b: [N*IC, ID, IH, IW] 4779// result: [N*OD, OH, OW, IC * KD * KH * KW] 4780struct ggml_tensor * ggml_im2col_3d ( 4781struct ggml_context * ctx , 4782struct ggml_tensor * a , 4783struct ggml_tensor * b , 4784int64_t IC , 4785int s0 ,// stride width 4786int s1 ,// stride height 4787int s2 ,// stride depth 4788int p0 ,// padding width 4789int p1 ,// padding height 4790int p2 ,// padding depth 4791int d0 ,// dilation width 4792int d1 ,// dilation height 4793int d2 ,// dilation depth 4794enum ggml_type dst_type ) { 4795const int64_t N = b -> ne [3 ] /IC ; 4796const int64_t ID = b -> ne [2 ]; 4797const int64_t IH = b -> ne [1 ]; 4798const int64_t IW = b -> ne [0 ]; 4799 4800const int64_t OC = a -> ne [3 ] /IC ; 4801UNUSED (OC ); 4802const int64_t KD = a -> ne [2 ]; 4803const int64_t KH = a -> ne [1 ]; 4804const int64_t KW = a -> ne [0 ]; 4805const int64_t OD = ggml_calc_conv_output_size (ID ,KD ,s2 ,p2 ,d2 ); 4806const int64_t OH = ggml_calc_conv_output_size (IH ,KH ,s1 ,p1 ,d1 ); 4807const int64_t OW = ggml_calc_conv_output_size (IW ,KW ,s0 ,p0 ,d0 ); 4808 4809GGML_ASSERT ((OD > 0 )&& "b too small compared to a" ); 4810GGML_ASSERT ((OH > 0 )&& "b too small compared to a" ); 4811GGML_ASSERT ((OW > 0 )&& "b too small compared to a" ); 4812 4813 4814const int64_t ne [4 ]= {KW * KH * KD * IC ,OW ,OH ,OD * N }; 4815 4816struct ggml_tensor * result = ggml_new_tensor (ctx ,dst_type ,4 ,ne ); 4817int32_t params []= {s0 ,s1 ,s2 ,p0 ,p1 ,p2 ,d0 ,d1 ,d2 , (int32_t )IC }; 4818ggml_set_op_params (result ,params ,sizeof (params )); 4819 4820result -> op = GGML_OP_IM2COL_3D ; 4821result -> src [0 ]= a ; 4822result -> src [1 ]= b ; 4823 4824return result ; 4825} 4826 4827// a: [OC*IC, KD, KH, KW] 4828// b: [N*IC, ID, IH, IW] 4829// result: [N*OC, OD, OH, OW] 4830struct ggml_tensor * ggml_conv_3d ( 4831struct ggml_context * ctx , 4832struct ggml_tensor * a , 4833struct ggml_tensor * b , 4834int64_t IC , 4835int s0 ,// stride width 4836int s1 ,// stride height 4837int s2 ,// stride depth 4838int p0 ,// padding width 4839int p1 ,// padding height 4840int p2 ,// padding depth 4841int d0 ,// dilation width 4842int d1 ,// dilation height 4843int d2 // dilation depth 4844 ) { 4845struct ggml_tensor * im2col = ggml_im2col_3d (ctx ,a ,b ,IC ,s0 ,s1 ,s2 ,p0 ,p1 ,p2 ,d0 ,d1 ,d2 ,a -> type == GGML_TYPE_BF16 ?GGML_TYPE_F32 :GGML_TYPE_F16 );// [N*OD, OH, OW, IC * KD * KH * KW] 4846 4847int64_t OC = a -> ne [3 ] /IC ; 4848int64_t N = b -> ne [3 ] /IC ; 4849struct ggml_tensor * result = 4850ggml_mul_mat (ctx , 4851ggml_reshape_2d (ctx ,im2col ,im2col -> ne [0 ],im2col -> ne [3 ]* im2col -> ne [2 ]* im2col -> ne [1 ]),// [N*OD, OH, OW, IC * KD * KH * KW] => [N*OD*OH*OW, IC * KD * KH * KW] 4852ggml_reshape_2d (ctx ,a , (a -> ne [0 ]* a -> ne [1 ]* a -> ne [2 ]* IC ),OC ));// [OC*IC, KD, KH, KW] => [OC, IC * KD * KH * KW] 4853 4854int64_t OD = im2col -> ne [3 ] /N ; 4855result = ggml_reshape_4d (ctx ,result ,im2col -> ne [1 ]* im2col -> ne [2 ],OD ,N ,OC );// [OC, N*OD*OH*OW] => [OC, N, OD, OH*OW] 4856result = ggml_cont (ctx ,ggml_permute (ctx ,result ,0 ,1 ,3 ,2 ));// [N, OC, OD, OH*OW] 4857result = ggml_reshape_4d (ctx ,result ,im2col -> ne [1 ],im2col -> ne [2 ],OD ,OC * N );// [N*OC, OD, OH, OW] 4858 4859return result ; 4860} 4861 4862// ggml_conv_2d_sk_p0 4863 4864struct ggml_tensor * ggml_conv_2d_sk_p0 ( 4865struct ggml_context * ctx , 4866struct ggml_tensor * a , 4867struct ggml_tensor * b ) { 4868return ggml_conv_2d (ctx ,a ,b ,a -> ne [0 ],a -> ne [1 ],0 ,0 ,1 ,1 ); 4869} 4870 4871// ggml_conv_2d_s1_ph 4872 4873struct ggml_tensor * ggml_conv_2d_s1_ph ( 4874struct ggml_context * ctx , 4875struct ggml_tensor * a , 4876struct ggml_tensor * b ) { 4877return ggml_conv_2d (ctx ,a ,b ,1 ,1 ,a -> ne [0 ] /2 ,a -> ne [1 ] /2 ,1 ,1 ); 4878} 4879 4880// ggml_conv_2d_dw 4881 4882struct ggml_tensor * ggml_conv_2d_dw ( 4883struct ggml_context * ctx , 4884struct ggml_tensor * a , 4885struct ggml_tensor * b , 4886int s0 , 4887int s1 , 4888int p0 , 4889int p1 , 4890int d0 , 4891int d1 ) { 4892struct ggml_tensor * new_a = ggml_reshape_4d (ctx ,a ,a -> ne [0 ],a -> ne [1 ],1 ,a -> ne [2 ]* a -> ne [3 ]); 4893struct ggml_tensor * im2col = ggml_im2col (ctx ,new_a , 4894ggml_reshape_4d (ctx ,b ,b -> ne [0 ],b -> ne [1 ],1 ,b -> ne [2 ]* b -> ne [3 ]), 4895s0 ,s1 ,p0 ,p1 ,d0 ,d1 , true,a -> type == GGML_TYPE_BF16 ?GGML_TYPE_F32 :GGML_TYPE_F16 );// [N * IC, OH, OW, KH * KW] 4896struct ggml_tensor * new_b = ggml_reshape_4d (ctx ,im2col ,im2col -> ne [0 ],im2col -> ne [2 ]* im2col -> ne [1 ],b -> ne [2 ],b -> ne [3 ]);// [N * IC, OH, OW, KH * KW] => [N, IC, OH * OW, KH * KW] 4897 4898new_a = ggml_reshape_4d (ctx ,new_a , (new_a -> ne [0 ]* new_a -> ne [1 ]),new_a -> ne [2 ],new_a -> ne [3 ],1 );// [OC,1, KH, KW] => [1, OC, 1, KH * KW] 4899struct ggml_tensor * result = ggml_mul_mat (ctx ,new_a ,new_b ); 4900result = ggml_reshape_4d (ctx ,result ,im2col -> ne [1 ],im2col -> ne [2 ],b -> ne [2 ],b -> ne [3 ]);// [N, OC, OH, OW] 4901 4902return result ; 4903} 4904 4905// ggml_conv_2d_dw_direct 4906 4907struct ggml_tensor * ggml_conv_2d_dw_direct ( 4908struct ggml_context * ctx , 4909struct ggml_tensor * a , 4910struct ggml_tensor * b , 4911int stride0 , 4912int stride1 , 4913int pad0 , 4914int pad1 , 4915int dilation0 , 4916int dilation1 ) { 4917GGML_ASSERT (a -> ne [2 ]== 1 ); 4918GGML_ASSERT (a -> ne [3 ]== b -> ne [2 ]); 4919int64_t ne [4 ]; 4920ne [0 ]= ggml_calc_conv_output_size (b -> ne [0 ],a -> ne [0 ],stride0 ,pad0 ,dilation0 ); 4921ne [1 ]= ggml_calc_conv_output_size (b -> ne [1 ],a -> ne [1 ],stride1 ,pad1 ,dilation1 ); 4922ne [2 ]= b -> ne [2 ]; 4923ne [3 ]= b -> ne [3 ]; 4924 4925struct ggml_tensor * result = ggml_new_tensor (ctx ,b -> type ,4 ,ne ); 4926 4927if (ggml_is_contiguous_channels (b )) { 4928// Result will be permuted the same way as input (CWHN order) 4929const int64_t type_size = ggml_type_size (result -> type ); 4930GGML_ASSERT (ggml_blck_size (result -> type )== 1 ); 4931result -> nb [0 ]= result -> ne [2 ]* type_size ; 4932result -> nb [1 ]= result -> ne [0 ]* result -> nb [0 ]; 4933result -> nb [2 ]= type_size ; 4934 } 4935 4936int32_t params []= {stride0 ,stride1 ,pad0 ,pad1 ,dilation0 ,dilation1 }; 4937ggml_set_op_params (result ,params ,sizeof (params )); 4938 4939result -> op = GGML_OP_CONV_2D_DW ; 4940result -> src [0 ]= a ; 4941result -> src [1 ]= b ; 4942return result ; 4943} 4944 4945// ggml_conv_2d_direct 4946 4947struct ggml_tensor * ggml_conv_2d_direct ( 4948struct ggml_context * ctx , 4949struct ggml_tensor * a ,// convolution kernel [KW, KH, IC, OC] 4950struct ggml_tensor * b ,// input data [W, H, C, N] 4951int s0 ,// stride dimension 0 4952int s1 ,// stride dimension 1 4953int p0 ,// padding dimension 0 4954int p1 ,// padding dimension 1 4955int d0 ,// dilation dimension 0 4956int d1 ) {// dilation dimension 1 4957 4958GGML_ASSERT (a -> ne [2 ]== b -> ne [2 ]); 4959//GGML_ASSERT(a->type == b->type); 4960 4961int64_t ne [4 ]; 4962ne [0 ]= ggml_calc_conv_output_size (b -> ne [0 ],a -> ne [0 ],s0 ,p0 ,d0 ); 4963ne [1 ]= ggml_calc_conv_output_size (b -> ne [1 ],a -> ne [1 ],s1 ,p1 ,d1 ); 4964ne [2 ]= a -> ne [3 ]; 4965ne [3 ]= b -> ne [3 ]; 4966 4967struct ggml_tensor * result = ggml_new_tensor (ctx ,b -> type ,4 ,ne ); 4968 4969ggml_set_op_params_i32 (result ,0 ,s0 ); 4970ggml_set_op_params_i32 (result ,1 ,s1 ); 4971ggml_set_op_params_i32 (result ,2 ,p0 ); 4972ggml_set_op_params_i32 (result ,3 ,p1 ); 4973ggml_set_op_params_i32 (result ,4 ,d0 ); 4974ggml_set_op_params_i32 (result ,5 ,d1 ); 4975 4976result -> op = GGML_OP_CONV_2D ; 4977result -> src [0 ]= a ; 4978result -> src [1 ]= b ; 4979 4980return result ; 4981} 4982 4983// ggml_conv_3d_direct 4984 4985struct ggml_tensor * ggml_conv_3d_direct ( 4986struct ggml_context * ctx , 4987struct ggml_tensor * a , 4988struct ggml_tensor * b , 4989int s0 , 4990int s1 , 4991int s2 , 4992int p0 , 4993int p1 , 4994int p2 , 4995int d0 , 4996int d1 , 4997int d2 , 4998int c , 4999int n , 5000int oc ) { 5001 5002GGML_ASSERT (a -> ne [3 ]== (int64_t )c * oc ); 5003GGML_ASSERT (b -> ne [3 ]== (int64_t )c * n ); 5004 5005int64_t ne [4 ]; 5006ne [0 ]= ggml_calc_conv_output_size (b -> ne [0 ],a -> ne [0 ],s0 ,p0 ,d0 ); 5007ne [1 ]= ggml_calc_conv_output_size (b -> ne [1 ],a -> ne [1 ],s1 ,p1 ,d1 ); 5008ne [2 ]= ggml_calc_conv_output_size (b -> ne [2 ],a -> ne [2 ],s2 ,p2 ,d2 ); 5009ne [3 ]= (int64_t )oc * n ; 5010 5011struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,4 ,ne ); 5012 5013ggml_set_op_params_i32 (result ,0 ,s0 ); 5014ggml_set_op_params_i32 (result ,1 ,s1 ); 5015ggml_set_op_params_i32 (result ,2 ,s2 ); 5016ggml_set_op_params_i32 (result ,3 ,p0 ); 5017ggml_set_op_params_i32 (result ,4 ,p1 ); 5018ggml_set_op_params_i32 (result ,5 ,p2 ); 5019ggml_set_op_params_i32 (result ,6 ,d0 ); 5020ggml_set_op_params_i32 (result ,7 ,d1 ); 5021ggml_set_op_params_i32 (result ,8 ,d2 ); 5022ggml_set_op_params_i32 (result ,9 ,c ); 5023ggml_set_op_params_i32 (result ,10 ,n ); 5024ggml_set_op_params_i32 (result ,11 ,oc ); 5025 5026result -> op = GGML_OP_CONV_3D ; 5027result -> src [0 ]= a ; 5028result -> src [1 ]= b ; 5029 5030return result ; 5031} 5032 5033// ggml_conv_transpose_2d_p0 5034 5035static int64_t ggml_calc_conv_transpose_output_size (int64_t ins ,int64_t ks ,int s ,int p ) { 5036return (ins - 1 )* s - 2 * p + ks ; 5037} 5038 5039struct ggml_tensor * ggml_conv_transpose_2d_p0 ( 5040struct ggml_context * ctx , 5041struct ggml_tensor * a , 5042struct ggml_tensor * b , 5043int stride ) { 5044GGML_ASSERT (a -> ne [3 ]== b -> ne [2 ]); 5045 5046const int64_t ne [4 ]= { 5047ggml_calc_conv_transpose_output_size (b -> ne [0 ],a -> ne [0 ],stride ,0 /*p0*/ ), 5048ggml_calc_conv_transpose_output_size (b -> ne [1 ],a -> ne [1 ],stride ,0 /*p1*/ ), 5049a -> ne [2 ],b -> ne [3 ], 5050 }; 5051 5052struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,4 ,ne ); 5053 5054ggml_set_op_params_i32 (result ,0 ,stride ); 5055 5056result -> op = GGML_OP_CONV_TRANSPOSE_2D ; 5057result -> src [0 ]= a ; 5058result -> src [1 ]= b ; 5059 5060return result ; 5061} 5062 5063// ggml_pool_* 5064 5065static int64_t ggml_calc_pool_output_size (int64_t ins ,int ks ,int s ,float p ) { 5066return (ins + 2 * p - ks ) /s + 1 ; 5067} 5068 5069// ggml_pool_1d 5070 5071struct ggml_tensor * ggml_pool_1d ( 5072struct ggml_context * ctx , 5073struct ggml_tensor * a , 5074enum ggml_op_pool op , 5075int k0 , 5076int s0 , 5077int p0 ) { 5078const int64_t ne [4 ]= { 5079ggml_calc_pool_output_size (a -> ne [0 ],k0 ,s0 ,p0 ), 5080a -> ne [1 ], 5081a -> ne [2 ], 5082a -> ne [3 ], 5083 }; 5084GGML_ASSERT (ne [0 ]> 0 ); 5085 5086struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,4 ,ne ); 5087 5088int32_t params []= {op ,k0 ,s0 ,p0 }; 5089ggml_set_op_params (result ,params ,sizeof (params )); 5090 5091result -> op = GGML_OP_POOL_1D ; 5092result -> src [0 ]= a ; 5093 5094return result ; 5095} 5096 5097// ggml_pool_2d 5098 5099struct ggml_tensor * ggml_pool_2d ( 5100struct ggml_context * ctx , 5101struct ggml_tensor * a , 5102enum ggml_op_pool op , 5103int k0 , 5104int k1 , 5105int s0 , 5106int s1 , 5107float p0 , 5108float p1 ) { 5109struct ggml_tensor * result ; 5110const int64_t ne [4 ]= { 5111ggml_calc_pool_output_size (a -> ne [0 ],k0 ,s0 ,p0 ), 5112ggml_calc_pool_output_size (a -> ne [1 ],k1 ,s1 ,p1 ), 5113a -> ne [2 ], 5114a -> ne [3 ], 5115 }; 5116GGML_ASSERT (ne [0 ]> 0 ); 5117GGML_ASSERT (ne [1 ]> 0 ); 5118 5119result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,4 ,ne ); 5120 5121int32_t params []= {op ,k0 ,k1 ,s0 ,s1 ,p0 ,p1 }; 5122ggml_set_op_params (result ,params ,sizeof (params )); 5123 5124result -> op = GGML_OP_POOL_2D ; 5125result -> src [0 ]= a ; 5126 5127return result ; 5128} 5129 5130struct ggml_tensor * ggml_pool_2d_back ( 5131struct ggml_context * ctx , 5132struct ggml_tensor * a , 5133struct ggml_tensor * af , 5134enum ggml_op_pool op , 5135int k0 , 5136int k1 , 5137int s0 , 5138int s1 , 5139float p0 , 5140float p1 ) { 5141struct ggml_tensor * result ; 5142result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,4 ,af -> ne ); 5143 5144int32_t params []= {op ,k0 ,k1 ,s0 ,s1 ,p0 ,p1 }; 5145ggml_set_op_params (result ,params ,sizeof (params )); 5146 5147result -> op = GGML_OP_POOL_2D_BACK ; 5148result -> src [0 ]= a ; 5149result -> src [1 ]= af ; 5150 5151return result ; 5152} 5153 5154// ggml_upscale / ggml_interpolate 5155 5156static struct ggml_tensor * ggml_interpolate_impl ( 5157struct ggml_context * ctx , 5158struct ggml_tensor * a , 5159int64_t ne0 , 5160int64_t ne1 , 5161int64_t ne2 , 5162int64_t ne3 , 5163uint32_t mode ) { 5164GGML_ASSERT ((mode & 0xFF )< GGML_SCALE_MODE_COUNT ); 5165// TODO: implement antialias for modes other than bilinear 5166GGML_ASSERT (!(mode & GGML_SCALE_FLAG_ANTIALIAS )|| (mode & 0xFF )== GGML_SCALE_MODE_BILINEAR ); 5167GGML_ASSERT (a -> type == GGML_TYPE_F32 ); 5168 5169struct ggml_tensor * result = ggml_new_tensor_4d (ctx ,a -> type ,ne0 ,ne1 ,ne2 ,ne3 ); 5170 5171ggml_set_op_params_i32 (result ,0 , (int32_t )mode ); 5172 5173result -> op = GGML_OP_UPSCALE ; 5174result -> src [0 ]= a ; 5175 5176return result ; 5177} 5178 5179struct ggml_tensor * ggml_upscale ( 5180struct ggml_context * ctx , 5181struct ggml_tensor * a , 5182int scale_factor , 5183enum ggml_scale_mode mode ) { 5184GGML_ASSERT (scale_factor > 1 ); 5185return ggml_interpolate_impl (ctx ,a ,a -> ne [0 ]* scale_factor ,a -> ne [1 ]* scale_factor ,a -> ne [2 ],a -> ne [3 ],mode ); 5186} 5187 5188struct ggml_tensor * ggml_upscale_ext ( 5189struct ggml_context * ctx , 5190struct ggml_tensor * a , 5191int ne0 , 5192int ne1 , 5193int ne2 , 5194int ne3 , 5195enum ggml_scale_mode mode ) { 5196return ggml_interpolate_impl (ctx ,a ,ne0 ,ne1 ,ne2 ,ne3 ,mode ); 5197} 5198 5199struct ggml_tensor * ggml_interpolate ( 5200struct ggml_context * ctx , 5201struct ggml_tensor * a , 5202int64_t ne0 , 5203int64_t ne1 , 5204int64_t ne2 , 5205int64_t ne3 , 5206uint32_t mode ) { 5207return ggml_interpolate_impl (ctx ,a ,ne0 ,ne1 ,ne2 ,ne3 ,mode ); 5208} 5209 5210// ggml_pad 5211 5212struct ggml_tensor * ggml_pad ( 5213struct ggml_context * ctx , 5214struct ggml_tensor * a , 5215int p0 , 5216int p1 , 5217int p2 , 5218int p3 ) { 5219return ggml_pad_ext (ctx ,a ,0 ,p0 ,0 ,p1 ,0 ,p2 ,0 ,p3 ); 5220} 5221 5222// ggml_pad_circular 5223 5224struct ggml_tensor * ggml_pad_circular ( 5225struct ggml_context * ctx , 5226struct ggml_tensor * a , 5227int p0 , 5228int p1 , 5229int p2 , 5230int p3 ) { 5231return ggml_pad_ext_circular (ctx ,a ,0 ,p0 ,0 ,p1 ,0 ,p2 ,0 ,p3 ); 5232} 5233 5234struct ggml_tensor * ggml_pad_ext ( 5235struct ggml_context * ctx , 5236struct ggml_tensor * a , 5237int lp0 , 5238int rp0 , 5239int lp1 , 5240int rp1 , 5241int lp2 , 5242int rp2 , 5243int lp3 , 5244int rp3 5245 ) { 5246struct ggml_tensor * result = ggml_new_tensor_4d (ctx ,a -> type , 5247a -> ne [0 ]+ lp0 + rp0 , 5248a -> ne [1 ]+ lp1 + rp1 , 5249a -> ne [2 ]+ lp2 + rp2 , 5250a -> ne [3 ]+ lp3 + rp3 ); 5251 5252ggml_set_op_params_i32 (result ,0 ,lp0 ); 5253ggml_set_op_params_i32 (result ,1 ,rp0 ); 5254ggml_set_op_params_i32 (result ,2 ,lp1 ); 5255ggml_set_op_params_i32 (result ,3 ,rp1 ); 5256ggml_set_op_params_i32 (result ,4 ,lp2 ); 5257ggml_set_op_params_i32 (result ,5 ,rp2 ); 5258ggml_set_op_params_i32 (result ,6 ,lp3 ); 5259ggml_set_op_params_i32 (result ,7 ,rp3 ); 5260ggml_set_op_params_i32 (result ,8 ,0 );// not circular by default 5261 5262 5263result -> op = GGML_OP_PAD ; 5264result -> src [0 ]= a ; 5265 5266return result ; 5267} 5268 5269// ggml_pad_ext_circular 5270 5271struct ggml_tensor * ggml_pad_ext_circular ( 5272struct ggml_context * ctx , 5273struct ggml_tensor * a , 5274int lp0 , 5275int rp0 , 5276int lp1 , 5277int rp1 , 5278int lp2 , 5279int rp2 , 5280int lp3 , 5281int rp3 5282 ) { 5283struct ggml_tensor * result = ggml_pad_ext (ctx ,a ,lp0 ,rp0 ,lp1 ,rp1 ,lp2 ,rp2 ,lp3 ,rp3 ); 5284ggml_set_op_params_i32 (result ,8 ,1 );// circular 5285return result ; 5286} 5287 5288// ggml_pad_reflect_1d 5289 5290struct ggml_tensor * ggml_pad_reflect_1d ( 5291struct ggml_context * ctx , 5292struct ggml_tensor * a , 5293int p0 , 5294int p1 ) { 5295GGML_ASSERT (p0 >=0 ); 5296GGML_ASSERT (p1 >=0 ); 5297 5298GGML_ASSERT (p0 < a -> ne [0 ]);// padding length on each size must be less than the 5299GGML_ASSERT (p1 < a -> ne [0 ]);// existing length of the dimension being padded 5300 5301GGML_ASSERT (ggml_is_contiguous (a )); 5302GGML_ASSERT (a -> type == GGML_TYPE_F32 ); 5303 5304struct ggml_tensor * result = ggml_new_tensor_4d (ctx ,a -> type , 5305a -> ne [0 ]+ p0 + p1 , 5306a -> ne [1 ], 5307a -> ne [2 ], 5308a -> ne [3 ]); 5309 5310int32_t params []= {p0 ,p1 }; 5311ggml_set_op_params (result ,params ,sizeof (params )); 5312 5313result -> op = GGML_OP_PAD_REFLECT_1D ; 5314result -> src [0 ]= a ; 5315 5316return result ; 5317} 5318 5319// ggml_roll 5320 5321struct ggml_tensor * ggml_roll ( 5322struct ggml_context * ctx , 5323struct ggml_tensor * a , 5324int shift0 , 5325int shift1 , 5326int shift2 , 5327int shift3 ) { 5328GGML_ASSERT (a -> nb [0 ]== ggml_type_size (a -> type )); 5329GGML_ASSERT (abs (shift0 )< a -> ne [0 ]); 5330GGML_ASSERT (abs (shift1 )< a -> ne [1 ]); 5331GGML_ASSERT (abs (shift2 )< a -> ne [2 ]); 5332GGML_ASSERT (abs (shift3 )< a -> ne [3 ]); 5333 5334struct ggml_tensor * result = ggml_dup_tensor (ctx ,a ); 5335 5336ggml_set_op_params_i32 (result ,0 ,shift0 ); 5337ggml_set_op_params_i32 (result ,1 ,shift1 ); 5338ggml_set_op_params_i32 (result ,2 ,shift2 ); 5339ggml_set_op_params_i32 (result ,3 ,shift3 ); 5340 5341result -> op = GGML_OP_ROLL ; 5342result -> src [0 ]= a ; 5343 5344return result ; 5345} 5346 5347// ggml_timestep_embedding 5348 5349struct ggml_tensor * ggml_timestep_embedding ( 5350struct ggml_context * ctx , 5351struct ggml_tensor * timesteps , 5352int dim , 5353int max_period ) { 5354 5355struct ggml_tensor * result = ggml_new_tensor_2d (ctx ,GGML_TYPE_F32 ,dim ,timesteps -> ne [0 ]); 5356 5357ggml_set_op_params_i32 (result ,0 ,dim ); 5358ggml_set_op_params_i32 (result ,1 ,max_period ); 5359 5360result -> op = GGML_OP_TIMESTEP_EMBEDDING ; 5361result -> src [0 ]= timesteps ; 5362 5363return result ; 5364} 5365 5366// ggml_tri 5367 5368struct ggml_tensor * ggml_tri ( 5369struct ggml_context * ctx , 5370struct ggml_tensor * a , 5371enum ggml_tri_type type ) { 5372GGML_ASSERT (a -> type == GGML_TYPE_F32 ); 5373 5374GGML_ASSERT (ggml_is_contiguous (a )); 5375GGML_ASSERT (a -> ne [0 ]== a -> ne [1 ]); 5376 5377struct ggml_tensor * result = ggml_dup_tensor (ctx ,a ); 5378 5379ggml_set_op_params_i32 (result ,0 ,type ); 5380 5381result -> op = GGML_OP_TRI ; 5382result -> src [0 ]= a ; 5383 5384return result ; 5385} 5386 5387// ggml_fill 5388 5389static struct ggml_tensor * ggml_fill_impl ( 5390struct ggml_context * ctx , 5391struct ggml_tensor * a , 5392float c , 5393bool inplace ) { 5394GGML_ASSERT (a -> type == GGML_TYPE_F32 || a -> type == GGML_TYPE_F16 ); 5395GGML_ASSERT (ggml_is_contiguous (a )); 5396 5397struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 5398 5399ggml_set_op_params_f32 (result ,0 ,c ); 5400 5401result -> op = GGML_OP_FILL ; 5402result -> src [0 ]= a ; 5403 5404return result ; 5405} 5406 5407struct ggml_tensor * ggml_fill ( 5408struct ggml_context * ctx , 5409struct ggml_tensor * a , 5410float c ) { 5411return ggml_fill_impl (ctx ,a ,c , false); 5412} 5413 5414struct ggml_tensor * ggml_fill_inplace ( 5415struct ggml_context * ctx , 5416struct ggml_tensor * a , 5417float c ) { 5418return ggml_fill_impl (ctx ,a ,c , true); 5419} 5420 5421// ggml_argsort 5422 5423struct ggml_tensor * ggml_argsort ( 5424struct ggml_context * ctx , 5425struct ggml_tensor * a , 5426enum ggml_sort_order order ) { 5427GGML_ASSERT (a -> ne [0 ] <=INT32_MAX ); 5428 5429struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_I32 ,GGML_MAX_DIMS ,a -> ne ); 5430 5431ggml_set_op_params_i32 (result ,0 , (int32_t )order ); 5432 5433result -> op = GGML_OP_ARGSORT ; 5434result -> src [0 ]= a ; 5435 5436return result ; 5437} 5438 5439// ggml_argsort_top_k 5440 5441struct ggml_tensor * ggml_argsort_top_k ( 5442struct ggml_context * ctx , 5443struct ggml_tensor * a , 5444int k ) { 5445GGML_ASSERT (a -> ne [0 ] >=k ); 5446 5447struct ggml_tensor * result = ggml_argsort (ctx ,a ,GGML_SORT_ORDER_DESC ); 5448 5449result = ggml_view_4d (ctx ,result , 5450k ,result -> ne [1 ],result -> ne [2 ],result -> ne [3 ], 5451result -> nb [1 ],result -> nb [2 ],result -> nb [3 ], 54520 ); 5453 5454return result ; 5455} 5456 5457// ggml_top_k 5458 5459struct ggml_tensor * ggml_top_k ( 5460struct ggml_context * ctx , 5461struct ggml_tensor * a , 5462int k ) { 5463GGML_ASSERT (a -> ne [0 ] >=k ); 5464 5465struct ggml_tensor * result = ggml_new_tensor_4d (ctx ,GGML_TYPE_I32 ,k ,a -> ne [1 ],a -> ne [2 ],a -> ne [3 ]); 5466 5467result -> op = GGML_OP_TOP_K ; 5468result -> src [0 ]= a ; 5469 5470return result ; 5471} 5472 5473// ggml_arange 5474 5475struct ggml_tensor * ggml_arange ( 5476struct ggml_context * ctx , 5477float start , 5478float stop , 5479float step ) { 5480GGML_ASSERT (stop > start ); 5481 5482const int64_t steps = (int64_t )ceilf ((stop - start ) /step ); 5483 5484struct ggml_tensor * result = ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,steps ); 5485 5486ggml_set_op_params_f32 (result ,0 ,start ); 5487ggml_set_op_params_f32 (result ,1 ,stop ); 5488ggml_set_op_params_f32 (result ,2 ,step ); 5489 5490result -> op = GGML_OP_ARANGE ; 5491 5492return result ; 5493} 5494 5495// ggml_flash_attn_ext 5496 5497struct ggml_tensor * ggml_flash_attn_ext ( 5498struct ggml_context * ctx , 5499struct ggml_tensor * q , 5500struct ggml_tensor * k , 5501struct ggml_tensor * v , 5502struct ggml_tensor * mask , 5503float scale , 5504float max_bias , 5505float logit_softcap ) { 5506GGML_ASSERT (ggml_can_mul_mat (k ,q )); 5507// TODO: check if vT can be multiplied by (k*qT) 5508 5509GGML_ASSERT (q -> ne [3 ]== k -> ne [3 ]); 5510GGML_ASSERT (q -> ne [3 ]== v -> ne [3 ]); 5511 5512if (mask ) { 5513GGML_ASSERT (mask -> type == GGML_TYPE_F16 ); 5514GGML_ASSERT (ggml_is_contiguous (mask )); 5515//GGML_ASSERT(ggml_can_repeat_rows(mask, qk)); 5516 5517GGML_ASSERT (q -> ne [2 ] %mask -> ne [2 ]== 0 ); 5518GGML_ASSERT (q -> ne [3 ] %mask -> ne [3 ]== 0 ); 5519 } 5520 5521if (max_bias > 0.0f ) { 5522GGML_ASSERT (mask ); 5523 } 5524 5525// permute(0, 2, 1, 3) 5526int64_t ne [4 ]= {v -> ne [0 ],q -> ne [2 ],q -> ne [1 ],q -> ne [3 ] }; 5527struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,4 ,ne ); 5528 5529float params []= {scale ,max_bias ,logit_softcap }; 5530ggml_set_op_params (result ,params ,sizeof (params )); 5531 5532result -> op = GGML_OP_FLASH_ATTN_EXT ; 5533result -> src [0 ]= q ; 5534result -> src [1 ]= k ; 5535result -> src [2 ]= v ; 5536result -> src [3 ]= mask ; 5537 5538return result ; 5539} 5540 5541 5542void ggml_flash_attn_ext_set_prec ( 5543struct ggml_tensor * a , 5544enum ggml_prec prec ) { 5545GGML_ASSERT (a -> op == GGML_OP_FLASH_ATTN_EXT ); 5546 5547const int32_t prec_i32 = (int32_t )prec ; 5548 5549ggml_set_op_params_i32 (a ,3 ,prec_i32 );// scale is on first pos, max_bias on second 5550} 5551 5552enum ggml_prec ggml_flash_attn_ext_get_prec ( 5553const struct ggml_tensor * a ) { 5554GGML_ASSERT (a -> op == GGML_OP_FLASH_ATTN_EXT ); 5555 5556const int32_t prec_i32 = ggml_get_op_params_i32 (a ,3 ); 5557 5558return (enum ggml_prec )prec_i32 ; 5559} 5560 5561void ggml_flash_attn_ext_set_n_kv_max ( 5562struct ggml_tensor * a , 5563int32_t n_kv_max ) { 5564GGML_ASSERT (a -> op == GGML_OP_FLASH_ATTN_EXT ); 5565GGML_ASSERT (n_kv_max >=0 ); 5566 5567ggml_set_op_params_i32 (a ,4 ,n_kv_max ); 5568} 5569 5570void ggml_flash_attn_ext_add_sinks ( 5571struct ggml_tensor * a , 5572struct ggml_tensor * sinks ) { 5573if (!sinks ) { 5574a -> src [4 ]= NULL ; 5575return ; 5576 } 5577 5578GGML_ASSERT (a -> op == GGML_OP_FLASH_ATTN_EXT ); 5579GGML_ASSERT (a -> src [4 ]== NULL ); 5580GGML_ASSERT (a -> src [0 ]-> ne [2 ]== sinks -> ne [0 ]); 5581GGML_ASSERT (sinks -> type == GGML_TYPE_F32 ); 5582 5583a -> src [4 ]= sinks ; 5584} 5585 5586// ggml_flash_attn_back 5587 5588struct ggml_tensor * ggml_flash_attn_back ( 5589struct ggml_context * ctx , 5590struct ggml_tensor * q , 5591struct ggml_tensor * k , 5592struct ggml_tensor * v , 5593struct ggml_tensor * d , 5594bool masked ) { 5595GGML_ABORT ("TODO: adapt to ggml_flash_attn_ext() changes" ); 5596 5597GGML_ASSERT (ggml_can_mul_mat (k ,q )); 5598// TODO: check if vT can be multiplied by (k*qT) 5599 5600// d shape [D,N,ne2,ne3] 5601// q shape [D,N,ne2,ne3] 5602// k shape [D,M,kvne2,ne3] 5603// v shape [M,D,kvne2,ne3] 5604 5605const int64_t D = q -> ne [0 ]; 5606const int64_t N = q -> ne [1 ]; 5607const int64_t M = k -> ne [1 ]; 5608const int64_t ne2 = q -> ne [2 ]; 5609const int64_t ne3 = q -> ne [3 ]; 5610const int64_t kvne2 = k -> ne [2 ]; 5611 5612GGML_ASSERT (k -> ne [0 ]== D ); 5613GGML_ASSERT (v -> ne [0 ]== M ); 5614GGML_ASSERT (v -> ne [1 ]== D ); 5615GGML_ASSERT (d -> ne [0 ]== D ); 5616GGML_ASSERT (d -> ne [1 ]== N ); 5617GGML_ASSERT (k -> ne [2 ]== kvne2 ); 5618GGML_ASSERT (k -> ne [3 ]== ne3 ); 5619GGML_ASSERT (v -> ne [2 ]== kvne2 ); 5620GGML_ASSERT (v -> ne [3 ]== ne3 ); 5621GGML_ASSERT (d -> ne [2 ]== ne2 ); 5622GGML_ASSERT (d -> ne [3 ]== ne3 ); 5623 5624GGML_ASSERT (ne2 %kvne2 == 0 ); 5625 5626// store gradients of q, k and v as continuous tensors concatenated in result. 5627// note: v and gradv are actually transposed, i.e. v->ne[0] != D. 5628const int64_t elem_q = ggml_nelements (q ); 5629const int64_t elem_k = ggml_nelements (k ); 5630const int64_t elem_v = ggml_nelements (v ); 5631 5632enum ggml_type result_type = GGML_TYPE_F32 ; 5633GGML_ASSERT (ggml_blck_size (result_type )== 1 ); 5634const size_t tsize = ggml_type_size (result_type ); 5635 5636const size_t offs_q = 0 ; 5637const size_t offs_k = offs_q + GGML_PAD (elem_q * tsize ,GGML_MEM_ALIGN ); 5638const size_t offs_v = offs_k + GGML_PAD (elem_k * tsize ,GGML_MEM_ALIGN ); 5639const size_t end = offs_v + GGML_PAD (elem_v * tsize ,GGML_MEM_ALIGN ); 5640 5641const size_t nelements = (end + tsize - 1 )/tsize ; 5642 5643struct ggml_tensor * result = ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,nelements ); 5644 5645int32_t masked_i = masked ?1 :0 ; 5646ggml_set_op_params (result ,& masked_i ,sizeof (masked_i )); 5647 5648result -> op = GGML_OP_FLASH_ATTN_BACK ; 5649result -> src [0 ]= q ; 5650result -> src [1 ]= k ; 5651result -> src [2 ]= v ; 5652result -> src [3 ]= d ; 5653 5654return result ; 5655} 5656 5657// ggml_ssm_conv 5658 5659struct ggml_tensor * ggml_ssm_conv ( 5660struct ggml_context * ctx , 5661struct ggml_tensor * sx , 5662struct ggml_tensor * c ) { 5663GGML_ASSERT (ggml_is_3d (sx )); 5664GGML_ASSERT (ggml_is_matrix (c )); 5665 5666const int64_t d_conv = c -> ne [0 ]; 5667const int64_t d_inner = c -> ne [1 ]; 5668const int64_t n_t = sx -> ne [0 ]- d_conv + 1 ;// tokens per sequence 5669const int64_t n_s = sx -> ne [2 ]; 5670 5671// TODO: maybe support other strides than 1? 5672GGML_ASSERT (sx -> ne [0 ]== d_conv - 1 + n_t ); 5673GGML_ASSERT (sx -> ne [1 ]== d_inner ); 5674GGML_ASSERT (n_t >=0 ); 5675 5676struct ggml_tensor * result = ggml_new_tensor_3d (ctx ,GGML_TYPE_F32 ,d_inner ,n_t ,n_s ); 5677 5678result -> op = GGML_OP_SSM_CONV ; 5679result -> src [0 ]= sx ; 5680result -> src [1 ]= c ; 5681 5682return result ; 5683} 5684 5685// ggml_ssm_scan 5686 5687struct ggml_tensor * ggml_ssm_scan ( 5688struct ggml_context * ctx , 5689struct ggml_tensor * s , 5690struct ggml_tensor * x , 5691struct ggml_tensor * dt , 5692struct ggml_tensor * A , 5693struct ggml_tensor * B , 5694struct ggml_tensor * C , 5695struct ggml_tensor * ids , 5696int64_t K ) { 5697GGML_ASSERT (K >=1 ); 5698GGML_ASSERT (K <=INT32_MAX ); 5699GGML_ASSERT (ggml_is_contiguous (s )); 5700GGML_ASSERT (ggml_is_contiguous (dt )); 5701GGML_ASSERT (ggml_is_contiguous (A )); 5702GGML_ASSERT (x -> nb [0 ]== ggml_type_size (x -> type )); 5703GGML_ASSERT (B -> nb [0 ]== ggml_type_size (B -> type )); 5704GGML_ASSERT (C -> nb [0 ]== ggml_type_size (C -> type )); 5705GGML_ASSERT (x -> nb [1 ]== x -> ne [0 ]* x -> nb [0 ]); 5706GGML_ASSERT (B -> nb [1 ]== B -> ne [0 ]* B -> nb [0 ]); 5707GGML_ASSERT (C -> nb [1 ]== C -> ne [0 ]* C -> nb [0 ]); 5708GGML_ASSERT (ggml_are_same_shape (B ,C )); 5709GGML_ASSERT (ids -> type == GGML_TYPE_I32 ); 5710 5711 { 5712const int64_t d_state = s -> ne [0 ]; 5713const int64_t head_dim = x -> ne [0 ]; 5714const int64_t n_head = x -> ne [1 ]; 5715const int64_t n_seq_tokens = x -> ne [2 ]; 5716const int64_t n_seqs = x -> ne [3 ]; 5717 5718GGML_ASSERT (dt -> ne [0 ]== n_head ); 5719GGML_ASSERT (dt -> ne [1 ]== n_seq_tokens ); 5720GGML_ASSERT (dt -> ne [2 ]== n_seqs ); 5721GGML_ASSERT (ggml_is_3d (dt )); 5722GGML_ASSERT (s -> ne [1 ]== head_dim ); 5723GGML_ASSERT (s -> ne [2 ]== n_head ); 5724GGML_ASSERT (B -> ne [0 ]== d_state ); 5725GGML_ASSERT (B -> ne [2 ]== n_seq_tokens ); 5726GGML_ASSERT (B -> ne [3 ]== n_seqs ); 5727GGML_ASSERT (ids -> ne [0 ]== n_seqs ); 5728GGML_ASSERT (ggml_is_vector (ids )); 5729GGML_ASSERT (A -> ne [1 ]== n_head ); 5730GGML_ASSERT (ggml_is_matrix (A )); 5731 5732if (A -> ne [0 ]!= 1 ) { 5733// Mamba-1 has more granular decay factors 5734GGML_ASSERT (A -> ne [0 ]== d_state ); 5735GGML_ASSERT (K == 1 ); 5736 } 5737 } 5738 5739// concatenated y + ssm_states 5740struct ggml_tensor * result = ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,ggml_nelements (x )+ K * s -> ne [0 ]* s -> ne [1 ]* s -> ne [2 ]* ids -> ne [0 ]); 5741 5742result -> op = GGML_OP_SSM_SCAN ; 5743result -> src [0 ]= s ; 5744result -> src [1 ]= x ; 5745result -> src [2 ]= dt ; 5746result -> src [3 ]= A ; 5747result -> src [4 ]= B ; 5748result -> src [5 ]= C ; 5749result -> src [6 ]= ids ; 5750 5751ggml_set_op_params_i32 (result ,0 , (int32_t )K ); 5752 5753return result ; 5754} 5755 5756// ggml_win_part 5757 5758struct ggml_tensor * ggml_win_part ( 5759struct ggml_context * ctx , 5760struct ggml_tensor * a , 5761int w ) { 5762GGML_ASSERT (a -> ne [3 ]== 1 ); 5763GGML_ASSERT (a -> type == GGML_TYPE_F32 ); 5764 5765// padding 5766const int px = (w - a -> ne [1 ]%w )%w ; 5767const int py = (w - a -> ne [2 ]%w )%w ; 5768 5769const int npx = (px + a -> ne [1 ])/w ; 5770const int npy = (py + a -> ne [2 ])/w ; 5771const int np = npx * npy ; 5772 5773const int64_t ne [4 ]= {a -> ne [0 ],w ,w ,np , }; 5774struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,4 ,ne ); 5775 5776int32_t params []= {npx ,npy ,w }; 5777ggml_set_op_params (result ,params ,sizeof (params )); 5778 5779result -> op = GGML_OP_WIN_PART ; 5780result -> src [0 ]= a ; 5781 5782return result ; 5783} 5784 5785// ggml_win_unpart 5786 5787struct ggml_tensor * ggml_win_unpart ( 5788struct ggml_context * ctx , 5789struct ggml_tensor * a , 5790int w0 , 5791int h0 , 5792int w ) { 5793GGML_ASSERT (a -> type == GGML_TYPE_F32 ); 5794 5795const int64_t ne [4 ]= {a -> ne [0 ],w0 ,h0 ,1 , }; 5796struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,3 ,ne ); 5797 5798int32_t params []= {w }; 5799ggml_set_op_params (result ,params ,sizeof (params )); 5800 5801result -> op = GGML_OP_WIN_UNPART ; 5802result -> src [0 ]= a ; 5803 5804return result ; 5805} 5806 5807// ggml_get_rel_pos 5808 5809struct ggml_tensor * ggml_get_rel_pos ( 5810struct ggml_context * ctx , 5811struct ggml_tensor * a , 5812int qh , 5813int kh ) { 5814GGML_ASSERT (qh == kh ); 5815GGML_ASSERT (2 * MAX (qh ,kh )- 1 == a -> ne [1 ]); 5816 5817const int64_t ne [4 ]= {a -> ne [0 ],kh ,qh ,1 , }; 5818struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F16 ,3 ,ne ); 5819 5820result -> op = GGML_OP_GET_REL_POS ; 5821result -> src [0 ]= a ; 5822 5823return result ; 5824} 5825 5826// ggml_add_rel_pos 5827 5828static struct ggml_tensor * ggml_add_rel_pos_impl ( 5829struct ggml_context * ctx , 5830struct ggml_tensor * a , 5831struct ggml_tensor * pw , 5832struct ggml_tensor * ph , 5833bool inplace ) { 5834GGML_ASSERT (ggml_are_same_shape (pw ,ph )); 5835GGML_ASSERT (ggml_is_contiguous (a )); 5836GGML_ASSERT (ggml_is_contiguous (pw )); 5837GGML_ASSERT (ggml_is_contiguous (ph )); 5838GGML_ASSERT (ph -> type == GGML_TYPE_F32 ); 5839GGML_ASSERT (pw -> type == GGML_TYPE_F32 ); 5840GGML_ASSERT (pw -> ne [3 ]== a -> ne [2 ]); 5841GGML_ASSERT (pw -> ne [0 ]* pw -> ne [0 ]== a -> ne [0 ]); 5842GGML_ASSERT (pw -> ne [1 ]* pw -> ne [2 ]== a -> ne [1 ]); 5843 5844struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 5845ggml_set_op_params_i32 (result ,0 ,inplace ?1 :0 ); 5846 5847result -> op = GGML_OP_ADD_REL_POS ; 5848result -> src [0 ]= a ; 5849result -> src [1 ]= pw ; 5850result -> src [2 ]= ph ; 5851 5852return result ; 5853} 5854 5855struct ggml_tensor * ggml_add_rel_pos ( 5856struct ggml_context * ctx , 5857struct ggml_tensor * a , 5858struct ggml_tensor * pw , 5859struct ggml_tensor * ph ) { 5860return ggml_add_rel_pos_impl (ctx ,a ,pw ,ph , false); 5861} 5862 5863struct ggml_tensor * ggml_add_rel_pos_inplace ( 5864struct ggml_context * ctx , 5865struct ggml_tensor * a , 5866struct ggml_tensor * pw , 5867struct ggml_tensor * ph ) { 5868return ggml_add_rel_pos_impl (ctx ,a ,pw ,ph , true); 5869} 5870 5871// ggml_rwkv_wkv6 5872 5873struct ggml_tensor * ggml_rwkv_wkv6 ( 5874struct ggml_context * ctx , 5875struct ggml_tensor * k , 5876struct ggml_tensor * v , 5877struct ggml_tensor * r , 5878struct ggml_tensor * tf , 5879struct ggml_tensor * td , 5880struct ggml_tensor * state ) { 5881GGML_ASSERT (ggml_is_contiguous (k )); 5882GGML_ASSERT (ggml_is_contiguous (v )); 5883GGML_ASSERT (ggml_is_contiguous (r )); 5884GGML_ASSERT (ggml_is_contiguous (tf )); 5885GGML_ASSERT (ggml_is_contiguous (td )); 5886GGML_ASSERT (ggml_is_contiguous (state )); 5887 5888const int64_t S = k -> ne [0 ]; 5889const int64_t H = k -> ne [1 ]; 5890const int64_t n_tokens = k -> ne [2 ]; 5891const int64_t n_seqs = state -> ne [1 ]; 5892 { 5893GGML_ASSERT (v -> ne [0 ]== S && v -> ne [1 ]== H && v -> ne [2 ]== n_tokens ); 5894GGML_ASSERT (r -> ne [0 ]== S && r -> ne [1 ]== H && r -> ne [2 ]== n_tokens ); 5895GGML_ASSERT (td -> ne [0 ]== S && td -> ne [1 ]== H && td -> ne [2 ]== n_tokens ); 5896GGML_ASSERT (ggml_nelements (state )== S * S * H * n_seqs ); 5897 } 5898 5899// concat output and new_state 5900const int64_t ne [4 ]= {S * H ,n_tokens + S * n_seqs ,1 ,1 }; 5901struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,4 ,ne ); 5902 5903result -> op = GGML_OP_RWKV_WKV6 ; 5904result -> src [0 ]= k ; 5905result -> src [1 ]= v ; 5906result -> src [2 ]= r ; 5907result -> src [3 ]= tf ; 5908result -> src [4 ]= td ; 5909result -> src [5 ]= state ; 5910 5911return result ; 5912} 5913 5914// ggml_gated_linear_attn 5915 5916struct ggml_tensor * ggml_gated_linear_attn ( 5917struct ggml_context * ctx , 5918struct ggml_tensor * k , 5919struct ggml_tensor * v , 5920struct ggml_tensor * q , 5921struct ggml_tensor * g , 5922struct ggml_tensor * state , 5923float scale ) { 5924GGML_ASSERT (ggml_is_contiguous (k )); 5925GGML_ASSERT (ggml_is_contiguous (v )); 5926GGML_ASSERT (ggml_is_contiguous (q )); 5927GGML_ASSERT (ggml_is_contiguous (g )); 5928GGML_ASSERT (ggml_is_contiguous (state )); 5929 5930const int64_t S = k -> ne [0 ]; 5931const int64_t H = k -> ne [1 ]; 5932const int64_t n_tokens = k -> ne [2 ]; 5933const int64_t n_seqs = state -> ne [1 ]; 5934 { 5935GGML_ASSERT (v -> ne [0 ]== S && v -> ne [1 ]== H && v -> ne [2 ]== n_tokens ); 5936GGML_ASSERT (q -> ne [0 ]== S && q -> ne [1 ]== H && q -> ne [2 ]== n_tokens ); 5937GGML_ASSERT (g -> ne [0 ]== S && g -> ne [1 ]== H && g -> ne [2 ]== n_tokens ); 5938GGML_ASSERT (ggml_nelements (state )== S * S * H * n_seqs ); 5939 } 5940 5941// concat output and new_state 5942const int64_t ne [4 ]= {S * H ,n_tokens + S * n_seqs ,1 ,1 }; 5943struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,4 ,ne ); 5944 5945ggml_set_op_params_f32 (result ,0 ,scale ); 5946 5947result -> op = GGML_OP_GATED_LINEAR_ATTN ; 5948result -> src [0 ]= k ; 5949result -> src [1 ]= v ; 5950result -> src [2 ]= q ; 5951result -> src [3 ]= g ; 5952result -> src [4 ]= state ; 5953 5954return result ; 5955} 5956 5957// ggml_rwkv_wkv7 5958 5959struct ggml_tensor * ggml_rwkv_wkv7 ( 5960struct ggml_context * ctx , 5961struct ggml_tensor * r , 5962struct ggml_tensor * w , 5963struct ggml_tensor * k , 5964struct ggml_tensor * v , 5965struct ggml_tensor * a , 5966struct ggml_tensor * b , 5967struct ggml_tensor * state ) { 5968GGML_ASSERT (ggml_is_contiguous (r )); 5969GGML_ASSERT (ggml_is_contiguous (w )); 5970GGML_ASSERT (ggml_is_contiguous (k )); 5971GGML_ASSERT (ggml_is_contiguous (v )); 5972GGML_ASSERT (ggml_is_contiguous (a )); 5973GGML_ASSERT (ggml_is_contiguous (b )); 5974GGML_ASSERT (ggml_is_contiguous (state )); 5975 5976const int64_t S = k -> ne [0 ]; 5977const int64_t H = k -> ne [1 ]; 5978const int64_t n_tokens = k -> ne [2 ]; 5979const int64_t n_seqs = state -> ne [1 ]; 5980 { 5981GGML_ASSERT (w -> ne [0 ]== S && w -> ne [1 ]== H && w -> ne [2 ]== n_tokens ); 5982GGML_ASSERT (k -> ne [0 ]== S && k -> ne [1 ]== H && k -> ne [2 ]== n_tokens ); 5983GGML_ASSERT (v -> ne [0 ]== S && v -> ne [1 ]== H && v -> ne [2 ]== n_tokens ); 5984GGML_ASSERT (a -> ne [0 ]== S && a -> ne [1 ]== H && a -> ne [2 ]== n_tokens ); 5985GGML_ASSERT (b -> ne [0 ]== S && b -> ne [1 ]== H && b -> ne [2 ]== n_tokens ); 5986GGML_ASSERT (ggml_nelements (state )== S * S * H * n_seqs ); 5987 } 5988 5989// concat output and new_state 5990const int64_t ne [4 ]= {S * H ,n_tokens + S * n_seqs ,1 ,1 }; 5991struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,4 ,ne ); 5992 5993result -> op = GGML_OP_RWKV_WKV7 ; 5994result -> src [0 ]= r ; 5995result -> src [1 ]= w ; 5996result -> src [2 ]= k ; 5997result -> src [3 ]= v ; 5998result -> src [4 ]= a ; 5999result -> src [5 ]= b ; 6000result -> src [6 ]= state ; 6001 6002return result ; 6003} 6004 6005// ggml_unary 6006 6007static struct ggml_tensor * ggml_unary_impl ( 6008struct ggml_context * ctx , 6009struct ggml_tensor * a , 6010enum ggml_unary_op op , 6011bool inplace ) { 6012GGML_ASSERT (ggml_is_contiguous_rows (a )); 6013 6014struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 6015 6016ggml_set_op_params_i32 (result ,0 , (int32_t )op ); 6017 6018result -> op = GGML_OP_UNARY ; 6019result -> src [0 ]= a ; 6020 6021return result ; 6022} 6023 6024struct ggml_tensor * ggml_unary ( 6025struct ggml_context * ctx , 6026struct ggml_tensor * a , 6027enum ggml_unary_op op ) { 6028return ggml_unary_impl (ctx ,a ,op , false); 6029} 6030 6031struct ggml_tensor * ggml_unary_inplace ( 6032struct ggml_context * ctx , 6033struct ggml_tensor * a , 6034enum ggml_unary_op op ) { 6035return ggml_unary_impl (ctx ,a ,op , true); 6036} 6037 6038// ggml_map_custom1 6039 6040static struct ggml_tensor * ggml_map_custom1_impl ( 6041struct ggml_context * ctx , 6042struct ggml_tensor * a , 6043const ggml_custom1_op_t fun , 6044int n_tasks , 6045void * userdata , 6046bool inplace ) { 6047GGML_ASSERT (n_tasks == GGML_N_TASKS_MAX || n_tasks > 0 ); 6048 6049struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 6050 6051struct ggml_map_custom1_op_params params = { 6052/*.fun =*/ fun , 6053/*.n_tasks =*/ n_tasks , 6054/*.userdata =*/ userdata 6055 }; 6056ggml_set_op_params (result ,& params ,sizeof (params )); 6057 6058result -> op = GGML_OP_MAP_CUSTOM1 ; 6059result -> src [0 ]= a ; 6060 6061return result ; 6062} 6063 6064struct ggml_tensor * ggml_map_custom1 ( 6065struct ggml_context * ctx , 6066struct ggml_tensor * a , 6067const ggml_custom1_op_t fun , 6068int n_tasks , 6069void * userdata ) { 6070return ggml_map_custom1_impl (ctx ,a ,fun ,n_tasks ,userdata , false); 6071} 6072 6073struct ggml_tensor * ggml_map_custom1_inplace ( 6074struct ggml_context * ctx , 6075struct ggml_tensor * a , 6076const ggml_custom1_op_t fun , 6077int n_tasks , 6078void * userdata ) { 6079return ggml_map_custom1_impl (ctx ,a ,fun ,n_tasks ,userdata , true); 6080} 6081 6082// ggml_map_custom2 6083 6084static struct ggml_tensor * ggml_map_custom2_impl ( 6085struct ggml_context * ctx , 6086struct ggml_tensor * a , 6087struct ggml_tensor * b , 6088const ggml_custom2_op_t fun , 6089int n_tasks , 6090void * userdata , 6091bool inplace ) { 6092GGML_ASSERT (n_tasks == GGML_N_TASKS_MAX || n_tasks > 0 ); 6093 6094struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 6095 6096struct ggml_map_custom2_op_params params = { 6097/*.fun =*/ fun , 6098/*.n_tasks =*/ n_tasks , 6099/*.userdata =*/ userdata 6100 }; 6101ggml_set_op_params (result ,& params ,sizeof (params )); 6102 6103result -> op = GGML_OP_MAP_CUSTOM2 ; 6104result -> src [0 ]= a ; 6105result -> src [1 ]= b ; 6106 6107return result ; 6108} 6109 6110struct ggml_tensor * ggml_map_custom2 ( 6111struct ggml_context * ctx , 6112struct ggml_tensor * a , 6113struct ggml_tensor * b , 6114const ggml_custom2_op_t fun , 6115int n_tasks , 6116void * userdata ) { 6117return ggml_map_custom2_impl (ctx ,a ,b ,fun ,n_tasks ,userdata , false); 6118} 6119 6120struct ggml_tensor * ggml_map_custom2_inplace ( 6121struct ggml_context * ctx , 6122struct ggml_tensor * a , 6123struct ggml_tensor * b , 6124const ggml_custom2_op_t fun , 6125int n_tasks , 6126void * userdata ) { 6127return ggml_map_custom2_impl (ctx ,a ,b ,fun ,n_tasks ,userdata , true); 6128} 6129 6130// ggml_map_custom3 6131 6132static struct ggml_tensor * ggml_map_custom3_impl ( 6133struct ggml_context * ctx , 6134struct ggml_tensor * a , 6135struct ggml_tensor * b , 6136struct ggml_tensor * c , 6137const ggml_custom3_op_t fun , 6138int n_tasks , 6139void * userdata , 6140bool inplace ) { 6141GGML_ASSERT (n_tasks == GGML_N_TASKS_MAX || n_tasks > 0 ); 6142 6143struct ggml_tensor * result = inplace ?ggml_view_tensor (ctx ,a ) :ggml_dup_tensor (ctx ,a ); 6144 6145struct ggml_map_custom3_op_params params = { 6146/*.fun =*/ fun , 6147/*.n_tasks =*/ n_tasks , 6148/*.userdata =*/ userdata 6149 }; 6150ggml_set_op_params (result ,& params ,sizeof (params )); 6151 6152result -> op = GGML_OP_MAP_CUSTOM3 ; 6153result -> src [0 ]= a ; 6154result -> src [1 ]= b ; 6155result -> src [2 ]= c ; 6156 6157return result ; 6158} 6159 6160struct ggml_tensor * ggml_map_custom3 ( 6161struct ggml_context * ctx , 6162struct ggml_tensor * a , 6163struct ggml_tensor * b , 6164struct ggml_tensor * c , 6165const ggml_custom3_op_t fun , 6166int n_tasks , 6167void * userdata ) { 6168return ggml_map_custom3_impl (ctx ,a ,b ,c ,fun ,n_tasks ,userdata , false); 6169} 6170 6171struct ggml_tensor * ggml_map_custom3_inplace ( 6172struct ggml_context * ctx , 6173struct ggml_tensor * a , 6174struct ggml_tensor * b , 6175struct ggml_tensor * c , 6176const ggml_custom3_op_t fun , 6177int n_tasks , 6178void * userdata ) { 6179return ggml_map_custom3_impl (ctx ,a ,b ,c ,fun ,n_tasks ,userdata , true); 6180} 6181 6182struct ggml_tensor * ggml_custom_4d ( 6183struct ggml_context * ctx , 6184enum ggml_type type , 6185int64_t ne0 , 6186int64_t ne1 , 6187int64_t ne2 , 6188int64_t ne3 , 6189struct ggml_tensor ** args , 6190int n_args , 6191ggml_custom_op_t fun , 6192int n_tasks , 6193void * userdata ) { 6194 6195GGML_ASSERT (n_args < GGML_MAX_SRC ); 6196 6197struct ggml_tensor * result = ggml_new_tensor_4d (ctx ,type ,ne0 ,ne1 ,ne2 ,ne3 ); 6198 6199struct ggml_custom_op_params params = { 6200/*.fun =*/ fun , 6201/*.n_tasks =*/ n_tasks , 6202/*.userdata =*/ userdata 6203 }; 6204ggml_set_op_params (result ,& params ,sizeof (params )); 6205 6206result -> op = GGML_OP_CUSTOM ; 6207for (int i = 0 ;i < n_args ;i ++ ) { 6208result -> src [i ]= args [i ]; 6209 } 6210 6211return result ; 6212} 6213 6214struct ggml_tensor * ggml_custom_inplace ( 6215struct ggml_context * ctx , 6216struct ggml_tensor * a , 6217struct ggml_tensor ** args , 6218int n_args , 6219ggml_custom_op_t fun , 6220int n_tasks , 6221void * userdata ) { 6222 6223GGML_ASSERT (n_args < GGML_MAX_SRC - 1 ); 6224 6225struct ggml_tensor * result = ggml_view_tensor (ctx ,a ); 6226 6227struct ggml_custom_op_params params = { 6228/*.fun =*/ fun , 6229/*.n_tasks =*/ n_tasks , 6230/*.userdata =*/ userdata 6231 }; 6232ggml_set_op_params (result ,& params ,sizeof (params )); 6233 6234result -> op = GGML_OP_CUSTOM ; 6235result -> src [0 ]= a ; 6236for (int i = 0 ;i < n_args ;i ++ ) { 6237result -> src [i + 1 ]= args [i ]; 6238 } 6239 6240return result ; 6241} 6242// ggml_cross_entropy_loss 6243 6244struct ggml_tensor * ggml_cross_entropy_loss ( 6245struct ggml_context * ctx , 6246struct ggml_tensor * a , 6247struct ggml_tensor * b ) { 6248GGML_ASSERT (ggml_are_same_shape (a ,b )); 6249 6250struct ggml_tensor * result = ggml_new_tensor_1d (ctx ,a -> type ,1 ); 6251 6252result -> op = GGML_OP_CROSS_ENTROPY_LOSS ; 6253result -> src [0 ]= a ; 6254result -> src [1 ]= b ; 6255 6256return result ; 6257} 6258 6259// ggml_cross_entropy_loss_back 6260 6261struct ggml_tensor * ggml_cross_entropy_loss_back ( 6262struct ggml_context * ctx , 6263struct ggml_tensor * a , 6264struct ggml_tensor * b , 6265struct ggml_tensor * c ) { 6266GGML_ASSERT (ggml_is_scalar (a )); 6267GGML_ASSERT (ggml_are_same_shape (b ,c )); 6268 6269struct ggml_tensor * result = ggml_dup_tensor (ctx ,b ); 6270 6271result -> op = GGML_OP_CROSS_ENTROPY_LOSS_BACK ; 6272result -> src [0 ]= a ; 6273result -> src [1 ]= b ; 6274result -> src [2 ]= c ; 6275 6276return result ; 6277} 6278 6279// opt_step_adamw 6280 6281struct ggml_tensor * ggml_opt_step_adamw ( 6282struct ggml_context * ctx , 6283struct ggml_tensor * a , 6284struct ggml_tensor * grad , 6285struct ggml_tensor * m , 6286struct ggml_tensor * v , 6287struct ggml_tensor * adamw_params ) { 6288GGML_ASSERT (a -> flags & GGML_TENSOR_FLAG_PARAM ); 6289GGML_ASSERT (ggml_are_same_shape (a ,grad )); 6290GGML_ASSERT (ggml_are_same_shape (a ,m )); 6291GGML_ASSERT (ggml_are_same_shape (a ,v )); 6292GGML_ASSERT (adamw_params -> type == GGML_TYPE_F32 ); 6293GGML_ASSERT (ggml_nelements (adamw_params )== 7 ); 6294 6295struct ggml_tensor * result = ggml_view_tensor (ctx ,a ); 6296 6297result -> op = GGML_OP_OPT_STEP_ADAMW ; 6298result -> src [0 ]= a ; 6299result -> src [1 ]= grad ; 6300result -> src [2 ]= m ; 6301result -> src [3 ]= v ; 6302result -> src [4 ]= adamw_params ; 6303 6304return result ; 6305} 6306 6307// opt_step_sgd 6308 6309struct ggml_tensor * ggml_opt_step_sgd ( 6310struct ggml_context * ctx , 6311struct ggml_tensor * a , 6312struct ggml_tensor * grad , 6313struct ggml_tensor * params ) { 6314GGML_ASSERT (a -> flags & GGML_TENSOR_FLAG_PARAM ); 6315GGML_ASSERT (ggml_are_same_shape (a ,grad )); 6316GGML_ASSERT (params -> type == GGML_TYPE_F32 ); 6317GGML_ASSERT (ggml_nelements (params )== 2 ); 6318 6319struct ggml_tensor * result = ggml_view_tensor (ctx ,a ); 6320 6321result -> op = GGML_OP_OPT_STEP_SGD ; 6322result -> src [0 ]= a ; 6323result -> src [1 ]= grad ; 6324result -> src [2 ]= params ; 6325 6326return result ; 6327} 6328 6329// solve_tri 6330 6331struct ggml_tensor * ggml_solve_tri ( 6332struct ggml_context * ctx , 6333struct ggml_tensor * a , 6334struct ggml_tensor * b , 6335bool left , 6336bool lower , 6337bool uni ) { 6338GGML_ASSERT (a -> type == GGML_TYPE_F32 ); 6339GGML_ASSERT (b -> type == GGML_TYPE_F32 ); 6340 6341// A must be square and lower diagonal 6342GGML_ASSERT (a -> ne [0 ]== a -> ne [1 ]); 6343// B must have same outer dimension as A 6344GGML_ASSERT (a -> ne [1 ]== b -> ne [1 ]); 6345 6346// batch dimensions must be equal 6347GGML_ASSERT (a -> ne [2 ]== b -> ne [2 ]); 6348GGML_ASSERT (a -> ne [3 ]== b -> ne [3 ]); 6349 6350GGML_ASSERT (ggml_is_contiguous (a )); 6351GGML_ASSERT (ggml_is_contiguous (b )); 6352 6353GGML_ASSERT (lower && left && !uni );// TODO: support other variants 6354 6355struct ggml_tensor * result = ggml_new_tensor_4d (ctx ,GGML_TYPE_F32 ,b -> ne [0 ],b -> ne [1 ],b -> ne [2 ],b -> ne [3 ]); 6356 6357result -> op = GGML_OP_SOLVE_TRI ; 6358result -> src [0 ]= a ; 6359result -> src [1 ]= b ; 6360 6361return result ; 6362} 6363 6364// ggml_gated_delta_net 6365 6366struct ggml_tensor * ggml_gated_delta_net ( 6367struct ggml_context * ctx , 6368struct ggml_tensor * q , 6369struct ggml_tensor * k , 6370struct ggml_tensor * v , 6371struct ggml_tensor * g , 6372struct ggml_tensor * beta , 6373struct ggml_tensor * state , 6374int64_t K ) { 6375GGML_ASSERT (ggml_is_contiguous_rows (q )); 6376GGML_ASSERT (ggml_is_contiguous_rows (k )); 6377GGML_ASSERT (ggml_is_contiguous_rows (v )); 6378GGML_ASSERT (ggml_is_contiguous (g )); 6379GGML_ASSERT (ggml_is_contiguous (beta )); 6380GGML_ASSERT (ggml_is_contiguous (state )); 6381 6382GGML_ASSERT (q -> type == GGML_TYPE_F32 ); 6383GGML_ASSERT (k -> type == GGML_TYPE_F32 ); 6384GGML_ASSERT (v -> type == GGML_TYPE_F32 ); 6385GGML_ASSERT (g -> type == GGML_TYPE_F32 ); 6386GGML_ASSERT (beta -> type == GGML_TYPE_F32 ); 6387GGML_ASSERT (state -> type == GGML_TYPE_F32 ); 6388 6389const int64_t S_v = v -> ne [0 ]; 6390const int64_t H = v -> ne [1 ]; 6391const int64_t n_tokens = v -> ne [2 ]; 6392const int64_t n_seqs = v -> ne [3 ]; 6393 6394// gate: scalar [1, H, T, B] or vector [S_v, H, T, B] (KDA) 6395GGML_ASSERT (g -> ne [0 ]== 1 || g -> ne [0 ]== S_v ); 6396GGML_ASSERT (beta -> ne [0 ]== 1 ); 6397 6398// state holds the initial state s0 only: [S_v, S_v, H, n_seqs]. K (snapshot slot count) is an op param. 6399GGML_ASSERT (state -> ne [0 ]== S_v ); 6400GGML_ASSERT (state -> ne [1 ]== S_v ); 6401GGML_ASSERT (state -> ne [2 ]== H ); 6402GGML_ASSERT (state -> ne [3 ]== n_seqs ); 6403GGML_ASSERT (K >=1 ); 6404const int64_t state_rows = K * S_v * n_seqs ; 6405const int64_t ne [4 ]= {S_v * H ,n_tokens * n_seqs + state_rows ,1 ,1 }; 6406struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,4 ,ne ); 6407 6408ggml_set_op_params_i32 (result ,0 , (int32_t )K ); 6409 6410result -> op = GGML_OP_GATED_DELTA_NET ; 6411result -> src [0 ]= q ; 6412result -> src [1 ]= k ; 6413result -> src [2 ]= v ; 6414result -> src [3 ]= g ; 6415result -> src [4 ]= beta ; 6416result -> src [5 ]= state ; 6417 6418return result ; 6419} 6420 6421// ggml_lightning_indexer 6422 6423struct ggml_tensor * ggml_lightning_indexer ( 6424struct ggml_context * ctx , 6425struct ggml_tensor * q , 6426struct ggml_tensor * k , 6427struct ggml_tensor * weights , 6428struct ggml_tensor * mask ) { 6429 6430GGML_ASSERT (q -> type == GGML_TYPE_F32 ); 6431GGML_ASSERT (weights -> type == GGML_TYPE_F32 ); 6432GGML_ASSERT (mask -> type == GGML_TYPE_F16 ); 6433GGML_ASSERT (q -> ne [0 ]== k -> ne [0 ]); 6434GGML_ASSERT (mask -> ne [0 ]== k -> ne [2 ]); 6435GGML_ASSERT (q -> ne [1 ]== weights -> ne [0 ]); 6436GGML_ASSERT (k -> ne [1 ]== 1 ); 6437GGML_ASSERT (mask -> ne [1 ]== q -> ne [2 ]); 6438GGML_ASSERT (q -> ne [2 ]== weights -> ne [1 ]); 6439GGML_ASSERT (weights -> ne [2 ]== 1 ); 6440GGML_ASSERT (mask -> ne [2 ]== 1 ); 6441GGML_ASSERT (q -> ne [3 ]== k -> ne [3 ]); 6442GGML_ASSERT (k -> ne [3 ]== weights -> ne [3 ]); 6443GGML_ASSERT (weights -> ne [3 ] %mask -> ne [3 ]== 0 ); 6444 6445int64_t ne [4 ]= {k -> ne [2 ],q -> ne [2 ],1 ,q -> ne [3 ] }; 6446struct ggml_tensor * result = ggml_new_tensor (ctx ,GGML_TYPE_F32 ,4 ,ne ); 6447 6448result -> op = GGML_OP_LIGHTNING_INDEXER ; 6449result -> src [0 ]= q ; 6450result -> src [1 ]= k ; 6451result -> src [2 ]= weights ; 6452result -> src [3 ]= mask ; 6453 6454return result ; 6455} 6456 6457// ggml_dsv4_hc_comb 6458 6459struct ggml_tensor * ggml_dsv4_hc_comb ( 6460struct ggml_context * ctx , 6461struct ggml_tensor * mixes , 6462struct ggml_tensor * scale , 6463struct ggml_tensor * base , 6464float eps , 6465int32_t n_iter ) { 6466GGML_ASSERT (mixes -> type == GGML_TYPE_F32 ); 6467GGML_ASSERT (scale -> type == GGML_TYPE_F32 ); 6468GGML_ASSERT (base -> type == GGML_TYPE_F32 ); 6469GGML_ASSERT (n_iter > 0 ); 6470 6471const int64_t hc_mix_dim = mixes -> ne [0 ]; 6472const int64_t n_tokens = mixes -> ne [1 ]; 6473 6474int64_t hc = 0 ; 6475for (int64_t i = 1 ;i * i + 2 * i <=hc_mix_dim ;++ i ) { 6476if ((2 + i )* i == hc_mix_dim ) { 6477hc = i ; 6478break ; 6479 } 6480 } 6481 6482GGML_ASSERT (hc > 0 ); 6483GGML_ASSERT (hc == 4 ); 6484GGML_ASSERT (mixes -> ne [2 ]== 1 ); 6485GGML_ASSERT (mixes -> ne [3 ]== 1 ); 6486GGML_ASSERT (scale -> ne [0 ] >=3 ); 6487GGML_ASSERT (scale -> ne [1 ]== 1 ); 6488GGML_ASSERT (scale -> ne [2 ]== 1 ); 6489GGML_ASSERT (scale -> ne [3 ]== 1 ); 6490GGML_ASSERT (base -> ne [0 ]== hc_mix_dim ); 6491GGML_ASSERT (base -> ne [1 ]== 1 ); 6492GGML_ASSERT (base -> ne [2 ]== 1 ); 6493GGML_ASSERT (base -> ne [3 ]== 1 ); 6494 6495struct ggml_tensor * result = ggml_new_tensor_3d (ctx ,GGML_TYPE_F32 ,hc ,hc ,n_tokens ); 6496 6497ggml_set_op_params_f32 (result ,0 ,eps ); 6498ggml_set_op_params_i32 (result ,1 ,n_iter ); 6499 6500result -> op = GGML_OP_DSV4_HC_COMB ; 6501result -> src [0 ]= mixes ; 6502result -> src [1 ]= scale ; 6503result -> src [2 ]= base ; 6504 6505return result ; 6506} 6507 6508// ggml_dsv4_hc_pre 6509 6510struct ggml_tensor * ggml_dsv4_hc_pre ( 6511struct ggml_context * ctx , 6512struct ggml_tensor * x , 6513struct ggml_tensor * weights ) { 6514GGML_ASSERT (x -> type == GGML_TYPE_F32 ); 6515GGML_ASSERT (weights -> type == GGML_TYPE_F32 ); 6516 6517const int64_t n_embd = x -> ne [0 ]; 6518const int64_t hc = x -> ne [1 ]; 6519const int64_t n_tokens = x -> ne [2 ]; 6520 6521GGML_ASSERT (hc > 0 ); 6522GGML_ASSERT (x -> ne [3 ]== 1 ); 6523GGML_ASSERT (weights -> ne [0 ]== hc ); 6524GGML_ASSERT (weights -> ne [1 ]== n_tokens ); 6525GGML_ASSERT (weights -> ne [2 ]== 1 ); 6526GGML_ASSERT (weights -> ne [3 ]== 1 ); 6527 6528struct ggml_tensor * result = ggml_new_tensor_2d (ctx ,GGML_TYPE_F32 ,n_embd ,n_tokens ); 6529 6530result -> op = GGML_OP_DSV4_HC_PRE ; 6531result -> src [0 ]= x ; 6532result -> src [1 ]= weights ; 6533 6534return result ; 6535} 6536 6537// ggml_dsv4_hc_post 6538 6539struct ggml_tensor * ggml_dsv4_hc_post ( 6540struct ggml_context * ctx , 6541struct ggml_tensor * x , 6542struct ggml_tensor * residual , 6543struct ggml_tensor * post , 6544struct ggml_tensor * comb ) { 6545GGML_ASSERT (x -> type == GGML_TYPE_F32 ); 6546GGML_ASSERT (residual -> type == GGML_TYPE_F32 ); 6547GGML_ASSERT (post -> type == GGML_TYPE_F32 ); 6548GGML_ASSERT (comb -> type == GGML_TYPE_F32 ); 6549 6550const int64_t n_embd = x -> ne [0 ]; 6551const int64_t n_tokens = x -> ne [1 ]; 6552const int64_t hc = residual -> ne [1 ]; 6553 6554GGML_ASSERT (hc > 0 ); 6555GGML_ASSERT (x -> ne [2 ]== 1 ); 6556GGML_ASSERT (x -> ne [3 ]== 1 ); 6557 6558GGML_ASSERT (residual -> ne [0 ]== n_embd ); 6559GGML_ASSERT (residual -> ne [2 ]== n_tokens ); 6560GGML_ASSERT (residual -> ne [3 ]== 1 ); 6561 6562GGML_ASSERT (post -> ne [0 ]== hc ); 6563GGML_ASSERT (post -> ne [1 ]== n_tokens ); 6564GGML_ASSERT (post -> ne [2 ]== 1 ); 6565GGML_ASSERT (post -> ne [3 ]== 1 ); 6566 6567GGML_ASSERT (comb -> ne [0 ]== hc ); 6568GGML_ASSERT (comb -> ne [1 ]== hc ); 6569GGML_ASSERT (comb -> ne [2 ]== n_tokens ); 6570GGML_ASSERT (comb -> ne [3 ]== 1 ); 6571 6572struct ggml_tensor * result = ggml_new_tensor_3d (ctx ,GGML_TYPE_F32 ,n_embd ,hc ,n_tokens ); 6573 6574result -> op = GGML_OP_DSV4_HC_POST ; 6575result -> src [0 ]= x ; 6576result -> src [1 ]= residual ; 6577result -> src [2 ]= post ; 6578result -> src [3 ]= comb ; 6579 6580return result ; 6581} 6582 6583//////////////////////////////////////////////////////////////////////////////// 6584 6585struct ggml_hash_set ggml_hash_set_new (size_t size ) { 6586size = ggml_hash_size (size ); 6587struct ggml_hash_set result ; 6588result .size = size ; 6589result .keys = GGML_MALLOC (sizeof (struct ggml_tensor * )* size ); 6590result .used = GGML_CALLOC (ggml_bitset_size (size ),sizeof (ggml_bitset_t )); 6591return result ; 6592} 6593 6594void ggml_hash_set_reset (struct ggml_hash_set * hash_set ) { 6595memset (hash_set -> used ,0 ,sizeof (ggml_bitset_t )* ggml_bitset_size (hash_set -> size )); 6596} 6597 6598void ggml_hash_set_free (struct ggml_hash_set * hash_set ) { 6599GGML_FREE (hash_set -> used ); 6600GGML_FREE (hash_set -> keys ); 6601} 6602 6603size_t ggml_hash_size (size_t min_sz ) { 6604// next primes after powers of two 6605static const size_t primes []= { 66062 ,3 ,5 ,11 ,17 ,37 ,67 ,131 ,257 ,521 ,1031 , 66072053 ,4099 ,8209 ,16411 ,32771 ,65537 ,131101 , 6608262147 ,524309 ,1048583 ,2097169 ,4194319 ,8388617 , 660916777259 ,33554467 ,67108879 ,134217757 ,268435459 , 6610536870923 ,1073741827 ,2147483659 6611 }; 6612static const size_t n_primes = sizeof (primes )/sizeof (primes [0 ]); 6613 6614// find the smallest prime that is larger or equal than min_sz 6615size_t l = 0 ; 6616size_t r = n_primes ; 6617while (l < r ) { 6618size_t m = (l + r )/2 ; 6619if (primes [m ]< min_sz ) { 6620l = m + 1 ; 6621 }else { 6622r = m ; 6623 } 6624 } 6625size_t sz = l < n_primes ?primes [l ] :min_sz |1 ; 6626return sz ; 6627} 6628 6629struct hash_map { 6630struct ggml_hash_set set ; 6631struct ggml_tensor ** vals ; 6632}; 6633 6634static struct hash_map * ggml_new_hash_map (size_t size ) { 6635struct hash_map * result = GGML_MALLOC (sizeof (struct hash_map )); 6636result -> set = ggml_hash_set_new (size ); 6637result -> vals = GGML_CALLOC (result -> set .size ,sizeof (struct ggml_tensor * )); 6638return result ; 6639} 6640 6641static void ggml_hash_map_free (struct hash_map * map ) { 6642ggml_hash_set_free (& map -> set ); 6643GGML_FREE (map -> vals ); 6644GGML_FREE (map ); 6645} 6646 6647// utility functions to change gradients 6648// isrc is the index of tensor in cgraph->visited_has_set.keys 6649// the corresponding gradient (accumulators) are also at position isrc 6650// if tensor has a gradient accumulator, modify that accumulator in-place 6651// else if there is no gradient for tensor, set the corresponding value 6652// else, just add/subtract/etc. the gradients 6653 6654static void ggml_add_or_set ( 6655struct ggml_context * ctx , 6656struct ggml_cgraph * cgraph , 6657size_t isrc , 6658struct ggml_tensor * tensor ) { 6659struct ggml_tensor * src = cgraph -> visited_hash_set .keys [isrc ]; 6660GGML_ASSERT (src ); 6661if (cgraph -> grads [isrc ]) { 6662cgraph -> grads [isrc ]= ggml_add_impl (ctx ,cgraph -> grads [isrc ],tensor ,/*inplace =*/ cgraph -> grad_accs [isrc ]); 6663 }else { 6664cgraph -> grads [isrc ]= tensor ; 6665 } 6666ggml_format_name (cgraph -> grads [isrc ],"grad for %s" ,src -> name ); 6667ggml_build_forward_expand (cgraph ,cgraph -> grads [isrc ]); 6668} 6669 6670static void ggml_acc_or_set ( 6671struct ggml_context * ctx , 6672struct ggml_cgraph * cgraph , 6673size_t isrc , 6674struct ggml_tensor * tensor , 6675const size_t nb1 , 6676const size_t nb2 , 6677const size_t nb3 , 6678const size_t offset ) { 6679struct ggml_tensor * src = cgraph -> visited_hash_set .keys [isrc ]; 6680GGML_ASSERT (src ); 6681if (cgraph -> grads [isrc ]) { 6682cgraph -> grads [isrc ]= ggml_acc_impl (ctx ,cgraph -> grads [isrc ],tensor ,nb1 ,nb2 ,nb3 ,offset ,cgraph -> grad_accs [isrc ]); 6683 }else { 6684struct ggml_tensor * a_zero = ggml_scale (ctx ,src ,0.0f );// FIXME this is going to produce NaN if a contains inf/NaN 6685cgraph -> grads [isrc ]= ggml_acc_impl (ctx ,a_zero ,tensor ,nb1 ,nb2 ,nb3 ,offset , false); 6686 } 6687ggml_format_name (cgraph -> grads [isrc ],"grad for %s" ,cgraph -> visited_hash_set .keys [isrc ]-> name ); 6688ggml_build_forward_expand (cgraph ,cgraph -> grads [isrc ]); 6689} 6690 6691static void ggml_add1_or_set ( 6692struct ggml_context * ctx , 6693struct ggml_cgraph * cgraph , 6694size_t isrc , 6695struct ggml_tensor * tensor ) { 6696struct ggml_tensor * src = cgraph -> visited_hash_set .keys [isrc ]; 6697GGML_ASSERT (src ); 6698if (cgraph -> grads [isrc ]) { 6699cgraph -> grads [isrc ]= ggml_add1_impl (ctx ,cgraph -> grads [isrc ],tensor ,cgraph -> grad_accs [isrc ]); 6700 }else { 6701cgraph -> grads [isrc ]= ggml_repeat (ctx ,tensor ,src ); 6702 } 6703ggml_format_name (cgraph -> grads [isrc ],"grad for %s" ,src -> name ); 6704ggml_build_forward_expand (cgraph ,cgraph -> grads [isrc ]); 6705} 6706 6707static void ggml_sub_or_set ( 6708struct ggml_context * ctx , 6709struct ggml_cgraph * cgraph , 6710size_t isrc , 6711struct ggml_tensor * tensor ) { 6712struct ggml_tensor * src = cgraph -> visited_hash_set .keys [isrc ]; 6713GGML_ASSERT (src ); 6714if (cgraph -> grads [isrc ]) { 6715cgraph -> grads [isrc ]= ggml_sub_impl (ctx ,cgraph -> grads [isrc ],tensor ,cgraph -> grad_accs [isrc ]); 6716 }else { 6717cgraph -> grads [isrc ]= ggml_neg (ctx ,tensor ); 6718 } 6719ggml_format_name (cgraph -> grads [isrc ],"grad for %s" ,src -> name ); 6720ggml_build_forward_expand (cgraph ,cgraph -> grads [isrc ]); 6721} 6722 6723static void ggml_compute_backward ( 6724struct ggml_context * ctx ,struct ggml_cgraph * cgraph ,int i ,const bool * grads_needed ) { 6725struct ggml_tensor * tensor = cgraph -> nodes [i ]; 6726struct ggml_tensor * grad = ggml_graph_get_grad (cgraph ,tensor ); 6727 6728if (!grad ) { 6729return ; 6730 } 6731 6732struct ggml_tensor * src0 = tensor -> src [0 ]; 6733struct ggml_tensor * src1 = tensor -> src [1 ]; 6734struct ggml_tensor * src2 = tensor -> src [2 ]; 6735struct ggml_hash_set * hash_set = & cgraph -> visited_hash_set ; 6736const size_t isrc0 = src0 ?ggml_hash_find (hash_set ,src0 ) : (size_t )-1 ; 6737const size_t isrc1 = src1 ?ggml_hash_find (hash_set ,src1 ) : (size_t )-1 ; 6738const size_t isrc2 = src2 ?ggml_hash_find (hash_set ,src2 ) : (size_t )-1 ; 6739const bool src0_needs_grads = src0 && isrc0 != GGML_HASHSET_FULL && ggml_bitset_get (hash_set -> used ,isrc0 )&& grads_needed [isrc0 ]; 6740const bool src1_needs_grads = src1 && isrc1 != GGML_HASHSET_FULL && ggml_bitset_get (hash_set -> used ,isrc1 )&& grads_needed [isrc1 ]; 6741const bool src2_needs_grads = src2 && isrc2 != GGML_HASHSET_FULL && ggml_bitset_get (hash_set -> used ,isrc2 )&& grads_needed [isrc2 ]; 6742 6743switch (tensor -> op ) { 6744case GGML_OP_DUP : { 6745if (src0_needs_grads ) { 6746ggml_add_or_set (ctx ,cgraph ,isrc0 ,grad ); 6747 } 6748 }break ; 6749case GGML_OP_ADD : { 6750if (src0_needs_grads ) { 6751ggml_add_or_set (ctx ,cgraph ,isrc0 ,grad ); 6752 } 6753if (src1_needs_grads ) { 6754struct ggml_tensor * tmp = grad ; 6755if (!ggml_are_same_shape (src0 ,src1 )) { 6756tmp = ggml_repeat_back (ctx ,tmp ,src1 ); 6757 } 6758ggml_add_or_set (ctx ,cgraph ,isrc1 ,tmp ); 6759 } 6760 }break ; 6761case GGML_OP_ADD1 : { 6762if (src0_needs_grads ) { 6763ggml_add_or_set (ctx ,cgraph ,isrc0 ,grad ); 6764 } 6765if (src1_needs_grads ) { 6766ggml_add_or_set (ctx ,cgraph ,isrc1 ,ggml_mean (ctx ,grad ));// TODO: should probably be sum instead of mean 6767 } 6768 }break ; 6769case GGML_OP_ACC : { 6770if (src0_needs_grads ) { 6771ggml_add_or_set (ctx ,cgraph ,isrc0 ,grad ); 6772 } 6773if (src1_needs_grads ) { 6774const size_t nb1 = ((int32_t * )tensor -> op_params )[0 ]; 6775const size_t nb2 = ((int32_t * )tensor -> op_params )[1 ]; 6776const size_t nb3 = ((int32_t * )tensor -> op_params )[2 ]; 6777const size_t offset = ((int32_t * )tensor -> op_params )[3 ]; 6778 6779struct ggml_tensor * tensor_grad_view = ggml_view_4d (ctx , 6780grad ,src1 -> ne [0 ],src1 -> ne [1 ],src1 -> ne [2 ],src1 -> ne [3 ], 6781nb1 ,nb2 ,nb3 ,offset ); 6782 6783ggml_add_or_set (ctx ,cgraph ,isrc1 ,ggml_reshape (ctx ,ggml_cont (ctx ,tensor_grad_view ),src1 )); 6784 } 6785 }break ; 6786case GGML_OP_SUB : { 6787if (src0_needs_grads ) { 6788ggml_add_or_set (ctx ,cgraph ,isrc0 ,grad ); 6789 } 6790if (src1_needs_grads ) { 6791ggml_sub_or_set (ctx ,cgraph ,isrc1 ,grad ); 6792 } 6793 }break ; 6794case GGML_OP_MUL : { 6795if (src0_needs_grads ) { 6796ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_mul (ctx ,grad ,src1 )); 6797 } 6798if (src1_needs_grads ) { 6799struct ggml_tensor * tmp = ggml_mul (ctx ,src0 ,grad ); 6800if (!ggml_are_same_shape (src0 ,src1 )) { 6801tmp = ggml_repeat_back (ctx ,tmp ,src1 ); 6802 } 6803ggml_add_or_set (ctx ,cgraph ,isrc1 ,tmp ); 6804 } 6805 }break ; 6806case GGML_OP_DIV : { 6807if (src0_needs_grads ) { 6808ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_div (ctx ,grad ,src1 )); 6809 } 6810if (src1_needs_grads ) { 6811ggml_sub_or_set (ctx ,cgraph ,isrc1 ,ggml_mul (ctx ,grad ,ggml_div (ctx ,tensor ,src1 ))); 6812 } 6813 }break ; 6814case GGML_OP_SQR : { 6815if (src0_needs_grads ) { 6816ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_scale (ctx ,ggml_mul (ctx ,src0 ,grad ),2.0f )); 6817 } 6818 }break ; 6819case GGML_OP_SQRT : { 6820if (src0_needs_grads ) { 6821ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_scale (ctx ,ggml_div (ctx ,grad ,tensor ),0.5f )); 6822 } 6823 }break ; 6824case GGML_OP_LOG : { 6825if (src0_needs_grads ) { 6826ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_div (ctx ,grad ,src0 )); 6827 } 6828 }break ; 6829case GGML_OP_SIN : { 6830if (src0_needs_grads ) { 6831ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_mul (ctx ,grad ,ggml_cos (ctx ,src0 ))); 6832 } 6833 }break ; 6834case GGML_OP_COS : { 6835if (src0_needs_grads ) { 6836ggml_sub_or_set (ctx ,cgraph ,isrc0 ,ggml_mul (ctx ,grad ,ggml_sin (ctx ,src0 ))); 6837 } 6838 }break ; 6839case GGML_OP_SUM : { 6840if (src0_needs_grads ) { 6841ggml_add1_or_set (ctx ,cgraph ,isrc0 ,grad ); 6842 } 6843 }break ; 6844case GGML_OP_SUM_ROWS : { 6845if (src0_needs_grads ) { 6846ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_repeat (ctx ,grad ,src0 )); 6847 } 6848 }break ; 6849case GGML_OP_MEAN : { 6850if (src0_needs_grads ) { 6851ggml_add1_or_set (ctx ,cgraph ,isrc0 ,ggml_scale_impl (ctx ,grad ,1.0f /src0 -> ne [0 ],0.0 , false)); 6852 } 6853 }break ; 6854case GGML_OP_REPEAT : { 6855if (src0_needs_grads ) { 6856ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_repeat_back (ctx ,grad ,src0 )); 6857 } 6858 }break ; 6859case GGML_OP_REPEAT_BACK : { 6860if (src0_needs_grads ) { 6861ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_repeat (ctx ,grad ,src0 )); 6862 } 6863 }break ; 6864case GGML_OP_RMS_NORM : { 6865if (src0_needs_grads ) { 6866float eps ; 6867memcpy (& eps ,tensor -> op_params ,sizeof (float )); 6868ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_rms_norm_back (ctx ,grad ,src0 ,eps )); 6869 } 6870 }break ; 6871case GGML_OP_MUL_MAT : { 6872// https://cs231n.github.io/optimization-2/#staged 6873// # forward pass 6874// s0 = np.random.randn(5, 10) 6875// s1 = np.random.randn(10, 3) 6876// t = s0.dot(s1) 6877 6878// # now suppose we had the gradient on t from above in the circuit 6879// dt = np.random.randn(*t.shape) # same shape as t 6880// ds0 = dt.dot(s1.T) #.T gives the transpose of the matrix 6881// ds1 = t.T.dot(dt) 6882 6883// tensor.shape [m,p,qq,rr] 6884// src0.shape [n,m,q1,r1] 6885// src1.shape [n,p,qq,rr] 6886 6887if (src0_needs_grads ) { 6888GGML_ASSERT (grad -> ne [2 ]== src1 -> ne [2 ]); 6889GGML_ASSERT (grad -> ne [3 ]== src1 -> ne [3 ]); 6890struct ggml_tensor * tmp = 6891ggml_out_prod (ctx ,// [n,m,qq,rr] 6892src1 ,// [n,p,qq,rr] 6893grad );// [m,p,qq,rr] 6894if (!ggml_are_same_shape (tmp ,src0 )) { 6895GGML_ASSERT (tmp -> ne [0 ]== src0 -> ne [0 ]); 6896GGML_ASSERT (tmp -> ne [1 ]== src0 -> ne [1 ]); 6897GGML_ASSERT (tmp -> ne [3 ]== 1 ); 6898 6899const int64_t nr2 = tmp -> ne [2 ] /src0 -> ne [2 ]; 6900const size_t nb2 = tmp -> nb [2 ]* nr2 ; 6901const size_t nb3 = tmp -> nb [2 ]; 6902 6903tmp = ggml_view_4d (ctx ,tmp ,src0 -> ne [0 ],src0 -> ne [1 ],src0 -> ne [2 ],nr2 ,tmp -> nb [1 ],nb2 ,nb3 ,0 ); 6904tmp = ggml_repeat_back (ctx ,tmp ,src0 ); 6905 } 6906ggml_add_or_set (ctx ,cgraph ,isrc0 ,tmp ); 6907 } 6908if (src1_needs_grads ) { 6909ggml_add_or_set (ctx ,cgraph ,isrc1 , 6910// ggml_mul_mat(ctx, // [n,p,qq,rr] 6911// ggml_cont(ctx, // [m,n,q1,r1] 6912// ggml_transpose(ctx, src0)), // [m,n,q1,r1] 6913// grad), // [m,p,qq,rr] 6914 6915// when src0 is bigger than tensor->grad (this is mostly the case in llama), 6916// avoid transpose of src0, rather transpose smaller tensor->grad 6917// and then use ggml_out_prod 6918ggml_out_prod (ctx ,// [n,p,qq,rr] 6919src0 ,// [n,m,q1,r1] 6920ggml_transpose (ctx ,// [p,m,qq,rr] 6921grad )));// [m,p,qq,rr] 6922 } 6923 }break ; 6924case GGML_OP_SCALE : { 6925if (src0_needs_grads ) { 6926float s ; 6927memcpy (& s ,tensor -> op_params ,sizeof (float )); 6928ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_scale_impl (ctx ,grad ,s ,0.0 , false)); 6929 } 6930 }break ; 6931case GGML_OP_SET : { 6932const size_t nb1 = ((const int32_t * )tensor -> op_params )[0 ]; 6933const size_t nb2 = ((const int32_t * )tensor -> op_params )[1 ]; 6934const size_t nb3 = ((const int32_t * )tensor -> op_params )[2 ]; 6935const size_t offset = ((const int32_t * )tensor -> op_params )[3 ]; 6936 6937struct ggml_tensor * tensor_grad_view = NULL ; 6938 6939if (src0_needs_grads || src1_needs_grads ) { 6940GGML_ASSERT (src0 -> type == tensor -> type ); 6941GGML_ASSERT (!cgraph -> grads [isrc0 ]|| cgraph -> grads [isrc0 ]-> type == grad -> type ); 6942GGML_ASSERT (!cgraph -> grads [isrc1 ]|| !src1_needs_grads || cgraph -> grads [isrc1 ]-> type == grad -> type ); 6943 6944tensor_grad_view = ggml_view_4d (ctx , 6945grad ,src1 -> ne [0 ],src1 -> ne [1 ],src1 -> ne [2 ],src1 -> ne [3 ], 6946nb1 ,nb2 ,nb3 ,offset ); 6947 } 6948 6949if (src0_needs_grads ) { 6950struct ggml_tensor * tmp = ggml_neg (ctx ,tensor_grad_view ); 6951ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_acc_impl (ctx ,grad ,tmp ,nb1 ,nb2 ,nb3 ,offset , false)); 6952 } 6953 6954if (src1_needs_grads ) { 6955ggml_add_or_set (ctx ,cgraph ,isrc1 ,ggml_reshape (ctx ,ggml_cont (ctx ,tensor_grad_view ),src1 )); 6956 } 6957 }break ; 6958case GGML_OP_CPY : { 6959// cpy overwrites value of src1 by src0 and returns view(src1) 6960// the overwriting is mathematically equivalent to: 6961// tensor = src0 * 1 + src1 * 0 6962if (src0_needs_grads ) { 6963// dsrc0 = dtensor * 1 6964ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_reshape (ctx ,grad ,src0 )); 6965 } 6966if (src1_needs_grads ) { 6967// dsrc1 = dtensor * 0 -> noop 6968 } 6969 }break ; 6970case GGML_OP_CONT : { 6971// same as cpy 6972if (src0_needs_grads ) { 6973GGML_ASSERT (!cgraph -> grads [isrc0 ]|| ggml_is_contiguous (cgraph -> grads [isrc0 ])); 6974GGML_ASSERT (ggml_is_contiguous (grad )); 6975GGML_ASSERT (ggml_nelements (tensor )== ggml_nelements (src0 )); 6976ggml_add_or_set (ctx ,cgraph ,isrc0 , 6977ggml_are_same_shape (tensor ,src0 ) ?grad :ggml_reshape (ctx ,grad ,src0 )); 6978 } 6979 }break ; 6980case GGML_OP_RESHAPE : { 6981if (src0_needs_grads ) { 6982struct ggml_tensor * grad_cont = ggml_is_contiguous (grad ) ?grad :ggml_cont (ctx ,grad ); 6983ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_reshape (ctx ,grad_cont ,src0 )); 6984 } 6985 }break ; 6986case GGML_OP_VIEW : { 6987if (src0_needs_grads ) { 6988size_t offset ; 6989 6990memcpy (& offset ,tensor -> op_params ,sizeof (offset )); 6991 6992size_t nb1 = tensor -> nb [1 ]; 6993size_t nb2 = tensor -> nb [2 ]; 6994size_t nb3 = tensor -> nb [3 ]; 6995 6996if (cgraph -> grads [isrc0 ]&& src0 -> type != cgraph -> grads [isrc0 ]-> type ) { 6997// gradient is typically F32, but src0 could be other type 6998size_t ng = ggml_element_size (cgraph -> grads [isrc0 ]); 6999size_t n0 = ggml_element_size (src0 ); 7000GGML_ASSERT (offset %n0 == 0 ); 7001GGML_ASSERT (nb1 %n0 == 0 ); 7002GGML_ASSERT (nb2 %n0 == 0 ); 7003GGML_ASSERT (nb3 %n0 == 0 ); 7004offset = (offset /n0 )* ng ; 7005nb1 = (nb1 /n0 )* ng ; 7006nb2 = (nb2 /n0 )* ng ; 7007nb3 = (nb3 /n0 )* ng ; 7008 } 7009 7010ggml_acc_or_set (ctx ,cgraph ,isrc0 ,grad ,nb1 ,nb2 ,nb3 ,offset ); 7011 } 7012 }break ; 7013case GGML_OP_PERMUTE : { 7014if (src0_needs_grads ) { 7015const int32_t * axes = (const int32_t * )tensor -> op_params ; 7016const int axis0 = axes [0 ]& 0x3 ; 7017const int axis1 = axes [1 ]& 0x3 ; 7018const int axis2 = axes [2 ]& 0x3 ; 7019const int axis3 = axes [3 ]& 0x3 ; 7020int axb [4 ]= {0 ,0 ,0 ,0 };// axes backward 7021axb [axis0 ]= 0 ; 7022axb [axis1 ]= 1 ; 7023axb [axis2 ]= 2 ; 7024axb [axis3 ]= 3 ; 7025ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_permute (ctx ,grad ,axb [0 ],axb [1 ],axb [2 ],axb [3 ])); 7026 } 7027 }break ; 7028case GGML_OP_TRANSPOSE : { 7029if (src0_needs_grads ) { 7030ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_transpose (ctx ,grad )); 7031 } 7032 }break ; 7033case GGML_OP_GET_ROWS : { 7034if (src0_needs_grads ) { 7035ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_get_rows_back (ctx ,grad ,src1 ,src0 )); 7036 } 7037if (src1_needs_grads ) { 7038// noop 7039 } 7040 }break ; 7041case GGML_OP_DIAG_MASK_INF : { 7042if (src0_needs_grads ) { 7043/* ggml_diag_mask_inf_impl() shouldn't be here */ 7044/* ref: https://github.com/ggml-org/llama.cpp/pull/4203#discussion_r1412377992 */ 7045const int n_past = ((const int32_t * )tensor -> op_params )[0 ]; 7046ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_diag_mask_zero_impl (ctx ,grad ,n_past , false)); 7047 } 7048 }break ; 7049case GGML_OP_DIAG_MASK_ZERO : { 7050if (src0_needs_grads ) { 7051const int n_past = ((const int32_t * )tensor -> op_params )[0 ]; 7052ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_diag_mask_zero_impl (ctx ,grad ,n_past , false)); 7053 } 7054 }break ; 7055case GGML_OP_SOFT_MAX : { 7056if (src0_needs_grads ) { 7057float scale = 1.0f ; 7058float max_bias = 0.0f ; 7059 7060memcpy (& scale , (const float * )tensor -> op_params + 0 ,sizeof (float )); 7061memcpy (& max_bias , (const float * )tensor -> op_params + 1 ,sizeof (float )); 7062 7063ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_soft_max_ext_back (ctx ,grad ,tensor ,scale ,max_bias )); 7064 } 7065GGML_ASSERT ((!src1 || !src1_needs_grads )&& "backward pass for softmax mask not implemented" ); 7066 }break ; 7067case GGML_OP_ROPE : { 7068if (src0_needs_grads ) { 7069//const int n_past = ((int32_t *) tensor->op_params)[0]; 7070const int n_dims = ((const int32_t * )tensor -> op_params )[1 ]; 7071const int mode = ((const int32_t * )tensor -> op_params )[2 ]; 7072//const int n_ctx = ((int32_t *) tensor->op_params)[3]; 7073const int n_ctx_orig = ((const int32_t * )tensor -> op_params )[4 ]; 7074float freq_base ,freq_scale ,ext_factor ,attn_factor ,beta_fast ,beta_slow ; 7075int sections [4 ]= {0 ,0 ,0 ,0 }; 7076 7077memcpy (& freq_base , (const float * )tensor -> op_params + 5 ,sizeof (float )); 7078memcpy (& freq_scale , (const float * )tensor -> op_params + 6 ,sizeof (float )); 7079memcpy (& ext_factor , (const float * )tensor -> op_params + 7 ,sizeof (float )); 7080memcpy (& attn_factor , (const float * )tensor -> op_params + 8 ,sizeof (float )); 7081memcpy (& beta_fast , (const float * )tensor -> op_params + 9 ,sizeof (float )); 7082memcpy (& beta_slow , (const float * )tensor -> op_params + 10 ,sizeof (float )); 7083memcpy (& sections ,tensor -> op_params + 11 ,sizeof (sections )); 7084 7085struct ggml_tensor * rope_back = grad -> ne [2 ]== src1 -> ne [0 ] ? 7086ggml_rope_ext_back (ctx ,grad ,src1 ,src2 ,n_dims , 7087mode ,n_ctx_orig ,freq_base ,freq_scale ,ext_factor ,attn_factor ,beta_fast ,beta_slow ) : 7088ggml_rope_multi_back (ctx ,grad ,src1 ,src2 ,n_dims ,sections , 7089mode ,n_ctx_orig ,freq_base ,freq_scale ,ext_factor ,attn_factor ,beta_fast ,beta_slow ); 7090ggml_add_or_set (ctx ,cgraph ,isrc0 ,rope_back ); 7091 } 7092GGML_ASSERT ((!src2 || !src2_needs_grads )&& "gradients for freq factors not implemented" ); 7093 }break ; 7094case GGML_OP_IM2COL : { 7095if (src1_needs_grads ) { 7096const int32_t s0 = ggml_get_op_params_i32 (tensor ,0 ); 7097const int32_t s1 = ggml_get_op_params_i32 (tensor ,1 ); 7098const int32_t p0 = ggml_get_op_params_i32 (tensor ,2 ); 7099const int32_t p1 = ggml_get_op_params_i32 (tensor ,3 ); 7100const int32_t d0 = ggml_get_op_params_i32 (tensor ,4 ); 7101const int32_t d1 = ggml_get_op_params_i32 (tensor ,5 ); 7102const bool is_2D = ggml_get_op_params_i32 (tensor ,6 )== 1 ; 7103 7104ggml_add_or_set (ctx ,cgraph ,isrc1 ,ggml_im2col_back (ctx ,grad ,src0 ,src1 -> ne ,s0 ,s1 ,p0 ,p1 ,d0 ,d1 ,is_2D )); 7105 } 7106 }break ; 7107case GGML_OP_POOL_2D : { 7108if (src0_needs_grads ) { 7109const enum ggml_op_pool op = ggml_get_op_params_i32 (tensor ,0 ); 7110const int32_t k0 = ggml_get_op_params_i32 (tensor ,1 ); 7111const int32_t k1 = ggml_get_op_params_i32 (tensor ,2 ); 7112const int32_t s0 = ggml_get_op_params_i32 (tensor ,3 ); 7113const int32_t s1 = ggml_get_op_params_i32 (tensor ,4 ); 7114const int32_t p0 = ggml_get_op_params_i32 (tensor ,5 ); 7115const int32_t p1 = ggml_get_op_params_i32 (tensor ,6 ); 7116 7117ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_pool_2d_back (ctx ,grad ,src0 ,op ,k0 ,k1 ,s0 ,s1 ,p0 ,p1 )); 7118 } 7119 }break ; 7120case GGML_OP_WIN_PART : 7121case GGML_OP_WIN_UNPART : 7122case GGML_OP_UNARY : { 7123switch (ggml_get_unary_op (tensor )) { 7124case GGML_UNARY_OP_ABS : { 7125if (src0_needs_grads ) { 7126ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_mul (ctx ,ggml_sgn (ctx ,src0 ),grad )); 7127 } 7128 }break ; 7129case GGML_UNARY_OP_SGN : { 7130// noop 7131 }break ; 7132case GGML_UNARY_OP_NEG : { 7133if (src0_needs_grads ) { 7134ggml_sub_or_set (ctx ,cgraph ,isrc0 ,grad ); 7135 } 7136 }break ; 7137case GGML_UNARY_OP_STEP : { 7138// noop 7139 }break ; 7140case GGML_UNARY_OP_RELU : { 7141if (src0_needs_grads ) { 7142ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_mul (ctx ,ggml_step (ctx ,src0 ),grad )); 7143 } 7144 }break ; 7145case GGML_UNARY_OP_SILU : { 7146if (src0_needs_grads ) { 7147ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_silu_back (ctx ,grad ,src0 )); 7148 } 7149 }break ; 7150case GGML_UNARY_OP_EXP : { 7151if (src0_needs_grads ) { 7152ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_mul (ctx ,tensor ,grad )); 7153 } 7154 }break ; 7155case GGML_UNARY_OP_EXPM1 : { 7156if (src0_needs_grads ) { 7157ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_mul (ctx ,grad ,ggml_exp (ctx ,src0 ))); 7158 } 7159 }break ; 7160case GGML_UNARY_OP_SOFTPLUS : { 7161if (src0_needs_grads ) { 7162ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_mul (ctx ,grad ,ggml_sigmoid (ctx ,src0 ))); 7163 } 7164 }break ; 7165default : { 7166fprintf (stderr ,"%s: unsupported unary op for backward pass: %s\n" , 7167__func__ ,ggml_unary_op_name (ggml_get_unary_op (tensor ))); 7168GGML_ABORT ("fatal error" ); 7169 }//break; 7170 } 7171 }break ; 7172case GGML_OP_CROSS_ENTROPY_LOSS : { 7173if (src0_needs_grads ) { 7174ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_cross_entropy_loss_back (ctx ,grad ,src0 ,src1 )); 7175 } 7176GGML_ASSERT (!src1_needs_grads && "backward pass for labels not implemented" ); 7177 }break ; 7178case GGML_OP_GLU : { 7179switch (ggml_get_glu_op (tensor )) { 7180case GGML_GLU_OP_SWIGLU : { 7181if (src0_needs_grads ) { 7182GGML_ASSERT (src1 && "backward pass only implemented for split swiglu" ); 7183ggml_add_or_set (ctx ,cgraph ,isrc0 ,ggml_silu_back (ctx ,ggml_mul (ctx ,grad ,src1 ),src0 )); 7184 } 7185if (src1_needs_grads ) { 7186ggml_add_or_set (ctx ,cgraph ,isrc1 ,ggml_mul (ctx ,ggml_silu (ctx ,src0 ),grad )); 7187 } 7188 }break ; 7189default : { 7190GGML_ABORT ("unsupported glu op for backward pass: %s" ,ggml_glu_op_name (ggml_get_glu_op (tensor ))); 7191 }//break; 7192 } 7193 }break ; 7194case GGML_OP_NONE : { 7195// noop 7196 }break ; 7197case GGML_OP_COUNT : 7198default : { 7199GGML_ABORT ("%s: unsupported ggml op for backward pass: %s\n" ,__func__ ,ggml_op_name (tensor -> op )); 7200 }//break; 7201 } 7202 7203GGML_ASSERT (!src0_needs_grads || ggml_are_same_shape (src0 ,cgraph -> grads [isrc0 ])); 7204GGML_ASSERT (!src1_needs_grads || ggml_are_same_shape (src1 ,cgraph -> grads [isrc1 ])); 7205GGML_ASSERT (!src2_needs_grads || ggml_are_same_shape (src2 ,cgraph -> grads [isrc2 ])); 7206} 7207 7208static size_t ggml_visit_parents_graph (struct ggml_cgraph * cgraph ,struct ggml_tensor * node ,bool compute ) { 7209if (node -> op != GGML_OP_NONE && compute ) { 7210node -> flags |=GGML_TENSOR_FLAG_COMPUTE ; 7211 } 7212 7213const size_t node_hash_pos = ggml_hash_find (& cgraph -> visited_hash_set ,node ); 7214GGML_ASSERT (node_hash_pos != GGML_HASHSET_FULL ); 7215 7216if (ggml_bitset_get (cgraph -> visited_hash_set .used ,node_hash_pos )) { 7217// already visited 7218 7219if (compute ) { 7220// update the compute flag regardless 7221for (int i = 0 ;i < GGML_MAX_SRC ;++ i ) { 7222struct ggml_tensor * src = node -> src [i ]; 7223if (src && ((src -> flags & GGML_TENSOR_FLAG_COMPUTE )== 0 )) { 7224ggml_visit_parents_graph (cgraph ,src , true); 7225 } 7226 } 7227 } 7228 7229return node_hash_pos ; 7230 } 7231 7232// This is the first time we see this node in the current graph. 7233cgraph -> visited_hash_set .keys [node_hash_pos ]= node ; 7234ggml_bitset_set (cgraph -> visited_hash_set .used ,node_hash_pos ); 7235cgraph -> use_counts [node_hash_pos ]= 0 ; 7236 7237for (int i = 0 ;i < GGML_MAX_SRC ;++ i ) { 7238const int k = 7239 (cgraph -> order == GGML_CGRAPH_EVAL_ORDER_LEFT_TO_RIGHT ) ?i : 7240 (cgraph -> order == GGML_CGRAPH_EVAL_ORDER_RIGHT_TO_LEFT ) ? (GGML_MAX_SRC - 1 - i ) : 7241/* unknown order, just fall back to using i */ i ; 7242 7243struct ggml_tensor * src = node -> src [k ]; 7244if (src ) { 7245const size_t src_hash_pos = ggml_visit_parents_graph (cgraph ,src ,compute ); 7246 7247// Update the use count for this operand. 7248cgraph -> use_counts [src_hash_pos ]++ ; 7249 } 7250 } 7251 7252if (node -> op == GGML_OP_NONE && !(node -> flags & GGML_TENSOR_FLAG_PARAM )) { 7253// reached a leaf node, not part of the gradient graph (e.g. a constant) 7254GGML_ASSERT (cgraph -> n_leafs < cgraph -> size ); 7255 7256if (strlen (node -> name )== 0 ) { 7257ggml_format_name (node ,"leaf_%d" ,cgraph -> n_leafs ); 7258 } 7259 7260cgraph -> leafs [cgraph -> n_leafs ]= node ; 7261cgraph -> n_leafs ++ ; 7262 }else { 7263GGML_ASSERT (cgraph -> n_nodes < cgraph -> size ); 7264 7265if (strlen (node -> name )== 0 ) { 7266ggml_format_name (node ,"node_%d" ,cgraph -> n_nodes ); 7267 } 7268 7269cgraph -> nodes [cgraph -> n_nodes ]= node ; 7270cgraph -> n_nodes ++ ; 7271 } 7272 7273return node_hash_pos ; 7274} 7275 7276static void ggml_build_forward_impl (struct ggml_cgraph * cgraph ,struct ggml_tensor * tensor ,bool expand ,bool compute ) { 7277if (!expand ) { 7278// TODO: this branch isn't accessible anymore, maybe move this to ggml_build_forward_expand 7279ggml_graph_clear (cgraph ); 7280 } 7281 7282const int n_old = cgraph -> n_nodes ; 7283 7284ggml_visit_parents_graph (cgraph ,tensor ,compute ); 7285 7286const int n_new = cgraph -> n_nodes - n_old ; 7287GGML_PRINT_DEBUG ("%s: visited %d new nodes\n" ,__func__ ,n_new ); 7288 7289if (n_new > 0 ) { 7290// the last added node should always be starting point 7291GGML_ASSERT (cgraph -> nodes [cgraph -> n_nodes - 1 ]== tensor ); 7292 } 7293} 7294 7295struct ggml_tensor * ggml_build_forward_select ( 7296struct ggml_cgraph * cgraph , 7297struct ggml_tensor ** tensors , 7298int n_tensors , 7299int idx ) { 7300GGML_ASSERT (idx >=0 && idx < n_tensors ); 7301 7302for (int i = 0 ;i < n_tensors ;i ++ ) { 7303ggml_build_forward_impl (cgraph ,tensors [i ], true,i == idx ? true : false); 7304 } 7305 7306return tensors [idx ]; 7307} 7308 7309void ggml_build_forward_expand (struct ggml_cgraph * cgraph ,struct ggml_tensor * tensor ) { 7310ggml_build_forward_impl (cgraph ,tensor , true, true); 7311} 7312 7313void ggml_build_forward_order (struct ggml_cgraph * cgraph ,struct ggml_tensor * tensor ) { 7314ggml_build_forward_impl (cgraph ,tensor , true, false); 7315} 7316 7317void ggml_build_backward_expand ( 7318struct ggml_context * ctx , 7319struct ggml_cgraph * cgraph , 7320struct ggml_tensor ** grad_accs ) { 7321GGML_ASSERT (cgraph -> n_nodes > 0 ); 7322GGML_ASSERT (cgraph -> grads ); 7323GGML_ASSERT (cgraph -> grad_accs ); 7324 7325const int n_nodes_f = cgraph -> n_nodes ; 7326 7327memset (cgraph -> grads ,0 ,cgraph -> visited_hash_set .size * sizeof (struct ggml_tensor * )); 7328memset (cgraph -> grad_accs ,0 ,cgraph -> visited_hash_set .size * sizeof (struct ggml_tensor * )); 7329bool * grads_needed = calloc (cgraph -> visited_hash_set .size ,sizeof (bool )); 7330 7331 { 7332bool any_params = false; 7333bool any_loss = false; 7334for (int i = 0 ;i < n_nodes_f ;++ i ) { 7335struct ggml_tensor * node = cgraph -> nodes [i ]; 7336any_params = any_params || (node -> flags & GGML_TENSOR_FLAG_PARAM ); 7337any_loss = any_loss || (node -> flags & GGML_TENSOR_FLAG_LOSS ); 7338 } 7339GGML_ASSERT (any_params && "no trainable parameters found, did you forget to call ggml_set_param?" ); 7340GGML_ASSERT (any_loss && "no training loss found, did you forget to call ggml_set_loss?" ); 7341 } 7342 7343for (int i = 0 ;i < n_nodes_f ;++ i ) { 7344struct ggml_tensor * node = cgraph -> nodes [i ]; 7345 7346if (node -> type == GGML_TYPE_I32 ) { 7347continue ; 7348 } 7349 7350bool node_needs_grad = (node -> flags & GGML_TENSOR_FLAG_PARAM )|| (node -> flags & GGML_TENSOR_FLAG_LOSS ); 7351bool ignore_src [GGML_MAX_SRC ]= {false}; 7352switch (node -> op ) { 7353// gradients in node->src[0] for one reason or another have no effect on output gradients 7354case GGML_OP_IM2COL :// only used for its shape 7355case GGML_OP_IM2COL_BACK :// same as IM2COL 7356ignore_src [0 ]= true; 7357break ; 7358case GGML_OP_UNARY : { 7359const enum ggml_unary_op uop = ggml_get_unary_op (node ); 7360// SGN and STEP unary ops are piecewise constant 7361if (uop == GGML_UNARY_OP_SGN || uop == GGML_UNARY_OP_STEP ) { 7362ignore_src [0 ]= true; 7363 } 7364 }break ; 7365 7366// gradients in node->src[1] for one reason or another have no effect on output gradients 7367case GGML_OP_CPY :// gradients in CPY target are irrelevant 7368case GGML_OP_GET_ROWS :// row indices not differentiable 7369case GGML_OP_GET_ROWS_BACK :// same as for GET_ROWS 7370case GGML_OP_ROPE :// positions not differentiable 7371ignore_src [1 ]= true; 7372break ; 7373 7374default : 7375break ; 7376 } 7377for (int j = 0 ;j < GGML_MAX_SRC ;++ j ) { 7378if (!node -> src [j ]|| ignore_src [j ]|| !grads_needed [ggml_hash_find (& cgraph -> visited_hash_set ,node -> src [j ])]) { 7379continue ; 7380 } 7381GGML_ASSERT (node -> src [j ]-> type == GGML_TYPE_F32 || node -> src [j ]-> type == GGML_TYPE_F16 ); 7382node_needs_grad = true; 7383break ; 7384 } 7385if (!node_needs_grad ) { 7386continue ; 7387 } 7388 7389// inplace operations are currently not supported 7390GGML_ASSERT (!node -> view_src || node -> op == GGML_OP_CPY || node -> op == GGML_OP_SET_ROWS || node -> op == GGML_OP_VIEW || 7391node -> op == GGML_OP_RESHAPE || node -> op == GGML_OP_PERMUTE || node -> op == GGML_OP_TRANSPOSE ); 7392 7393const size_t ihash = ggml_hash_find (& cgraph -> visited_hash_set ,node ); 7394GGML_ASSERT (ihash != GGML_HASHSET_FULL ); 7395GGML_ASSERT (ggml_bitset_get (cgraph -> visited_hash_set .used ,ihash )); 7396if (grad_accs && grad_accs [i ]) { 7397cgraph -> grad_accs [ihash ]= grad_accs [i ]; 7398cgraph -> grads [ihash ]= cgraph -> grad_accs [ihash ]; 7399 }else if (node -> flags & GGML_TENSOR_FLAG_LOSS ) { 7400// loss tensors always need a gradient accumulator 7401cgraph -> grad_accs [ihash ]= ggml_new_tensor (ctx ,GGML_TYPE_F32 ,GGML_MAX_DIMS ,node -> ne ); 7402cgraph -> grads [ihash ]= cgraph -> grad_accs [ihash ]; 7403 } 7404grads_needed [ihash ]= true; 7405 } 7406 7407for (int i = n_nodes_f - 1 ;i >=0 ;-- i ) { 7408// inplace operations to add gradients are not created by ggml_compute_backward except for gradient accumulation 7409// use allocator to automatically make inplace operations 7410ggml_compute_backward (ctx ,cgraph ,i ,grads_needed ); 7411 } 7412 7413free (grads_needed ); 7414} 7415 7416static void * incr_ptr_aligned (void ** p ,size_t size ,size_t align ) { 7417void * ptr = * p ; 7418ptr = (void * )GGML_PAD ((uintptr_t )ptr ,align ); 7419* p = (void * ) ((char * )ptr + size ); 7420return ptr ; 7421} 7422 7423static size_t ggml_graph_nbytes (size_t size ,bool grads ) { 7424size_t hash_size = ggml_hash_size (size * 2 ); 7425void * p = 0 ; 7426incr_ptr_aligned (& p ,sizeof (struct ggml_cgraph ),1 ); 7427incr_ptr_aligned (& p ,size * sizeof (struct ggml_tensor * ),sizeof (struct ggml_tensor * ));// nodes 7428incr_ptr_aligned (& p ,size * sizeof (struct ggml_tensor * ),sizeof (struct ggml_tensor * ));// leafs 7429incr_ptr_aligned (& p ,hash_size * sizeof (int32_t ),sizeof (int32_t ));// use_counts 7430incr_ptr_aligned (& p ,hash_size * sizeof (struct ggml_tensor * ),sizeof (struct ggml_tensor * ));// hash keys 7431if (grads ) { 7432incr_ptr_aligned (& p ,hash_size * sizeof (struct ggml_tensor * ),sizeof (struct ggml_tensor * ));// grads 7433incr_ptr_aligned (& p ,hash_size * sizeof (struct ggml_tensor * ),sizeof (struct ggml_tensor * ));// grad_accs 7434 } 7435incr_ptr_aligned (& p ,ggml_bitset_size (hash_size )* sizeof (ggml_bitset_t ),sizeof (ggml_bitset_t )); 7436 7437size_t nbytes = (size_t )p ; 7438return nbytes ; 7439} 7440 7441size_t ggml_graph_overhead_custom (size_t size ,bool grads ) { 7442return GGML_OBJECT_SIZE + GGML_PAD (ggml_graph_nbytes (size ,grads ),GGML_MEM_ALIGN ); 7443} 7444 7445size_t ggml_graph_overhead (void ) { 7446return ggml_graph_overhead_custom (GGML_DEFAULT_GRAPH_SIZE , false); 7447} 7448 7449struct ggml_cgraph * ggml_new_graph_custom (struct ggml_context * ctx ,size_t size ,bool grads ) { 7450const size_t obj_size = ggml_graph_nbytes (size ,grads ); 7451struct ggml_object * obj = ggml_new_object (ctx ,GGML_OBJECT_TYPE_GRAPH ,obj_size ); 7452struct ggml_cgraph * cgraph = (struct ggml_cgraph * ) ((char * )ctx -> mem_buffer + obj -> offs ); 7453 7454// the size of the hash table is doubled since it needs to hold both nodes and leafs 7455size_t hash_size = ggml_hash_size (size * 2 ); 7456 7457void * p = cgraph + 1 ; 7458 7459struct ggml_tensor ** nodes_ptr = incr_ptr_aligned (& p ,size * sizeof (struct ggml_tensor * ),sizeof (struct ggml_tensor * )); 7460struct ggml_tensor ** leafs_ptr = incr_ptr_aligned (& p ,size * sizeof (struct ggml_tensor * ),sizeof (struct ggml_tensor * )); 7461int32_t * use_counts_ptr = incr_ptr_aligned (& p ,hash_size * sizeof (int32_t ),sizeof (int32_t )); 7462struct ggml_tensor ** hash_keys_ptr = incr_ptr_aligned (& p ,hash_size * sizeof (struct ggml_tensor * ),sizeof (struct ggml_tensor * )); 7463struct ggml_tensor ** grads_ptr = grads ?incr_ptr_aligned (& p ,hash_size * sizeof (struct ggml_tensor * ),sizeof (struct ggml_tensor * )) :NULL ; 7464struct ggml_tensor ** grad_accs_ptr = grads ?incr_ptr_aligned (& p ,hash_size * sizeof (struct ggml_tensor * ),sizeof (struct ggml_tensor * )) :NULL ; 7465 7466ggml_bitset_t * hash_used = incr_ptr_aligned (& p ,ggml_bitset_size (hash_size )* sizeof (ggml_bitset_t ),sizeof (ggml_bitset_t )); 7467 7468// check that we allocated the correct amount of memory 7469assert (obj_size == (size_t )((char * )p - (char * )cgraph )); 7470 7471* cgraph = (struct ggml_cgraph ) { 7472/*.size =*/ size , 7473/*.n_nodes =*/ 0 , 7474/*.n_leafs =*/ 0 , 7475/*.nodes =*/ nodes_ptr , 7476/*.grads =*/ grads_ptr , 7477/*.grad_accs =*/ grad_accs_ptr , 7478/*.leafs =*/ leafs_ptr , 7479/*.use_counts =*/ use_counts_ptr , 7480/*.hash_table =*/ {hash_size ,hash_used ,hash_keys_ptr }, 7481/*.order =*/ GGML_CGRAPH_EVAL_ORDER_LEFT_TO_RIGHT , 7482/*.uid =*/ 0 , 7483 }; 7484 7485ggml_hash_set_reset (& cgraph -> visited_hash_set ); 7486if (grads ) { 7487memset (cgraph -> grads ,0 ,hash_size * sizeof (struct ggml_tensor * )); 7488memset (cgraph -> grad_accs ,0 ,hash_size * sizeof (struct ggml_tensor * )); 7489 } 7490 7491return cgraph ; 7492} 7493 7494struct ggml_cgraph * ggml_new_graph (struct ggml_context * ctx ) { 7495return ggml_new_graph_custom (ctx ,GGML_DEFAULT_GRAPH_SIZE , false); 7496} 7497 7498struct ggml_cgraph ggml_graph_view (struct ggml_cgraph * cgraph0 ,int i0 ,int i1 ) { 7499struct ggml_cgraph cgraph = { 7500/*.size =*/ 0 , 7501/*.n_nodes =*/ i1 - i0 , 7502/*.n_leafs =*/ 0 , 7503/*.nodes =*/ cgraph0 -> nodes + i0 , 7504/*.grads =*/ NULL ,// gradients would need visited_hash_set 7505/*.grad_accs =*/ NULL , 7506/*.leafs =*/ NULL , 7507/*.use_counts =*/ cgraph0 -> use_counts , 7508/*.visited_hash_set =*/ cgraph0 -> visited_hash_set , 7509/*.order =*/ cgraph0 -> order , 7510/*.uid =*/ 0 7511 }; 7512 7513return cgraph ; 7514} 7515 7516void ggml_graph_cpy (struct ggml_cgraph * src ,struct ggml_cgraph * dst ) { 7517GGML_ASSERT (dst -> size >=src -> n_leafs ); 7518GGML_ASSERT (dst -> size >=src -> n_nodes ); 7519GGML_ASSERT (dst -> visited_hash_set .size >=src -> visited_hash_set .size ); 7520 7521dst -> n_leafs = src -> n_leafs ; 7522dst -> n_nodes = src -> n_nodes ; 7523dst -> order = src -> order ; 7524 7525for (int i = 0 ;i < src -> n_leafs ;++ i ) { 7526dst -> leafs [i ]= src -> leafs [i ]; 7527 } 7528 7529for (int i = 0 ;i < src -> n_nodes ;++ i ) { 7530dst -> nodes [i ]= src -> nodes [i ]; 7531 } 7532 7533for (size_t i = 0 ;i < src -> visited_hash_set .size ;++ i ) { 7534// copy all hashset keys (tensors) that are in use 7535if (ggml_bitset_get (src -> visited_hash_set .used ,i )) { 7536size_t new_hash_pos = ggml_hash_insert (& dst -> visited_hash_set ,src -> visited_hash_set .keys [i ]); 7537dst -> use_counts [new_hash_pos ]= src -> use_counts [i ]; 7538 } 7539 } 7540 7541if (dst -> grads ) { 7542memset (dst -> grads ,0 ,dst -> visited_hash_set .size * sizeof (struct ggml_tensor * )); 7543memset (dst -> grad_accs ,0 ,dst -> visited_hash_set .size * sizeof (struct ggml_tensor * )); 7544 } 7545if (src -> grads ) { 7546GGML_ASSERT (dst -> grads != NULL ); 7547GGML_ASSERT (dst -> grad_accs != NULL ); 7548for (int i = 0 ;i < src -> n_nodes ;++ i ) { 7549const size_t igrad_src = ggml_hash_find (& src -> visited_hash_set ,src -> nodes [i ]); 7550const size_t igrad_dst = ggml_hash_find (& dst -> visited_hash_set ,dst -> nodes [i ]); 7551 7552GGML_ASSERT (igrad_src != GGML_HASHSET_FULL ); 7553GGML_ASSERT (ggml_bitset_get (src -> visited_hash_set .used ,igrad_src )); 7554GGML_ASSERT (igrad_dst != GGML_HASHSET_FULL ); 7555GGML_ASSERT (ggml_bitset_get (dst -> visited_hash_set .used ,igrad_dst )); 7556 7557dst -> grads [igrad_dst ]= src -> grads [igrad_src ]; 7558dst -> grad_accs [igrad_dst ]= src -> grad_accs [igrad_src ]; 7559 } 7560 } 7561} 7562 7563struct ggml_cgraph * ggml_graph_dup (struct ggml_context * ctx ,struct ggml_cgraph * cgraph ,bool force_grads ) { 7564struct ggml_cgraph * result = ggml_new_graph_custom (ctx ,cgraph -> size ,cgraph -> grads || force_grads ); 7565ggml_graph_cpy (cgraph ,result ); 7566return result ; 7567} 7568 7569struct ggml_tensor * ggml_set_zero (struct ggml_tensor * tensor ) { 7570if (ggml_is_empty (tensor )) { 7571return tensor ; 7572 } 7573if (tensor -> buffer ) { 7574ggml_backend_tensor_memset (tensor ,0 ,0 ,ggml_nbytes (tensor )); 7575 }else { 7576GGML_ASSERT (tensor -> data ); 7577memset (tensor -> data ,0 ,ggml_nbytes (tensor )); 7578 } 7579return tensor ; 7580} 7581 7582void ggml_graph_reset (struct ggml_cgraph * cgraph ) { 7583if (!cgraph ) { 7584return ; 7585 } 7586GGML_ASSERT (cgraph -> grads != NULL ); 7587 7588for (int i = 0 ;i < cgraph -> n_nodes ;i ++ ) { 7589struct ggml_tensor * node = cgraph -> nodes [i ]; 7590struct ggml_tensor * grad_acc = ggml_graph_get_grad_acc (cgraph ,node ); 7591 7592if (node -> op == GGML_OP_OPT_STEP_ADAMW ) { 7593// clear momenta 7594ggml_set_zero (node -> src [2 ]); 7595ggml_set_zero (node -> src [3 ]); 7596 } 7597 7598// initial gradients of loss should be 1, 0 otherwise 7599if (grad_acc ) { 7600if (node -> flags & GGML_TENSOR_FLAG_LOSS ) { 7601GGML_ASSERT (grad_acc -> type == GGML_TYPE_F32 ); 7602GGML_ASSERT (ggml_is_scalar (grad_acc )); 7603 7604const float onef = 1.0f ; 7605if (grad_acc -> buffer ) { 7606ggml_backend_tensor_set (grad_acc ,& onef ,0 ,sizeof (float )); 7607 }else { 7608GGML_ASSERT (grad_acc -> data ); 7609* ((float * )grad_acc -> data )= onef ; 7610 } 7611 }else { 7612ggml_set_zero (grad_acc ); 7613 } 7614 } 7615 } 7616} 7617 7618void ggml_graph_clear (struct ggml_cgraph * cgraph ) { 7619cgraph -> n_leafs = 0 ; 7620cgraph -> n_nodes = 0 ; 7621ggml_hash_set_reset (& cgraph -> visited_hash_set ); 7622} 7623 7624int ggml_graph_size (struct ggml_cgraph * cgraph ) { 7625return cgraph -> size ; 7626} 7627 7628struct ggml_tensor * ggml_graph_node (struct ggml_cgraph * cgraph ,int i ) { 7629if (i < 0 ) { 7630GGML_ASSERT (cgraph -> n_nodes + i >=0 ); 7631return cgraph -> nodes [cgraph -> n_nodes + i ]; 7632 } 7633 7634GGML_ASSERT (i < cgraph -> n_nodes ); 7635return cgraph -> nodes [i ]; 7636} 7637 7638struct ggml_tensor ** ggml_graph_nodes (struct ggml_cgraph * cgraph ) { 7639return cgraph -> nodes ; 7640} 7641 7642int ggml_graph_n_nodes (struct ggml_cgraph * cgraph ) { 7643return cgraph -> n_nodes ; 7644} 7645 7646void ggml_graph_add_node (struct ggml_cgraph * cgraph ,struct ggml_tensor * tensor ) { 7647GGML_ASSERT (cgraph -> size > cgraph -> n_nodes ); 7648cgraph -> nodes [cgraph -> n_nodes ]= tensor ; 7649cgraph -> n_nodes ++ ; 7650} 7651 7652struct ggml_tensor * ggml_graph_get_tensor (const struct ggml_cgraph * cgraph ,const char * name ) { 7653for (int i = 0 ;i < cgraph -> n_leafs ;i ++ ) { 7654struct ggml_tensor * leaf = cgraph -> leafs [i ]; 7655 7656if (strcmp (leaf -> name ,name )== 0 ) { 7657return leaf ; 7658 } 7659 } 7660 7661for (int i = 0 ;i < cgraph -> n_nodes ;i ++ ) { 7662struct ggml_tensor * node = cgraph -> nodes [i ]; 7663 7664if (strcmp (node -> name ,name )== 0 ) { 7665return node ; 7666 } 7667 } 7668 7669return NULL ; 7670} 7671 7672struct ggml_tensor * ggml_graph_get_grad (const struct ggml_cgraph * cgraph ,const struct ggml_tensor * node ) { 7673const size_t igrad = ggml_hash_find (& cgraph -> visited_hash_set ,node ); 7674return igrad != GGML_HASHSET_FULL && ggml_bitset_get (cgraph -> visited_hash_set .used ,igrad )&& cgraph -> grads ?cgraph -> grads [igrad ] :NULL ; 7675} 7676 7677struct ggml_tensor * ggml_graph_get_grad_acc (const struct ggml_cgraph * cgraph ,const struct ggml_tensor * node ) { 7678const size_t igrad = ggml_hash_find (& cgraph -> visited_hash_set ,node ); 7679return igrad != GGML_HASHSET_FULL && ggml_bitset_get (cgraph -> visited_hash_set .used ,igrad )&& cgraph -> grad_accs ?cgraph -> grad_accs [igrad ] :NULL ; 7680} 7681 7682void ggml_graph_print (const struct ggml_cgraph * cgraph ) { 7683GGML_LOG_INFO ("=== GRAPH ===\n" ); 7684 7685GGML_LOG_INFO ("n_nodes = %d\n" ,cgraph -> n_nodes ); 7686for (int i = 0 ;i < cgraph -> n_nodes ;i ++ ) { 7687struct ggml_tensor * node = cgraph -> nodes [i ]; 7688 7689GGML_LOG_INFO (" - %3d: [ %5" PRId64 ", %5" PRId64 ", %5" PRId64 "] %16s %s\n" , 7690i , 7691node -> ne [0 ],node -> ne [1 ],node -> ne [2 ], 7692ggml_op_name (node -> op ), (node -> flags & GGML_TENSOR_FLAG_PARAM ) ?"x" : 7693ggml_graph_get_grad (cgraph ,node ) ?"g" :" " ); 7694 } 7695 7696GGML_LOG_INFO ("n_leafs = %d\n" ,cgraph -> n_leafs ); 7697for (int i = 0 ;i < cgraph -> n_leafs ;i ++ ) { 7698struct ggml_tensor * node = cgraph -> leafs [i ]; 7699 7700GGML_LOG_INFO (" - %3d: [ %5" PRId64 ", %5" PRId64 "] %8s %16s\n" , 7701i , 7702node -> ne [0 ],node -> ne [1 ], 7703ggml_op_name (node -> op ), 7704ggml_get_name (node )); 7705 } 7706 7707GGML_LOG_INFO ("========================================\n" ); 7708} 7709 7710static int ggml_node_list_find_tensor (const struct ggml_cgraph * cgraph , 7711const int * idxs , 7712int count , 7713const struct ggml_tensor * tensor ) { 7714GGML_ASSERT (cgraph && idxs ); 7715for (int i = 0 ;i < count ;++ i ) { 7716const int node_idx = idxs [i ]; 7717 7718if (node_idx >=cgraph -> n_nodes ) { 7719return -1 ; 7720 } 7721if (cgraph -> nodes [node_idx ]== tensor ) { 7722return i ; 7723 } 7724 } 7725return -1 ; 7726} 7727 7728static bool ggml_is_constant (const struct ggml_tensor * tensor ) { 7729return tensor -> buffer != NULL && ggml_backend_buffer_get_usage (tensor -> buffer )== GGML_BACKEND_BUFFER_USAGE_WEIGHTS && (tensor -> flags & GGML_TENSOR_FLAG_PARAM )== 0 ; 7730} 7731 7732bool ggml_can_fuse_subgraph_ext (const struct ggml_cgraph * cgraph , 7733const int * node_idxs , 7734int count , 7735const enum ggml_op * ops , 7736const int * outputs , 7737int num_outputs ) { 7738GGML_ASSERT (outputs && num_outputs > 0 ); 7739 7740for (int i = 0 ;i < count ;++ i ) { 7741if (node_idxs [i ] >=cgraph -> n_nodes ) { 7742return false; 7743 } 7744 7745const struct ggml_tensor * node = cgraph -> nodes [node_idxs [i ]]; 7746 7747if (node -> op != ops [i ]) { 7748return false; 7749 } 7750 7751if ((node -> flags & GGML_TENSOR_FLAG_COMPUTE )== 0 ) { 7752return false; 7753 } 7754 7755if (ggml_node_list_find_tensor (cgraph ,outputs ,num_outputs ,node )!= -1 ) { 7756continue ; 7757 } 7758 7759if (node -> flags & GGML_TENSOR_FLAG_OUTPUT ) { 7760return false; 7761 } 7762 7763int subgraph_uses = 0 ; 7764for (int j = i + 1 ;j < count ;++ j ) { 7765const struct ggml_tensor * other_node = cgraph -> nodes [node_idxs [j ]]; 7766for (int src_idx = 0 ;src_idx < GGML_MAX_SRC ;src_idx ++ ) { 7767if (other_node -> src [src_idx ]== node ) { 7768subgraph_uses ++ ; 7769 } 7770 } 7771 } 7772 7773if (subgraph_uses != ggml_node_get_use_count (cgraph ,node_idxs [i ])) { 7774return false; 7775 } 7776 7777// if node is a view, check if the view_src and all its parent view_srcs are within the subgraph. 7778// external view sources are allowed only for weight tensors, which are constant for this graph execution. 7779struct ggml_tensor * view_src = node -> view_src ; 7780while (view_src ) { 7781if (ggml_node_list_find_tensor (cgraph ,node_idxs ,count ,view_src )== -1 && !ggml_is_constant (view_src )) { 7782return false; 7783 } 7784view_src = view_src -> view_src ; 7785 } 7786 } 7787 7788return true; 7789} 7790 7791// check if node is part of the graph 7792static bool ggml_graph_find (const struct ggml_cgraph * cgraph ,const struct ggml_tensor * node ) { 7793if (cgraph == NULL ) { 7794return true; 7795 } 7796 7797for (int i = 0 ;i < cgraph -> n_nodes ;i ++ ) { 7798if (cgraph -> nodes [i ]== node ) { 7799return true; 7800 } 7801 } 7802 7803return false; 7804} 7805 7806static struct ggml_tensor * ggml_graph_get_parent (const struct ggml_cgraph * cgraph ,const struct ggml_tensor * node ) { 7807for (int i = 0 ;i < cgraph -> n_nodes ;i ++ ) { 7808struct ggml_tensor * parent = cgraph -> nodes [i ]; 7809struct ggml_tensor * grad = ggml_graph_get_grad (cgraph ,parent ); 7810 7811if (grad == node ) { 7812return parent ; 7813 } 7814 } 7815 7816return NULL ; 7817} 7818 7819static void ggml_graph_dump_dot_node_edge (FILE * fp ,const struct ggml_cgraph * gb ,struct ggml_tensor * node ,struct ggml_tensor * parent ,const char * label ) { 7820struct ggml_tensor * gparent = ggml_graph_get_parent (gb ,node ); 7821struct ggml_tensor * gparent0 = ggml_graph_get_parent (gb ,parent ); 7822fprintf (fp ," \"%p\" -> \"%p\" [ arrowhead = %s; style = %s; label = \"%s\"; ]\n" , 7823gparent0 ? (void * )gparent0 : (void * )parent , 7824gparent ? (void * )gparent : (void * )node , 7825gparent ?"empty" :"vee" , 7826gparent ?"dashed" :"solid" , 7827label ); 7828} 7829 7830static void ggml_graph_dump_dot_leaf_edge (FILE * fp ,struct ggml_tensor * node ,struct ggml_tensor * parent ,const char * label ) { 7831fprintf (fp ," \"%p\" -> \"%p\" [ label = \"%s\"; ]\n" , 7832 (void * )parent , 7833 (void * )node , 7834label ); 7835} 7836 7837void ggml_graph_dump_dot (const struct ggml_cgraph * gb ,const struct ggml_cgraph * cgraph ,const char * filename ) { 7838char color [16 ]; 7839 7840FILE * fp = ggml_fopen (filename ,"w" ); 7841GGML_ASSERT (fp ); 7842 7843fprintf (fp ,"digraph G {\n" ); 7844fprintf (fp ," newrank = true;\n" ); 7845fprintf (fp ," rankdir = TB;\n" ); 7846 7847for (int i = 0 ;i < gb -> n_nodes ;i ++ ) { 7848struct ggml_tensor * node = gb -> nodes [i ]; 7849struct ggml_tensor * grad = ggml_graph_get_grad (gb ,node ); 7850 7851if (ggml_graph_get_parent (gb ,node )!= NULL ) { 7852continue ; 7853 } 7854 7855if (node -> flags & GGML_TENSOR_FLAG_PARAM ) { 7856snprintf (color ,sizeof (color ),"yellow" ); 7857 }else if (grad ) { 7858if (ggml_graph_find (cgraph ,node )) { 7859snprintf (color ,sizeof (color ),"green" ); 7860 }else { 7861snprintf (color ,sizeof (color ),"lightblue" ); 7862 } 7863 }else { 7864snprintf (color ,sizeof (color ),"white" ); 7865 } 7866 7867fprintf (fp ," \"%p\" [ " 7868"style = filled; fillcolor = %s; shape = record; " 7869"label=\"" , 7870 (void * )node ,color ); 7871 7872if (strlen (node -> name )> 0 ) { 7873fprintf (fp ,"%s (%s)|" ,node -> name ,ggml_type_name (node -> type )); 7874 }else { 7875fprintf (fp ,"(%s)|" ,ggml_type_name (node -> type )); 7876 } 7877 7878if (ggml_is_matrix (node )) { 7879fprintf (fp ,"%d [%" PRId64 ", %" PRId64 "] | <x>%s" ,i ,node -> ne [0 ],node -> ne [1 ],ggml_op_symbol (node -> op )); 7880 }else { 7881fprintf (fp ,"%d [%" PRId64 ", %" PRId64 ", %" PRId64 "] | <x>%s" ,i ,node -> ne [0 ],node -> ne [1 ],node -> ne [2 ],ggml_op_symbol (node -> op )); 7882 } 7883 7884if (grad ) { 7885fprintf (fp ," | <g>%s\"; ]\n" ,ggml_op_symbol (grad -> op )); 7886 }else { 7887fprintf (fp ,"\"; ]\n" ); 7888 } 7889 } 7890 7891for (int i = 0 ;i < gb -> n_leafs ;i ++ ) { 7892struct ggml_tensor * node = gb -> leafs [i ]; 7893 7894snprintf (color ,sizeof (color ),"pink" ); 7895 7896fprintf (fp ," \"%p\" [ " 7897"style = filled; fillcolor = %s; shape = record; " 7898"label=\"<x>" , 7899 (void * )node ,color ); 7900 7901if (strlen (node -> name )> 0 ) { 7902fprintf (fp ,"%s (%s)|" ,node -> name ,ggml_type_name (node -> type )); 7903 }else { 7904fprintf (fp ,"(%s)|" ,ggml_type_name (node -> type )); 7905 } 7906 7907fprintf (fp ,"CONST %d [%" PRId64 ", %" PRId64 "]" ,i ,node -> ne [0 ],node -> ne [1 ]); 7908if (ggml_nelements (node )< 5 && node -> data != NULL ) { 7909fprintf (fp ," | (" ); 7910for (int j = 0 ;j < ggml_nelements (node );j ++ ) { 7911// FIXME: use ggml-backend to obtain the tensor data 7912//if (node->type == GGML_TYPE_I8 || node->type == GGML_TYPE_I16 || node->type == GGML_TYPE_I32) { 7913// fprintf(fp, "%d", ggml_get_i32_1d(node, j)); 7914//} 7915//else if (node->type == GGML_TYPE_F32 || 7916// node->type == GGML_TYPE_F16 || 7917// node->type == GGML_TYPE_BF16) { 7918// fprintf(fp, "%.1e", (double)ggml_get_f32_1d(node, j)); 7919//} 7920//else 7921 { 7922fprintf (fp ,"#" ); 7923 } 7924if (j < ggml_nelements (node )- 1 ) { 7925fprintf (fp ,", " ); 7926 } 7927 } 7928fprintf (fp ,")" ); 7929 } 7930fprintf (fp ,"\"; ]\n" ); 7931 } 7932 7933for (int i = 0 ;i < gb -> n_nodes ;i ++ ) { 7934struct ggml_tensor * node = gb -> nodes [i ]; 7935 7936for (int j = 0 ;j < GGML_MAX_SRC ;j ++ ) { 7937if (node -> src [j ]) { 7938char label [16 ]; 7939snprintf (label ,sizeof (label ),"src %d" ,j ); 7940ggml_graph_dump_dot_node_edge (fp ,gb ,node ,node -> src [j ],label ); 7941 } 7942 } 7943 } 7944 7945for (int i = 0 ;i < gb -> n_leafs ;i ++ ) { 7946struct ggml_tensor * node = gb -> leafs [i ]; 7947 7948for (int j = 0 ;j < GGML_MAX_SRC ;j ++ ) { 7949if (node -> src [j ]) { 7950char label [16 ]; 7951snprintf (label ,sizeof (label ),"src %d" ,j ); 7952ggml_graph_dump_dot_leaf_edge (fp ,node ,node -> src [j ],label ); 7953 } 7954 } 7955 } 7956 7957fprintf (fp ,"}\n" ); 7958 7959fclose (fp ); 7960 7961GGML_LOG_INFO ("%s: dot -Tpng %s -o %s.png && open %s.png\n" ,__func__ ,filename ,filename ,filename ); 7962} 7963 7964//////////////////////////////////////////////////////////////////////////////// 7965 7966void ggml_set_input (struct ggml_tensor * tensor ) { 7967tensor -> flags |=GGML_TENSOR_FLAG_INPUT ; 7968} 7969 7970void ggml_set_output (struct ggml_tensor * tensor ) { 7971for (struct ggml_tensor * cur = tensor ;cur != NULL ;cur = cur -> view_src ) { 7972cur -> flags |=GGML_TENSOR_FLAG_OUTPUT ; 7973 } 7974} 7975 7976void ggml_set_param (struct ggml_tensor * tensor ) { 7977GGML_ASSERT (tensor -> op == GGML_OP_NONE ); 7978tensor -> flags |=GGML_TENSOR_FLAG_PARAM ; 7979} 7980 7981void ggml_set_loss (struct ggml_tensor * tensor ) { 7982GGML_ASSERT (ggml_is_scalar (tensor )); 7983GGML_ASSERT (tensor -> type == GGML_TYPE_F32 ); 7984tensor -> flags |=GGML_TENSOR_FLAG_LOSS ; 7985} 7986 7987//////////////////////////////////////////////////////////////////////////////// 7988 7989void ggml_quantize_init (enum ggml_type type ) { 7990ggml_critical_section_start (); 7991 7992switch (type ) { 7993case GGML_TYPE_IQ2_XXS : 7994case GGML_TYPE_IQ2_XS : 7995case GGML_TYPE_IQ2_S : 7996case GGML_TYPE_IQ1_S : 7997case GGML_TYPE_IQ1_M :iq2xs_init_impl (type );break ; 7998case GGML_TYPE_IQ3_XXS :iq3xs_init_impl (256 );break ; 7999case GGML_TYPE_IQ3_S :iq3xs_init_impl (512 );break ; 8000default :// nothing 8001break ; 8002 } 8003 8004ggml_critical_section_end (); 8005} 8006 8007void ggml_quantize_free (void ) { 8008ggml_critical_section_start (); 8009 8010iq2xs_free_impl (GGML_TYPE_IQ2_XXS ); 8011iq2xs_free_impl (GGML_TYPE_IQ2_XS ); 8012iq2xs_free_impl (GGML_TYPE_IQ2_S ); 8013iq2xs_free_impl (GGML_TYPE_IQ1_S ); 8014iq2xs_free_impl (GGML_TYPE_IQ1_M ); 8015iq3xs_free_impl (256 ); 8016iq3xs_free_impl (512 ); 8017 8018ggml_critical_section_end (); 8019} 8020 8021bool ggml_quantize_requires_imatrix (enum ggml_type type ) { 8022return 8023type == GGML_TYPE_IQ2_XXS || 8024type == GGML_TYPE_IQ2_XS || 8025type == GGML_TYPE_IQ1_S ;// || 8026//type == GGML_TYPE_IQ1_M; 8027} 8028 8029size_t ggml_quantize_chunk ( 8030enum ggml_type type , 8031const float * src , 8032void * dst , 8033int64_t start , 8034int64_t nrows , 8035int64_t n_per_row , 8036const float * imatrix ) { 8037const int64_t n = nrows * n_per_row ; 8038 8039if (ggml_quantize_requires_imatrix (type )) { 8040GGML_ASSERT (imatrix != NULL ); 8041 } 8042 8043GGML_ASSERT (start %type_traits [type ].blck_size == 0 ); 8044GGML_ASSERT (start %n_per_row == 0 ); 8045 8046ggml_quantize_init (type );// this is noop if already initialized 8047 8048const size_t start_row = start /n_per_row ; 8049const size_t row_size = ggml_row_size (type ,n_per_row ); 8050 8051size_t result = 0 ; 8052 8053switch (type ) { 8054case GGML_TYPE_Q1_0 :result = quantize_q1_0 (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8055case GGML_TYPE_Q2_0 :result = quantize_q2_0 (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8056case GGML_TYPE_Q4_0 :result = quantize_q4_0 (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8057case GGML_TYPE_Q4_1 :result = quantize_q4_1 (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8058case GGML_TYPE_Q5_0 :result = quantize_q5_0 (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8059case GGML_TYPE_Q5_1 :result = quantize_q5_1 (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8060case GGML_TYPE_Q8_0 :result = quantize_q8_0 (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8061case GGML_TYPE_MXFP4 :result = quantize_mxfp4 (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8062case GGML_TYPE_NVFP4 :result = quantize_nvfp4 (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8063case GGML_TYPE_Q2_K :result = quantize_q2_K (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8064case GGML_TYPE_Q3_K :result = quantize_q3_K (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8065case GGML_TYPE_Q4_K :result = quantize_q4_K (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8066case GGML_TYPE_Q5_K :result = quantize_q5_K (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8067case GGML_TYPE_Q6_K :result = quantize_q6_K (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8068case GGML_TYPE_TQ1_0 :result = quantize_tq1_0 (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8069case GGML_TYPE_TQ2_0 :result = quantize_tq2_0 (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8070case GGML_TYPE_IQ2_XXS :result = quantize_iq2_xxs (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8071case GGML_TYPE_IQ2_XS :result = quantize_iq2_xs (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8072case GGML_TYPE_IQ3_XXS :result = quantize_iq3_xxs (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8073case GGML_TYPE_IQ3_S :result = quantize_iq3_s (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8074case GGML_TYPE_IQ2_S :result = quantize_iq2_s (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8075case GGML_TYPE_IQ1_S :result = quantize_iq1_s (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8076case GGML_TYPE_IQ1_M :result = quantize_iq1_m (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8077case GGML_TYPE_IQ4_NL :result = quantize_iq4_nl (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8078case GGML_TYPE_IQ4_XS :result = quantize_iq4_xs (src + start , (char * )dst + start_row * row_size ,nrows ,n_per_row ,imatrix );break ; 8079case GGML_TYPE_F16 : 8080 { 8081size_t elemsize = sizeof (ggml_fp16_t ); 8082ggml_fp32_to_fp16_row (src + start , (ggml_fp16_t * )dst + start ,n ); 8083result = n * elemsize ; 8084 }break ; 8085case GGML_TYPE_BF16 : 8086 { 8087size_t elemsize = sizeof (ggml_bf16_t ); 8088ggml_fp32_to_bf16_row_ref (src + start , (ggml_bf16_t * )dst + start ,n ); 8089result = n * elemsize ; 8090 }break ; 8091case GGML_TYPE_F32 : 8092 { 8093size_t elemsize = sizeof (float ); 8094result = n * elemsize ; 8095memcpy ((uint8_t * )dst + start * elemsize ,src + start ,result ); 8096 }break ; 8097default : 8098assert (false); 8099 } 8100 8101GGML_ASSERT (result == nrows * row_size ); 8102 8103return result ; 8104} 8105 8106//////////////////////////////////////////////////////////////////////////////// 8107 8108void ggml_log_get (ggml_log_callback * log_callback ,void ** user_data ) { 8109* log_callback = g_logger_state .log_callback ; 8110* user_data = g_logger_state .log_callback_user_data ; 8111} 8112 8113void ggml_log_set (ggml_log_callback log_callback ,void * user_data ) { 8114g_logger_state .log_callback = log_callback ?log_callback :ggml_log_callback_default ; 8115g_logger_state .log_callback_user_data = user_data ; 8116} 8117 8118void ggml_threadpool_params_init (struct ggml_threadpool_params * p ,int n_threads ) { 8119p -> n_threads = n_threads ; 8120p -> prio = 0 ;// default priority (usually means normal or inherited) 8121p -> poll = 50 ;// hybrid-polling enabled 8122p -> strict_cpu = false;// no strict placement (all threads share same cpumask) 8123p -> paused = false;// threads are ready to go 8124memset (p -> cpumask ,0 ,GGML_MAX_N_THREADS );// all-zero means use the default affinity (usually inherited) 8125} 8126 8127struct ggml_threadpool_params ggml_threadpool_params_default (int n_threads ) { 8128struct ggml_threadpool_params p ; 8129ggml_threadpool_params_init (& p ,n_threads ); 8130return p ; 8131} 8132 8133bool ggml_threadpool_params_match (const struct ggml_threadpool_params * p0 ,const struct ggml_threadpool_params * p1 ) { 8134if (p0 -> n_threads != p1 -> n_threads )return false; 8135if (p0 -> prio != p1 -> prio )return false; 8136if (p0 -> poll != p1 -> poll )return false; 8137if (p0 -> strict_cpu != p1 -> strict_cpu )return false; 8138return memcmp (p0 -> cpumask ,p1 -> cpumask ,GGML_MAX_N_THREADS )== 0 ; 8139}