whispercpp 1.3.3 → 1.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/ruby_whisper_params.c +55 -25
- data/ext/sources/CMakeLists.txt +1 -1
- data/ext/sources/bindings/javascript/package.json +1 -1
- data/ext/sources/build-xcframework.sh +24 -0
- data/ext/sources/examples/CMakeLists.txt +1 -0
- data/ext/sources/examples/addon.node/addon.cpp +19 -19
- data/ext/sources/examples/addon.node/index.js +7 -5
- data/ext/sources/examples/bench/bench.cpp +26 -16
- data/ext/sources/examples/bench.wasm/index-tmpl.html +10 -9
- data/ext/sources/examples/cli/cli.cpp +4 -2
- data/ext/sources/examples/command/command.cpp +26 -24
- data/ext/sources/examples/command.wasm/index-tmpl.html +5 -4
- data/ext/sources/examples/common-ggml.cpp +2 -0
- data/ext/sources/examples/lsp/lsp.cpp +19 -17
- data/ext/sources/examples/server/server.cpp +24 -13
- data/ext/sources/examples/server.py +6 -1
- data/ext/sources/examples/stream/stream.cpp +4 -2
- data/ext/sources/examples/stream.wasm/emscripten.cpp +6 -6
- data/ext/sources/examples/stream.wasm/index-tmpl.html +82 -5
- data/ext/sources/examples/talk-llama/CMakeLists.txt +2 -2
- data/ext/sources/examples/talk-llama/llama-adapter.cpp +101 -4
- data/ext/sources/examples/talk-llama/llama-adapter.h +6 -0
- data/ext/sources/examples/talk-llama/llama-arch.cpp +588 -15
- data/ext/sources/examples/talk-llama/llama-arch.h +58 -1
- data/ext/sources/examples/talk-llama/llama-batch.cpp +103 -71
- data/ext/sources/examples/talk-llama/llama-batch.h +31 -18
- data/ext/sources/examples/talk-llama/llama-chat.cpp +120 -5
- data/ext/sources/examples/talk-llama/llama-chat.h +7 -0
- data/ext/sources/examples/talk-llama/llama-context.cpp +460 -357
- data/ext/sources/examples/talk-llama/llama-context.h +44 -29
- data/ext/sources/examples/talk-llama/llama-cparams.h +4 -4
- data/ext/sources/examples/talk-llama/llama-graph.cpp +543 -271
- data/ext/sources/examples/talk-llama/llama-graph.h +278 -168
- data/ext/sources/examples/talk-llama/llama-hparams.cpp +118 -4
- data/ext/sources/examples/talk-llama/llama-hparams.h +61 -15
- data/ext/sources/examples/talk-llama/llama-impl.h +2 -0
- data/ext/sources/examples/talk-llama/llama-kv-cache-iswa.cpp +326 -0
- data/ext/sources/examples/talk-llama/{llama-kv-cache-unified-iswa.h → llama-kv-cache-iswa.h} +38 -29
- data/ext/sources/examples/talk-llama/llama-kv-cache.cpp +2020 -0
- data/ext/sources/examples/talk-llama/llama-kv-cache.h +358 -27
- data/ext/sources/examples/talk-llama/llama-kv-cells.h +80 -28
- data/ext/sources/examples/talk-llama/llama-memory-hybrid.cpp +56 -36
- data/ext/sources/examples/talk-llama/llama-memory-hybrid.h +30 -29
- data/ext/sources/examples/talk-llama/llama-memory-recurrent.cpp +48 -19
- data/ext/sources/examples/talk-llama/llama-memory-recurrent.h +13 -14
- data/ext/sources/examples/talk-llama/llama-memory.h +16 -10
- data/ext/sources/examples/talk-llama/llama-model-loader.cpp +2 -0
- data/ext/sources/examples/talk-llama/llama-model-loader.h +3 -2
- data/ext/sources/examples/talk-llama/llama-model.cpp +7165 -2336
- data/ext/sources/examples/talk-llama/llama-model.h +60 -9
- data/ext/sources/examples/talk-llama/llama-quant.cpp +48 -10
- data/ext/sources/examples/talk-llama/llama-sampling.cpp +226 -126
- data/ext/sources/examples/talk-llama/llama-vocab.cpp +440 -13
- data/ext/sources/examples/talk-llama/llama-vocab.h +45 -0
- data/ext/sources/examples/talk-llama/llama.cpp +65 -10
- data/ext/sources/examples/talk-llama/llama.h +95 -177
- data/ext/sources/examples/talk-llama/talk-llama.cpp +9 -6
- data/ext/sources/examples/talk-llama/unicode.cpp +207 -0
- data/ext/sources/examples/talk-llama/unicode.h +45 -0
- data/ext/sources/examples/wchess/wchess.cmd/wchess.cmd.cpp +4 -2
- data/ext/sources/examples/whisper.wasm/index-tmpl.html +17 -16
- data/ext/sources/ggml/CMakeLists.txt +59 -31
- data/ext/sources/ggml/cmake/ggml-config.cmake.in +132 -93
- data/ext/sources/ggml/include/ggml-backend.h +17 -1
- data/ext/sources/ggml/include/ggml-cpu.h +1 -1
- data/ext/sources/ggml/include/ggml-metal.h +1 -6
- data/ext/sources/ggml/include/ggml-opt.h +25 -6
- data/ext/sources/ggml/include/ggml-webgpu.h +19 -0
- data/ext/sources/ggml/include/ggml-zdnn.h +17 -0
- data/ext/sources/ggml/include/ggml.h +221 -16
- data/ext/sources/ggml/src/CMakeLists.txt +17 -2
- data/ext/sources/ggml/src/ggml-alloc.c +265 -141
- data/ext/sources/ggml/src/ggml-backend-impl.h +4 -1
- data/ext/sources/ggml/src/ggml-backend-reg.cpp +30 -13
- data/ext/sources/ggml/src/ggml-backend.cpp +221 -38
- data/ext/sources/ggml/src/ggml-blas/CMakeLists.txt +1 -1
- data/ext/sources/ggml/src/ggml-blas/ggml-blas.cpp +5 -4
- data/ext/sources/ggml/src/ggml-cann/CMakeLists.txt +14 -0
- data/ext/sources/ggml/src/ggml-cann/acl_tensor.cpp +3 -1
- data/ext/sources/ggml/src/ggml-cann/aclnn_ops.cpp +903 -717
- data/ext/sources/ggml/src/ggml-cann/aclnn_ops.h +143 -25
- data/ext/sources/ggml/src/ggml-cann/common.h +143 -1
- data/ext/sources/ggml/src/ggml-cann/ggml-cann.cpp +488 -69
- data/ext/sources/ggml/src/ggml-common.h +17 -0
- data/ext/sources/ggml/src/ggml-cpu/CMakeLists.txt +40 -18
- data/ext/sources/ggml/src/ggml-cpu/amx/amx.cpp +4 -2
- data/ext/sources/ggml/src/ggml-cpu/arch/arm/quants.c +132 -596
- data/ext/sources/ggml/src/ggml-cpu/arch/arm/repack.cpp +14 -286
- data/ext/sources/ggml/src/ggml-cpu/arch/loongarch/quants.c +103 -582
- data/ext/sources/ggml/src/ggml-cpu/arch/powerpc/quants.c +162 -589
- data/ext/sources/ggml/src/ggml-cpu/arch/riscv/quants.c +265 -437
- data/ext/sources/ggml/src/ggml-cpu/arch/riscv/repack.cpp +3 -58
- data/ext/sources/ggml/src/ggml-cpu/arch/s390/quants.c +521 -353
- data/ext/sources/ggml/src/ggml-cpu/arch/wasm/quants.c +54 -314
- data/ext/sources/ggml/src/ggml-cpu/arch/x86/quants.c +184 -675
- data/ext/sources/ggml/src/ggml-cpu/arch/x86/repack.cpp +4679 -1657
- data/ext/sources/ggml/src/ggml-cpu/arch-fallback.h +32 -2
- data/ext/sources/ggml/src/ggml-cpu/common.h +14 -0
- data/ext/sources/ggml/src/ggml-cpu/ggml-cpu-impl.h +13 -6
- data/ext/sources/ggml/src/ggml-cpu/ggml-cpu.c +70 -42
- data/ext/sources/ggml/src/ggml-cpu/ggml-cpu.cpp +35 -28
- data/ext/sources/ggml/src/ggml-cpu/kleidiai/kernels.cpp +152 -18
- data/ext/sources/ggml/src/ggml-cpu/kleidiai/kernels.h +7 -1
- data/ext/sources/ggml/src/ggml-cpu/kleidiai/kleidiai.cpp +227 -97
- data/ext/sources/ggml/src/ggml-cpu/llamafile/sgemm.cpp +474 -1116
- data/ext/sources/ggml/src/ggml-cpu/ops.cpp +1587 -1177
- data/ext/sources/ggml/src/ggml-cpu/ops.h +5 -8
- data/ext/sources/ggml/src/ggml-cpu/quants.c +35 -0
- data/ext/sources/ggml/src/ggml-cpu/quants.h +8 -0
- data/ext/sources/ggml/src/ggml-cpu/repack.cpp +458 -47
- data/ext/sources/ggml/src/ggml-cpu/repack.h +22 -0
- data/ext/sources/ggml/src/ggml-cpu/simd-mappings.h +89 -60
- data/ext/sources/ggml/src/ggml-cpu/spacemit/ime.cpp +1024 -0
- data/ext/sources/ggml/src/ggml-cpu/spacemit/ime.h +13 -0
- data/ext/sources/ggml/src/ggml-cpu/spacemit/ime1_kernels.cpp +3196 -0
- data/ext/sources/ggml/src/ggml-cpu/spacemit/ime_kernels.h +26 -0
- data/ext/sources/ggml/src/ggml-cpu/traits.cpp +2 -2
- data/ext/sources/ggml/src/ggml-cpu/traits.h +1 -1
- data/ext/sources/ggml/src/ggml-cpu/vec.cpp +170 -26
- data/ext/sources/ggml/src/ggml-cpu/vec.h +506 -63
- data/ext/sources/ggml/src/ggml-cuda/CMakeLists.txt +20 -16
- data/ext/sources/ggml/src/ggml-cuda/add-id.cu +58 -0
- data/ext/sources/ggml/src/ggml-cuda/add-id.cuh +3 -0
- data/ext/sources/ggml/src/ggml-cuda/binbcast.cu +330 -191
- data/ext/sources/ggml/src/ggml-cuda/binbcast.cuh +2 -0
- data/ext/sources/ggml/src/ggml-cuda/common.cuh +250 -63
- data/ext/sources/ggml/src/ggml-cuda/conv-transpose-1d.cu +1 -4
- data/ext/sources/ggml/src/ggml-cuda/conv2d.cu +166 -0
- data/ext/sources/ggml/src/ggml-cuda/conv2d.cuh +5 -0
- data/ext/sources/ggml/src/ggml-cuda/convert.cu +95 -22
- data/ext/sources/ggml/src/ggml-cuda/convert.cuh +15 -0
- data/ext/sources/ggml/src/ggml-cuda/cpy-utils.cuh +217 -0
- data/ext/sources/ggml/src/ggml-cuda/cpy.cu +64 -307
- data/ext/sources/ggml/src/ggml-cuda/cross-entropy-loss.cu +2 -14
- data/ext/sources/ggml/src/ggml-cuda/dequantize.cuh +14 -40
- data/ext/sources/ggml/src/ggml-cuda/fattn-common.cuh +498 -367
- data/ext/sources/ggml/src/ggml-cuda/fattn-mma-f16.cuh +137 -91
- data/ext/sources/ggml/src/ggml-cuda/fattn-tile.cu +755 -0
- data/ext/sources/ggml/src/ggml-cuda/fattn-tile.cuh +3 -0
- data/ext/sources/ggml/src/ggml-cuda/fattn-vec.cuh +593 -0
- data/ext/sources/ggml/src/ggml-cuda/fattn-wmma-f16.cu +86 -50
- data/ext/sources/ggml/src/ggml-cuda/fattn.cu +185 -198
- data/ext/sources/ggml/src/ggml-cuda/fattn.cuh +2 -0
- data/ext/sources/ggml/src/ggml-cuda/getrows.cu +50 -39
- data/ext/sources/ggml/src/ggml-cuda/ggml-cuda.cu +379 -107
- data/ext/sources/ggml/src/ggml-cuda/im2col.cu +196 -35
- data/ext/sources/ggml/src/ggml-cuda/im2col.cuh +1 -0
- data/ext/sources/ggml/src/ggml-cuda/mean.cu +56 -2
- data/ext/sources/ggml/src/ggml-cuda/mma.cuh +198 -45
- data/ext/sources/ggml/src/ggml-cuda/mmf.cu +123 -0
- data/ext/sources/ggml/src/ggml-cuda/mmf.cuh +496 -0
- data/ext/sources/ggml/src/ggml-cuda/mmq.cu +206 -57
- data/ext/sources/ggml/src/ggml-cuda/mmq.cuh +1262 -721
- data/ext/sources/ggml/src/ggml-cuda/{mmv.cu → mmvf.cu} +53 -53
- data/ext/sources/ggml/src/ggml-cuda/{mmv.cuh → mmvf.cuh} +3 -3
- data/ext/sources/ggml/src/ggml-cuda/mmvq.cu +64 -73
- data/ext/sources/ggml/src/ggml-cuda/norm.cu +284 -12
- data/ext/sources/ggml/src/ggml-cuda/norm.cuh +7 -0
- data/ext/sources/ggml/src/ggml-cuda/opt-step-sgd.cu +49 -0
- data/ext/sources/ggml/src/ggml-cuda/opt-step-sgd.cuh +5 -0
- data/ext/sources/ggml/src/ggml-cuda/pad.cu +46 -23
- data/ext/sources/ggml/src/ggml-cuda/pad_reflect_1d.cu +91 -0
- data/ext/sources/ggml/src/ggml-cuda/pad_reflect_1d.cuh +5 -0
- data/ext/sources/ggml/src/ggml-cuda/quantize.cu +12 -10
- data/ext/sources/ggml/src/ggml-cuda/reduce_rows.cuh +53 -0
- data/ext/sources/ggml/src/ggml-cuda/roll.cu +67 -0
- data/ext/sources/ggml/src/ggml-cuda/roll.cuh +5 -0
- data/ext/sources/ggml/src/ggml-cuda/rope.cu +21 -27
- data/ext/sources/ggml/src/ggml-cuda/scale.cu +14 -11
- data/ext/sources/ggml/src/ggml-cuda/set-rows.cu +276 -0
- data/ext/sources/ggml/src/ggml-cuda/set-rows.cuh +7 -0
- data/ext/sources/ggml/src/ggml-cuda/softcap.cu +34 -0
- data/ext/sources/ggml/src/ggml-cuda/softcap.cuh +5 -0
- data/ext/sources/ggml/src/ggml-cuda/softmax.cu +126 -59
- data/ext/sources/ggml/src/ggml-cuda/ssm-conv.cu +10 -2
- data/ext/sources/ggml/src/ggml-cuda/ssm-scan.cu +322 -100
- data/ext/sources/ggml/src/ggml-cuda/sum.cu +6 -10
- data/ext/sources/ggml/src/ggml-cuda/sumrows.cu +21 -4
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-f16.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-q4_0.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-q4_1.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-q5_0.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-q5_1.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-q8_0.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-f16.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-q4_0.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-q4_1.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-q5_0.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-q5_1.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-q8_0.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-f16.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-q4_0.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-q4_1.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-q5_0.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-q5_1.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-q8_0.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-f16.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-q4_0.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-q4_1.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-q5_0.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-q5_1.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-q8_0.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-f16.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-q4_0.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-q4_1.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-q5_0.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-q5_1.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-q8_0.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-f16.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-q4_0.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-q4_1.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-q5_0.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-q5_1.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-q8_0.cu +7 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/generate_cu_files.py +21 -18
- data/ext/sources/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_1.cu +5 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_10.cu +5 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_11.cu +5 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_12.cu +5 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_13.cu +5 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_14.cu +5 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_15.cu +5 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_16.cu +5 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_2.cu +5 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_3.cu +5 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_4.cu +5 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_5.cu +5 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_6.cu +5 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_7.cu +5 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_8.cu +5 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_9.cu +5 -0
- data/ext/sources/ggml/src/ggml-cuda/template-instances/mmq-instance-mxfp4.cu +5 -0
- data/ext/sources/ggml/src/ggml-cuda/topk-moe.cu +259 -0
- data/ext/sources/ggml/src/ggml-cuda/topk-moe.cuh +14 -0
- data/ext/sources/ggml/src/ggml-cuda/tsembd.cu +3 -3
- data/ext/sources/ggml/src/ggml-cuda/unary.cu +90 -0
- data/ext/sources/ggml/src/ggml-cuda/unary.cuh +8 -0
- data/ext/sources/ggml/src/ggml-cuda/upscale.cu +92 -6
- data/ext/sources/ggml/src/ggml-cuda/vecdotq.cuh +110 -22
- data/ext/sources/ggml/src/ggml-cuda/vendors/cuda.h +4 -0
- data/ext/sources/ggml/src/ggml-cuda/vendors/hip.h +58 -36
- data/ext/sources/ggml/src/ggml-cuda/vendors/musa.h +4 -3
- data/ext/sources/ggml/src/ggml-hip/CMakeLists.txt +10 -2
- data/ext/sources/ggml/src/ggml-impl.h +119 -9
- data/ext/sources/ggml/src/ggml-metal/CMakeLists.txt +10 -7
- data/ext/sources/ggml/src/ggml-metal/ggml-metal-common.cpp +446 -0
- data/ext/sources/ggml/src/ggml-metal/ggml-metal-common.h +52 -0
- data/ext/sources/ggml/src/ggml-metal/ggml-metal-context.h +33 -0
- data/ext/sources/ggml/src/ggml-metal/ggml-metal-context.m +600 -0
- data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.cpp +1376 -0
- data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.h +226 -0
- data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.m +1308 -0
- data/ext/sources/ggml/src/ggml-metal/ggml-metal-impl.h +136 -63
- data/ext/sources/ggml/src/ggml-metal/ggml-metal-ops.cpp +3158 -0
- data/ext/sources/ggml/src/ggml-metal/ggml-metal-ops.h +82 -0
- data/ext/sources/ggml/src/ggml-metal/ggml-metal.cpp +718 -0
- data/ext/sources/ggml/src/ggml-metal/ggml-metal.metal +2854 -1503
- data/ext/sources/ggml/src/ggml-musa/CMakeLists.txt +18 -8
- data/ext/sources/ggml/src/ggml-opencl/CMakeLists.txt +18 -0
- data/ext/sources/ggml/src/ggml-opencl/ggml-opencl.cpp +2510 -242
- data/ext/sources/ggml/src/ggml-opencl/kernels/add.cl +107 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/add_id.cl +42 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/conv2d.cl +185 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/conv2d_f16_f32.cl +176 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/cvt.cl +84 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/div.cl +66 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f16.cl +370 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32.cl +370 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32_f16.cl +373 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/gelu.cl +27 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/glu.cl +177 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/group_norm.cl +49 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/im2col_f16.cl +1 -1
- data/ext/sources/ggml/src/ggml-opencl/kernels/im2col_f32.cl +1 -1
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul.cl +73 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mat_f16_f32.cl +130 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_f16_f32_l4_lm.cl +132 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_f32_f32_l4_lm.cl +133 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_id_mxfp4_f32.cl +189 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_id_mxfp4_f32_flat.cl +176 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_id_q8_0_f32.cl +140 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_id_q8_0_f32_flat.cl +222 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_mxfp4_f32.cl +144 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_mxfp4_f32_flat.cl +167 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q8_0_f32.cl +125 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q8_0_f32_flat.cl +202 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/norm.cl +80 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/rms_norm.cl +79 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/scale.cl +3 -2
- data/ext/sources/ggml/src/ggml-opencl/kernels/set_rows.cl +189 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/softmax_4_f16.cl +34 -13
- data/ext/sources/ggml/src/ggml-opencl/kernels/softmax_4_f32.cl +34 -13
- data/ext/sources/ggml/src/ggml-opencl/kernels/softmax_f16.cl +34 -13
- data/ext/sources/ggml/src/ggml-opencl/kernels/softmax_f32.cl +34 -13
- data/ext/sources/ggml/src/ggml-opencl/kernels/sub.cl +66 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/transpose.cl +20 -0
- data/ext/sources/ggml/src/ggml-opencl/kernels/tsembd.cl +2 -2
- data/ext/sources/ggml/src/ggml-opencl/kernels/upscale.cl +2 -3
- data/ext/sources/ggml/src/ggml-opt.cpp +97 -41
- data/ext/sources/ggml/src/ggml-quants.c +111 -16
- data/ext/sources/ggml/src/ggml-quants.h +6 -0
- data/ext/sources/ggml/src/ggml-rpc/ggml-rpc.cpp +67 -47
- data/ext/sources/ggml/src/ggml-sycl/backend.hpp +2 -0
- data/ext/sources/ggml/src/ggml-sycl/binbcast.cpp +15 -5
- data/ext/sources/ggml/src/ggml-sycl/binbcast.hpp +6 -0
- data/ext/sources/ggml/src/ggml-sycl/concat.cpp +25 -16
- data/ext/sources/ggml/src/ggml-sycl/conv.cpp +10 -4
- data/ext/sources/ggml/src/ggml-sycl/convert.cpp +166 -99
- data/ext/sources/ggml/src/ggml-sycl/cpy.cpp +72 -306
- data/ext/sources/ggml/src/ggml-sycl/cpy.hpp +213 -1
- data/ext/sources/ggml/src/ggml-sycl/dmmv.cpp +67 -49
- data/ext/sources/ggml/src/ggml-sycl/dpct/helper.hpp +1 -31
- data/ext/sources/ggml/src/ggml-sycl/element_wise.cpp +79 -29
- data/ext/sources/ggml/src/ggml-sycl/element_wise.hpp +2 -0
- data/ext/sources/ggml/src/ggml-sycl/gemm.hpp +14 -26
- data/ext/sources/ggml/src/ggml-sycl/getrows.cpp +9 -6
- data/ext/sources/ggml/src/ggml-sycl/ggml-sycl.cpp +328 -323
- data/ext/sources/ggml/src/ggml-sycl/gla.cpp +2 -2
- data/ext/sources/ggml/src/ggml-sycl/im2col.cpp +2 -2
- data/ext/sources/ggml/src/ggml-sycl/mmq.cpp +80 -60
- data/ext/sources/ggml/src/ggml-sycl/mmvq.cpp +201 -132
- data/ext/sources/ggml/src/ggml-sycl/norm.cpp +74 -55
- data/ext/sources/ggml/src/ggml-sycl/quantize.hpp +133 -0
- data/ext/sources/ggml/src/ggml-sycl/quants.hpp +8 -9
- data/ext/sources/ggml/src/ggml-sycl/rope.cpp +35 -42
- data/ext/sources/ggml/src/ggml-sycl/set_rows.cpp +234 -0
- data/ext/sources/ggml/src/ggml-sycl/set_rows.hpp +8 -0
- data/ext/sources/ggml/src/ggml-sycl/softmax.cpp +3 -3
- data/ext/sources/ggml/src/ggml-sycl/tsembd.cpp +12 -6
- data/ext/sources/ggml/src/ggml-sycl/vecdotq.hpp +2 -6
- data/ext/sources/ggml/src/ggml-sycl/wkv.cpp +16 -12
- data/ext/sources/ggml/src/ggml-vulkan/ggml-vulkan.cpp +3492 -883
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/add.comp +41 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/add_id.comp +42 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/argmax.comp +13 -4
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/argsort.comp +39 -29
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/conv2d_mm.comp +349 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/copy_from_quant.comp +2 -2
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/copy_to_quant.comp +66 -12
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs.comp +154 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs_cm2.comp +21 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_iq2_s.comp +1 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_iq2_xxs.comp +2 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_iq3_s.comp +6 -5
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_iq3_xxs.comp +4 -2
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_mxfp4.comp +32 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q2_k.comp +1 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q3_k.comp +1 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q4_k.comp +1 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q5_k.comp +1 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q6_k.comp +1 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/exp.comp +21 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn.comp +69 -24
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_base.comp +60 -20
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_cm1.comp +98 -42
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_cm2.comp +64 -27
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_split_k_reduce.comp +74 -13
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/geglu_erf.comp +27 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/geglu_quick.comp +11 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/gelu_erf.comp +39 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/generic_binary_head.comp +4 -17
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/get_rows.comp +19 -10
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/get_rows_quant.comp +25 -15
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/glu_head.comp +4 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/hardsigmoid.comp +22 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/hardswish.comp +22 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/im2col.comp +18 -14
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/im2col_3d.comp +126 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_base.comp +65 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_nc.comp +11 -7
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vecq.comp +140 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm.comp +144 -531
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_cm2.comp +206 -38
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_funcs.comp +556 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq.comp +12 -5
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_funcs.comp +15 -9
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/multi_add.comp +111 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/opt_step_sgd.comp +22 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/pad.comp +24 -3
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/quantize_q8_1.comp +53 -3
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/rms_norm.comp +55 -11
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/rms_norm_partials.comp +65 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/roll.comp +46 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/rope_head.comp +1 -4
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/rope_multi.comp +7 -9
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/rope_neox.comp +7 -9
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/rope_norm.comp +7 -9
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/rte.comp +5 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/scale.comp +1 -1
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/soft_max.comp +29 -7
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/soft_max_back.comp +4 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sqrt.comp +17 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sum_rows.comp +38 -5
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/swiglu_oai.comp +14 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/timestep_embedding.comp +4 -3
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/types.comp +101 -9
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/upscale.comp +69 -5
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/utils.comp +25 -0
- data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp +335 -77
- data/ext/sources/ggml/src/ggml-webgpu/CMakeLists.txt +54 -0
- data/ext/sources/ggml/src/ggml-webgpu/ggml-webgpu.cpp +1558 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/add.tmpl.wgsl +44 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/add_in_place.tmpl.wgsl +41 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/binary_head.tmpl +45 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/common_decls.tmpl +930 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/cpy.wgsl +60 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/embed_wgsl.py +124 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/get_rows.tmpl.wgsl +874 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/memset.wgsl +40 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul.tmpl.wgsl +44 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_in_place.tmpl.wgsl +41 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat.tmpl.wgsl +907 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/rms_norm.wgsl +57 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/rms_norm_in_place.wgsl +48 -0
- data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/set_rows.wgsl +81 -0
- data/ext/sources/ggml/src/ggml-zdnn/CMakeLists.txt +36 -0
- data/ext/sources/ggml/src/ggml-zdnn/common.hpp +59 -0
- data/ext/sources/ggml/src/ggml-zdnn/ggml-zdnn.cpp +628 -0
- data/ext/sources/ggml/src/ggml-zdnn/mmf.cpp +80 -0
- data/ext/sources/ggml/src/ggml-zdnn/mmf.hpp +12 -0
- data/ext/sources/ggml/src/ggml-zdnn/utils.cpp +79 -0
- data/ext/sources/ggml/src/ggml-zdnn/utils.hpp +19 -0
- data/ext/sources/ggml/src/ggml.c +478 -98
- data/ext/sources/ggml/src/gguf.cpp +8 -1
- data/ext/sources/src/whisper.cpp +23 -46
- data/ext/sources/tests/CMakeLists.txt +8 -1
- data/ext/sources/tests/test-vad-full.cpp +3 -3
- data/ext/sources/tests/test-vad.cpp +2 -2
- data/lib/whisper/model/uri.rb +1 -1
- data/sig/whisper.rbs +7 -0
- data/test/test_params.rb +8 -0
- data/test/test_whisper.rb +1 -1
- data/whispercpp.gemspec +1 -1
- metadata +164 -157
- data/ext/sources/examples/talk-llama/llama-kv-cache-unified-iswa.cpp +0 -279
- data/ext/sources/examples/talk-llama/llama-kv-cache-unified.cpp +0 -1841
- data/ext/sources/examples/talk-llama/llama-kv-cache-unified.h +0 -303
- data/ext/sources/ggml/include/ggml-kompute.h +0 -50
- data/ext/sources/ggml/src/ggml-amx/CMakeLists.txt +0 -107
- data/ext/sources/ggml/src/ggml-amx/common.h +0 -94
- data/ext/sources/ggml/src/ggml-amx/ggml-amx.cpp +0 -446
- data/ext/sources/ggml/src/ggml-amx/mmq.cpp +0 -2510
- data/ext/sources/ggml/src/ggml-amx/mmq.h +0 -17
- data/ext/sources/ggml/src/ggml-cann/kernels/CMakeLists.txt +0 -30
- data/ext/sources/ggml/src/ggml-cann/kernels/ascendc_kernels.h +0 -19
- data/ext/sources/ggml/src/ggml-cann/kernels/dup.cpp +0 -234
- data/ext/sources/ggml/src/ggml-cann/kernels/get_row_f16.cpp +0 -197
- data/ext/sources/ggml/src/ggml-cann/kernels/get_row_f32.cpp +0 -190
- data/ext/sources/ggml/src/ggml-cann/kernels/get_row_q4_0.cpp +0 -204
- data/ext/sources/ggml/src/ggml-cann/kernels/get_row_q8_0.cpp +0 -191
- data/ext/sources/ggml/src/ggml-cann/kernels/quantize_f16_q8_0.cpp +0 -218
- data/ext/sources/ggml/src/ggml-cann/kernels/quantize_f32_q8_0.cpp +0 -216
- data/ext/sources/ggml/src/ggml-cann/kernels/quantize_float_to_q4_0.cpp +0 -295
- data/ext/sources/ggml/src/ggml-cuda/fattn-tile-f16.cu +0 -357
- data/ext/sources/ggml/src/ggml-cuda/fattn-tile-f16.cuh +0 -3
- data/ext/sources/ggml/src/ggml-cuda/fattn-tile-f32.cu +0 -365
- data/ext/sources/ggml/src/ggml-cuda/fattn-tile-f32.cuh +0 -3
- data/ext/sources/ggml/src/ggml-cuda/fattn-vec-f16.cuh +0 -482
- data/ext/sources/ggml/src/ggml-cuda/fattn-vec-f32.cuh +0 -472
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-f16-f16.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-f16-q4_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-f16-q4_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-f16-q5_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-f16-q5_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-f16-q8_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q4_0-f16.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q4_0-q4_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q4_0-q4_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q4_0-q5_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q4_0-q5_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q4_0-q8_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q4_1-f16.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q4_1-q4_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q4_1-q4_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q4_1-q5_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q4_1-q5_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q4_1-q8_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q5_0-f16.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q5_0-q4_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q5_0-q4_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q5_0-q5_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q5_0-q5_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q5_0-q8_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q5_1-f16.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q5_1-q4_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q5_1-q4_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q5_1-q5_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q5_1-q5_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q5_1-q8_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q8_0-f16.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q8_0-q4_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q8_0-q4_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q8_0-q5_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q8_0-q5_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs128-q8_0-q8_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs256-f16-f16.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs64-f16-f16.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs64-f16-q4_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs64-f16-q4_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs64-f16-q5_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs64-f16-q5_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f16-instance-hs64-f16-q8_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-f16-f16.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-f16-q4_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-f16-q4_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-f16-q5_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-f16-q5_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-f16-q8_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q4_0-f16.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q4_0-q4_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q4_0-q4_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q4_0-q5_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q4_0-q5_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q4_0-q8_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q4_1-f16.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q4_1-q4_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q4_1-q4_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q4_1-q5_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q4_1-q5_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q4_1-q8_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q5_0-f16.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q5_0-q4_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q5_0-q4_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q5_0-q5_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q5_0-q5_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q5_0-q8_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q5_1-f16.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q5_1-q4_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q5_1-q4_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q5_1-q5_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q5_1-q5_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q5_1-q8_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q8_0-f16.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q8_0-q4_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q8_0-q4_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q8_0-q5_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q8_0-q5_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs128-q8_0-q8_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs256-f16-f16.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs64-f16-f16.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs64-f16-q4_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs64-f16-q4_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs64-f16-q5_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs64-f16-q5_1.cu +0 -5
- data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-f32-instance-hs64-f16-q8_0.cu +0 -5
- data/ext/sources/ggml/src/ggml-kompute/CMakeLists.txt +0 -166
- data/ext/sources/ggml/src/ggml-kompute/ggml-kompute.cpp +0 -2251
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/common.comp +0 -112
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_add.comp +0 -58
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_addrow.comp +0 -25
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_cpy_f16_f16.comp +0 -52
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_cpy_f16_f32.comp +0 -52
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_cpy_f32_f16.comp +0 -52
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_cpy_f32_f32.comp +0 -52
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_diagmask.comp +0 -30
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_gelu.comp +0 -22
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_getrows.comp +0 -17
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_getrows_f16.comp +0 -31
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_getrows_f32.comp +0 -31
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_getrows_q4_0.comp +0 -38
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_getrows_q4_1.comp +0 -39
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_getrows_q6_k.comp +0 -44
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_mul.comp +0 -52
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_mul_mat_f16.comp +0 -69
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_mul_mat_mat_f32.comp +0 -51
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_mul_mat_q4_0.comp +0 -33
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_mul_mat_q4_1.comp +0 -35
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_mul_mat_q4_k.comp +0 -140
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_mul_mat_q6_k.comp +0 -106
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_mul_mat_q8_0.comp +0 -73
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_mul_mv_q_n.comp +0 -52
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_mul_mv_q_n_pre.comp +0 -28
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_norm.comp +0 -84
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_relu.comp +0 -21
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_rmsnorm.comp +0 -53
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_rope_neox_f16.comp +0 -52
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_rope_neox_f32.comp +0 -52
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_rope_norm_f16.comp +0 -52
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_rope_norm_f32.comp +0 -52
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_scale.comp +0 -19
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_scale_8.comp +0 -23
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_silu.comp +0 -22
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/op_softmax.comp +0 -72
- data/ext/sources/ggml/src/ggml-kompute/kompute-shaders/rope_common.comp +0 -71
- data/ext/sources/ggml/src/ggml-metal/ggml-metal.m +0 -6280
@@ -0,0 +1,718 @@
|
|
1
|
+
#include "ggml-metal.h"
|
2
|
+
|
3
|
+
#include "ggml-impl.h"
|
4
|
+
#include "ggml-backend-impl.h"
|
5
|
+
|
6
|
+
#include "ggml-metal-device.h"
|
7
|
+
#include "ggml-metal-context.h"
|
8
|
+
#include "ggml-metal-ops.h"
|
9
|
+
|
10
|
+
// globals
|
11
|
+
|
12
|
+
// initialized in ggml_backend_metal_reg
|
13
|
+
static ggml_backend_reg g_ggml_metal_reg;
|
14
|
+
static ggml_backend_device g_ggml_metal_device;
|
15
|
+
|
16
|
+
////////////////////////////////////////////////////////////////////////////////
|
17
|
+
// backend interface
|
18
|
+
////////////////////////////////////////////////////////////////////////////////
|
19
|
+
|
20
|
+
// shared buffer
|
21
|
+
|
22
|
+
static void ggml_backend_metal_buffer_shared_free_buffer(ggml_backend_buffer_t buffer) {
|
23
|
+
ggml_metal_buffer_t ctx = (ggml_metal_buffer_t)buffer->context;
|
24
|
+
|
25
|
+
GGML_ASSERT(ggml_metal_buffer_is_shared(ctx));
|
26
|
+
|
27
|
+
ggml_metal_buffer_free(ctx);
|
28
|
+
}
|
29
|
+
|
30
|
+
static void * ggml_backend_metal_buffer_shared_get_base(ggml_backend_buffer_t buffer) {
|
31
|
+
ggml_metal_buffer_t ctx = (ggml_metal_buffer_t)buffer->context;
|
32
|
+
|
33
|
+
GGML_ASSERT(ggml_metal_buffer_is_shared(ctx));
|
34
|
+
|
35
|
+
return ggml_metal_buffer_get_base(ctx);
|
36
|
+
}
|
37
|
+
|
38
|
+
static void ggml_backend_metal_buffer_shared_memset_tensor(ggml_backend_buffer_t buffer, ggml_tensor * tensor, uint8_t value, size_t offset, size_t size) {
|
39
|
+
ggml_metal_buffer_t ctx = (ggml_metal_buffer_t)buffer->context;
|
40
|
+
|
41
|
+
GGML_ASSERT(ggml_metal_buffer_is_shared(ctx));
|
42
|
+
|
43
|
+
ggml_metal_buffer_memset_tensor(ctx, tensor, value, offset, size);
|
44
|
+
}
|
45
|
+
|
46
|
+
static void ggml_backend_metal_buffer_shared_set_tensor(ggml_backend_buffer_t buffer, ggml_tensor * tensor, const void * data, size_t offset, size_t size) {
|
47
|
+
ggml_metal_buffer_t ctx = (ggml_metal_buffer_t)buffer->context;
|
48
|
+
|
49
|
+
GGML_ASSERT(ggml_metal_buffer_is_shared(ctx));
|
50
|
+
|
51
|
+
ggml_metal_buffer_set_tensor(ctx, tensor, data, offset, size);
|
52
|
+
}
|
53
|
+
|
54
|
+
static void ggml_backend_metal_buffer_shared_get_tensor(ggml_backend_buffer_t buffer, const ggml_tensor * tensor, void * data, size_t offset, size_t size) {
|
55
|
+
ggml_metal_buffer_t ctx = (ggml_metal_buffer_t)buffer->context;
|
56
|
+
|
57
|
+
GGML_ASSERT(ggml_metal_buffer_is_shared(ctx));
|
58
|
+
|
59
|
+
ggml_metal_buffer_get_tensor(ctx, tensor, data, offset, size);
|
60
|
+
}
|
61
|
+
|
62
|
+
static bool ggml_backend_metal_buffer_shared_cpy_tensor(ggml_backend_buffer_t buffer, const ggml_tensor * src, ggml_tensor * dst) {
|
63
|
+
ggml_metal_buffer_t ctx = (ggml_metal_buffer_t)buffer->context;
|
64
|
+
|
65
|
+
GGML_ASSERT(ggml_metal_buffer_is_shared(ctx));
|
66
|
+
|
67
|
+
GGML_UNUSED(buffer);
|
68
|
+
GGML_UNUSED(src);
|
69
|
+
GGML_UNUSED(dst);
|
70
|
+
|
71
|
+
return false;
|
72
|
+
}
|
73
|
+
|
74
|
+
static void ggml_backend_metal_buffer_shared_clear(ggml_backend_buffer_t buffer, uint8_t value) {
|
75
|
+
ggml_metal_buffer_t ctx = (ggml_metal_buffer_t)buffer->context;
|
76
|
+
|
77
|
+
GGML_ASSERT(ggml_metal_buffer_is_shared(ctx));
|
78
|
+
|
79
|
+
ggml_metal_buffer_clear(ctx, value);
|
80
|
+
}
|
81
|
+
|
82
|
+
static ggml_backend_buffer_i ggml_backend_metal_buffer_shared_i = {
|
83
|
+
/* .free_buffer = */ ggml_backend_metal_buffer_shared_free_buffer,
|
84
|
+
/* .get_base = */ ggml_backend_metal_buffer_shared_get_base,
|
85
|
+
/* .init_tensor = */ NULL,
|
86
|
+
/* .memset_tensor = */ ggml_backend_metal_buffer_shared_memset_tensor,
|
87
|
+
/* .set_tensor = */ ggml_backend_metal_buffer_shared_set_tensor,
|
88
|
+
/* .get_tensor = */ ggml_backend_metal_buffer_shared_get_tensor,
|
89
|
+
/* .cpy_tensor = */ ggml_backend_metal_buffer_shared_cpy_tensor,
|
90
|
+
/* .clear = */ ggml_backend_metal_buffer_shared_clear,
|
91
|
+
/* .reset = */ NULL,
|
92
|
+
};
|
93
|
+
|
94
|
+
// private buffer
|
95
|
+
|
96
|
+
static void ggml_backend_metal_buffer_private_free_buffer(ggml_backend_buffer_t buffer) {
|
97
|
+
ggml_metal_buffer_t ctx = (ggml_metal_buffer_t)buffer->context;
|
98
|
+
|
99
|
+
GGML_ASSERT(!ggml_metal_buffer_is_shared(ctx));
|
100
|
+
|
101
|
+
ggml_metal_buffer_free(ctx);
|
102
|
+
}
|
103
|
+
|
104
|
+
static void * ggml_backend_metal_buffer_private_get_base(ggml_backend_buffer_t buffer) {
|
105
|
+
ggml_metal_buffer_t ctx = (ggml_metal_buffer_t)buffer->context;
|
106
|
+
|
107
|
+
GGML_ASSERT(!ggml_metal_buffer_is_shared(ctx));
|
108
|
+
|
109
|
+
return ggml_metal_buffer_get_base(ctx);
|
110
|
+
}
|
111
|
+
|
112
|
+
static void ggml_backend_metal_buffer_private_memset_tensor(ggml_backend_buffer_t buffer, ggml_tensor * tensor, uint8_t value, size_t offset, size_t size) {
|
113
|
+
ggml_metal_buffer_t ctx = (ggml_metal_buffer_t)buffer->context;
|
114
|
+
|
115
|
+
GGML_ASSERT(!ggml_metal_buffer_is_shared(ctx));
|
116
|
+
|
117
|
+
ggml_metal_buffer_memset_tensor(ctx, tensor, value, offset, size);
|
118
|
+
}
|
119
|
+
|
120
|
+
static void ggml_backend_metal_buffer_private_set_tensor(ggml_backend_buffer_t buffer, ggml_tensor * tensor, const void * data, size_t offset, size_t size) {
|
121
|
+
ggml_metal_buffer_t ctx = (ggml_metal_buffer_t)buffer->context;
|
122
|
+
|
123
|
+
GGML_ASSERT(!ggml_metal_buffer_is_shared(ctx));
|
124
|
+
|
125
|
+
ggml_metal_buffer_set_tensor(ctx, tensor, data, offset, size);
|
126
|
+
}
|
127
|
+
|
128
|
+
static void ggml_backend_metal_buffer_private_get_tensor(ggml_backend_buffer_t buffer, const ggml_tensor * tensor, void * data, size_t offset, size_t size) {
|
129
|
+
ggml_metal_buffer_t ctx = (ggml_metal_buffer_t)buffer->context;
|
130
|
+
|
131
|
+
GGML_ASSERT(!ggml_metal_buffer_is_shared(ctx));
|
132
|
+
|
133
|
+
ggml_metal_buffer_get_tensor(ctx, tensor, data, offset, size);
|
134
|
+
}
|
135
|
+
|
136
|
+
static bool ggml_backend_metal_buffer_private_cpy_tensor(ggml_backend_buffer_t buffer, const ggml_tensor * src, ggml_tensor * dst) {
|
137
|
+
ggml_metal_buffer_t ctx = (ggml_metal_buffer_t)buffer->context;
|
138
|
+
|
139
|
+
GGML_ASSERT(!ggml_metal_buffer_is_shared(ctx));
|
140
|
+
|
141
|
+
GGML_UNUSED(buffer);
|
142
|
+
GGML_UNUSED(src);
|
143
|
+
GGML_UNUSED(dst);
|
144
|
+
|
145
|
+
return false;
|
146
|
+
}
|
147
|
+
|
148
|
+
static void ggml_backend_metal_buffer_private_clear(ggml_backend_buffer_t buffer, uint8_t value) {
|
149
|
+
ggml_metal_buffer_t ctx = (ggml_metal_buffer_t)buffer->context;
|
150
|
+
|
151
|
+
GGML_ASSERT(!ggml_metal_buffer_is_shared(ctx));
|
152
|
+
|
153
|
+
ggml_metal_buffer_clear(ctx, value);
|
154
|
+
}
|
155
|
+
|
156
|
+
static ggml_backend_buffer_i ggml_backend_metal_buffer_private_i = {
|
157
|
+
/* .free_buffer = */ ggml_backend_metal_buffer_private_free_buffer,
|
158
|
+
/* .get_base = */ ggml_backend_metal_buffer_private_get_base,
|
159
|
+
/* .init_tensor = */ NULL,
|
160
|
+
/* .memset_tensor = */ ggml_backend_metal_buffer_private_memset_tensor,
|
161
|
+
/* .set_tensor = */ ggml_backend_metal_buffer_private_set_tensor,
|
162
|
+
/* .get_tensor = */ ggml_backend_metal_buffer_private_get_tensor,
|
163
|
+
/* .cpy_tensor = */ ggml_backend_metal_buffer_private_cpy_tensor,
|
164
|
+
/* .clear = */ ggml_backend_metal_buffer_private_clear,
|
165
|
+
/* .reset = */ NULL,
|
166
|
+
};
|
167
|
+
|
168
|
+
//
|
169
|
+
// buffer types
|
170
|
+
//
|
171
|
+
|
172
|
+
// common method for allocating shread or private Metal buffers
|
173
|
+
static ggml_backend_buffer_t ggml_backend_metal_buffer_type_alloc_buffer(ggml_backend_buffer_type_t buft, size_t size, bool shared) {
|
174
|
+
ggml_metal_device_t ctx_dev = (ggml_metal_device_t)buft->device->context;
|
175
|
+
ggml_metal_buffer_t res = ggml_metal_buffer_init(ctx_dev, size, shared);
|
176
|
+
|
177
|
+
ggml_backend_buffer_i buf_i = ggml_metal_buffer_is_shared(res)
|
178
|
+
? ggml_backend_metal_buffer_shared_i
|
179
|
+
: ggml_backend_metal_buffer_private_i;
|
180
|
+
|
181
|
+
return ggml_backend_buffer_init(buft, buf_i, res, size);
|
182
|
+
}
|
183
|
+
|
184
|
+
static size_t ggml_backend_metal_buffer_type_get_alloc_size(ggml_backend_buffer_type_t buft, const ggml_tensor * tensor) {
|
185
|
+
size_t res = ggml_nbytes(tensor);
|
186
|
+
|
187
|
+
// some operations require additional memory for fleeting data:
|
188
|
+
switch (tensor->op) {
|
189
|
+
case GGML_OP_MUL_MAT_ID:
|
190
|
+
{
|
191
|
+
res += ggml_metal_op_mul_mat_id_extra_tpe(tensor);
|
192
|
+
res += ggml_metal_op_mul_mat_id_extra_ids(tensor);
|
193
|
+
} break;
|
194
|
+
case GGML_OP_FLASH_ATTN_EXT:
|
195
|
+
{
|
196
|
+
if (ggml_metal_op_flash_attn_ext_use_vec(tensor)) {
|
197
|
+
res += ggml_metal_op_flash_attn_ext_extra_tmp(tensor);
|
198
|
+
}
|
199
|
+
} break;
|
200
|
+
default:
|
201
|
+
break;
|
202
|
+
}
|
203
|
+
|
204
|
+
return res;
|
205
|
+
|
206
|
+
GGML_UNUSED(buft);
|
207
|
+
}
|
208
|
+
|
209
|
+
// default (shared) buffer type
|
210
|
+
|
211
|
+
static const char * ggml_backend_metal_buffer_type_shared_get_name(ggml_backend_buffer_type_t buft) {
|
212
|
+
return "Metal";
|
213
|
+
|
214
|
+
GGML_UNUSED(buft);
|
215
|
+
}
|
216
|
+
|
217
|
+
static ggml_backend_buffer_t ggml_backend_metal_buffer_type_shared_alloc_buffer(ggml_backend_buffer_type_t buft, size_t size) {
|
218
|
+
return ggml_backend_metal_buffer_type_alloc_buffer(buft, size, true);
|
219
|
+
}
|
220
|
+
|
221
|
+
static size_t ggml_backend_metal_buffer_type_shared_get_alignment(ggml_backend_buffer_type_t buft) {
|
222
|
+
return 32;
|
223
|
+
|
224
|
+
GGML_UNUSED(buft);
|
225
|
+
}
|
226
|
+
|
227
|
+
static size_t ggml_backend_metal_buffer_type_shared_get_max_size(ggml_backend_buffer_type_t buft) {
|
228
|
+
ggml_metal_device_t ctx_dev = (ggml_metal_device_t)buft->device->context;
|
229
|
+
|
230
|
+
return ggml_metal_device_get_props(ctx_dev)->max_buffer_size;
|
231
|
+
}
|
232
|
+
|
233
|
+
static size_t ggml_backend_metal_buffer_type_shared_get_alloc_size(ggml_backend_buffer_type_t buft, const ggml_tensor * tensor) {
|
234
|
+
return ggml_backend_metal_buffer_type_get_alloc_size(buft, tensor);
|
235
|
+
}
|
236
|
+
|
237
|
+
static bool ggml_backend_metal_buffer_type_shared_is_host(ggml_backend_buffer_type_t buft) {
|
238
|
+
return false;
|
239
|
+
|
240
|
+
GGML_UNUSED(buft);
|
241
|
+
}
|
242
|
+
|
243
|
+
static ggml_backend_buffer_type_t ggml_backend_metal_buffer_type_shared(void) {
|
244
|
+
static ggml_backend_buffer_type ggml_backend_buffer_type_metal = {
|
245
|
+
/* .iface = */ {
|
246
|
+
/* .get_name = */ ggml_backend_metal_buffer_type_shared_get_name,
|
247
|
+
/* .alloc_buffer = */ ggml_backend_metal_buffer_type_shared_alloc_buffer,
|
248
|
+
/* .get_alignment = */ ggml_backend_metal_buffer_type_shared_get_alignment,
|
249
|
+
/* .get_max_size = */ ggml_backend_metal_buffer_type_shared_get_max_size,
|
250
|
+
/* .get_alloc_size = */ ggml_backend_metal_buffer_type_shared_get_alloc_size,
|
251
|
+
/* .is_host = */ ggml_backend_metal_buffer_type_shared_is_host,
|
252
|
+
},
|
253
|
+
/* .device = */ &g_ggml_metal_device,
|
254
|
+
/* .context = */ NULL,
|
255
|
+
};
|
256
|
+
|
257
|
+
return &ggml_backend_buffer_type_metal;
|
258
|
+
}
|
259
|
+
|
260
|
+
// default (private) buffer type
|
261
|
+
|
262
|
+
static const char * ggml_backend_metal_buffer_type_private_get_name(ggml_backend_buffer_type_t buft) {
|
263
|
+
return "Metal_Private";
|
264
|
+
|
265
|
+
GGML_UNUSED(buft);
|
266
|
+
}
|
267
|
+
|
268
|
+
static ggml_backend_buffer_t ggml_backend_metal_buffer_type_private_alloc_buffer(ggml_backend_buffer_type_t buft, size_t size) {
|
269
|
+
return ggml_backend_metal_buffer_type_alloc_buffer(buft, size, false);
|
270
|
+
}
|
271
|
+
|
272
|
+
static size_t ggml_backend_metal_buffer_type_private_get_alignment(ggml_backend_buffer_type_t buft) {
|
273
|
+
return 32;
|
274
|
+
|
275
|
+
GGML_UNUSED(buft);
|
276
|
+
}
|
277
|
+
|
278
|
+
static size_t ggml_backend_metal_buffer_type_private_get_max_size(ggml_backend_buffer_type_t buft) {
|
279
|
+
ggml_metal_device_t ctx_dev = (ggml_metal_device_t)buft->device->context;
|
280
|
+
|
281
|
+
return ggml_metal_device_get_props(ctx_dev)->max_buffer_size;
|
282
|
+
}
|
283
|
+
|
284
|
+
static size_t ggml_backend_metal_buffer_type_private_get_alloc_size(ggml_backend_buffer_type_t buft, const ggml_tensor * tensor) {
|
285
|
+
return ggml_backend_metal_buffer_type_get_alloc_size(buft, tensor);
|
286
|
+
}
|
287
|
+
|
288
|
+
static bool ggml_backend_metal_buffer_type_private_is_host(ggml_backend_buffer_type_t buft) {
|
289
|
+
return false;
|
290
|
+
|
291
|
+
GGML_UNUSED(buft);
|
292
|
+
}
|
293
|
+
|
294
|
+
static ggml_backend_buffer_type_t ggml_backend_metal_buffer_type_private(void) {
|
295
|
+
static ggml_backend_buffer_type ggml_backend_buffer_type_metal = {
|
296
|
+
/* .iface = */ {
|
297
|
+
/* .get_name = */ ggml_backend_metal_buffer_type_private_get_name,
|
298
|
+
/* .alloc_buffer = */ ggml_backend_metal_buffer_type_private_alloc_buffer,
|
299
|
+
/* .get_alignment = */ ggml_backend_metal_buffer_type_private_get_alignment,
|
300
|
+
/* .get_max_size = */ ggml_backend_metal_buffer_type_private_get_max_size,
|
301
|
+
/* .get_alloc_size = */ ggml_backend_metal_buffer_type_private_get_alloc_size,
|
302
|
+
/* .is_host = */ ggml_backend_metal_buffer_type_private_is_host,
|
303
|
+
},
|
304
|
+
/* .device = */ &g_ggml_metal_device,
|
305
|
+
/* .context = */ NULL,
|
306
|
+
};
|
307
|
+
|
308
|
+
return &ggml_backend_buffer_type_metal;
|
309
|
+
}
|
310
|
+
|
311
|
+
// mapped buffer type
|
312
|
+
|
313
|
+
static const char * ggml_backend_metal_buffer_type_mapped_get_name(ggml_backend_buffer_type_t buft) {
|
314
|
+
return "Metal_Mapped";
|
315
|
+
|
316
|
+
GGML_UNUSED(buft);
|
317
|
+
}
|
318
|
+
|
319
|
+
static ggml_backend_buffer_t ggml_backend_metal_buffer_type_mapped_alloc_buffer(ggml_backend_buffer_type_t buft, size_t size) {
|
320
|
+
// for mapped buffers, prefer shared memory
|
321
|
+
return ggml_backend_metal_buffer_type_alloc_buffer(buft, size, true);
|
322
|
+
}
|
323
|
+
|
324
|
+
static size_t ggml_backend_metal_buffer_type_mapped_get_alignment(ggml_backend_buffer_type_t buft) {
|
325
|
+
return 32;
|
326
|
+
|
327
|
+
GGML_UNUSED(buft);
|
328
|
+
}
|
329
|
+
|
330
|
+
static size_t ggml_backend_metal_buffer_type_mapped_get_max_size(ggml_backend_buffer_type_t buft) {
|
331
|
+
ggml_metal_device_t ctx_dev = (ggml_metal_device_t)buft->device->context;
|
332
|
+
|
333
|
+
return ggml_metal_device_get_props(ctx_dev)->max_buffer_size;
|
334
|
+
}
|
335
|
+
|
336
|
+
static size_t ggml_backend_metal_buffer_type_mapped_get_alloc_size(ggml_backend_buffer_type_t buft, const ggml_tensor * tensor) {
|
337
|
+
return ggml_backend_metal_buffer_type_get_alloc_size(buft, tensor);
|
338
|
+
}
|
339
|
+
|
340
|
+
static bool ggml_backend_metal_buffer_type_mapped_is_host(ggml_backend_buffer_type_t buft) {
|
341
|
+
return false;
|
342
|
+
|
343
|
+
GGML_UNUSED(buft);
|
344
|
+
}
|
345
|
+
|
346
|
+
static ggml_backend_buffer_type_t ggml_backend_metal_buffer_type_mapped(void) {
|
347
|
+
// note: not obvious, but this buffer type still needs to implement .alloc_buffer:
|
348
|
+
// https://github.com/ggml-org/llama.cpp/pull/15832#discussion_r2333177099
|
349
|
+
static ggml_backend_buffer_type ggml_backend_buffer_type_mapped_metal = {
|
350
|
+
/* .iface = */ {
|
351
|
+
/* .get_name = */ ggml_backend_metal_buffer_type_mapped_get_name,
|
352
|
+
/* .alloc_buffer = */ ggml_backend_metal_buffer_type_mapped_alloc_buffer,
|
353
|
+
/* .get_alignment = */ ggml_backend_metal_buffer_type_mapped_get_alignment,
|
354
|
+
/* .get_max_size = */ ggml_backend_metal_buffer_type_mapped_get_max_size,
|
355
|
+
/* .get_alloc_size = */ ggml_backend_metal_buffer_type_mapped_get_alloc_size,
|
356
|
+
/* .is_host = */ ggml_backend_metal_buffer_type_mapped_is_host,
|
357
|
+
},
|
358
|
+
/* .device = */ &g_ggml_metal_device,
|
359
|
+
/* .context = */ NULL,
|
360
|
+
};
|
361
|
+
|
362
|
+
return &ggml_backend_buffer_type_mapped_metal;
|
363
|
+
}
|
364
|
+
|
365
|
+
// backend
|
366
|
+
|
367
|
+
static const char * ggml_backend_metal_name(ggml_backend_t backend) {
|
368
|
+
return "Metal";
|
369
|
+
|
370
|
+
GGML_UNUSED(backend);
|
371
|
+
}
|
372
|
+
|
373
|
+
static void ggml_backend_metal_free(ggml_backend_t backend) {
|
374
|
+
ggml_metal_t ctx = (ggml_metal_t)backend->context;
|
375
|
+
|
376
|
+
// wait for any ongoing async operations to finish
|
377
|
+
ggml_metal_synchronize(ctx);
|
378
|
+
|
379
|
+
ggml_metal_free(ctx);
|
380
|
+
|
381
|
+
free(backend);
|
382
|
+
}
|
383
|
+
|
384
|
+
static void ggml_backend_metal_synchronize(ggml_backend_t backend) {
|
385
|
+
ggml_metal_t ctx = (ggml_metal_t)backend->context;
|
386
|
+
|
387
|
+
ggml_metal_synchronize(ctx);
|
388
|
+
}
|
389
|
+
|
390
|
+
static void ggml_backend_metal_set_tensor_async(ggml_backend_t backend, ggml_tensor * tensor, const void * data, size_t offset, size_t size) {
|
391
|
+
ggml_metal_t ctx = (ggml_metal_t)backend->context;
|
392
|
+
|
393
|
+
ggml_metal_set_tensor_async(ctx, tensor, data, offset, size);
|
394
|
+
}
|
395
|
+
|
396
|
+
static void ggml_backend_metal_get_tensor_async(ggml_backend_t backend, const ggml_tensor * tensor, void * data, size_t offset, size_t size) {
|
397
|
+
ggml_metal_t ctx = (ggml_metal_t)backend->context;
|
398
|
+
|
399
|
+
ggml_metal_get_tensor_async(ctx, tensor, data, offset, size);
|
400
|
+
}
|
401
|
+
|
402
|
+
static bool ggml_backend_metal_cpy_tensor_async(ggml_backend_t backend_src, ggml_backend_t backend_dst, const ggml_tensor * src, ggml_tensor * dst) {
|
403
|
+
return false;
|
404
|
+
|
405
|
+
GGML_UNUSED(backend_src);
|
406
|
+
GGML_UNUSED(backend_dst);
|
407
|
+
GGML_UNUSED(src);
|
408
|
+
GGML_UNUSED(dst);
|
409
|
+
}
|
410
|
+
|
411
|
+
static enum ggml_status ggml_backend_metal_graph_compute(ggml_backend_t backend, ggml_cgraph * cgraph) {
|
412
|
+
ggml_metal_t ctx = (ggml_metal_t)backend->context;
|
413
|
+
|
414
|
+
return ggml_metal_graph_compute(ctx, cgraph);
|
415
|
+
}
|
416
|
+
|
417
|
+
static void ggml_backend_metal_graph_optimize(ggml_backend_t backend, ggml_cgraph * cgraph) {
|
418
|
+
ggml_metal_t ctx = (ggml_metal_t)backend->context;
|
419
|
+
|
420
|
+
ggml_metal_graph_optimize(ctx, cgraph);
|
421
|
+
}
|
422
|
+
|
423
|
+
static void ggml_backend_metal_set_n_cb(ggml_backend_t backend, int n_cb) {
|
424
|
+
GGML_ASSERT(ggml_backend_is_metal(backend));
|
425
|
+
|
426
|
+
ggml_metal_t ctx = (ggml_metal_t)backend->context;
|
427
|
+
|
428
|
+
ggml_metal_set_n_cb(ctx, n_cb);
|
429
|
+
|
430
|
+
}
|
431
|
+
|
432
|
+
static ggml_backend_i ggml_backend_metal_i = {
|
433
|
+
/* .get_name = */ ggml_backend_metal_name,
|
434
|
+
/* .free = */ ggml_backend_metal_free,
|
435
|
+
/* .set_tensor_async = */ ggml_backend_metal_set_tensor_async,
|
436
|
+
/* .get_tensor_async = */ ggml_backend_metal_get_tensor_async,
|
437
|
+
/* .cpy_tensor_async = */ ggml_backend_metal_cpy_tensor_async, // only needed for multi-GPU setups
|
438
|
+
/* .synchronize = */ ggml_backend_metal_synchronize,
|
439
|
+
/* .graph_plan_create = */ NULL,
|
440
|
+
/* .graph_plan_free = */ NULL,
|
441
|
+
/* .graph_plan_update = */ NULL,
|
442
|
+
/* .graph_plan_compute = */ NULL,
|
443
|
+
/* .graph_compute = */ ggml_backend_metal_graph_compute,
|
444
|
+
|
445
|
+
// the events API is needed only for multi-GPU setups, so likely no need to implement it for Metal
|
446
|
+
// in any case, these docs seem relevant if we ever decide to implement it:
|
447
|
+
// https://developer.apple.com/documentation/metal/mtlcommandbuffer#Synchronizing-Passes-with-Events
|
448
|
+
/* .event_record = */ NULL,
|
449
|
+
/* .event_wait = */ NULL,
|
450
|
+
/* .graph_optimize = */ ggml_backend_metal_graph_optimize,
|
451
|
+
};
|
452
|
+
|
453
|
+
static ggml_guid_t ggml_backend_metal_guid(void) {
|
454
|
+
static ggml_guid guid = { 0x81, 0xa1, 0x8b, 0x1e, 0x71, 0xec, 0x79, 0xed, 0x2b, 0x85, 0xdc, 0x8a, 0x61, 0x98, 0x30, 0xe6 };
|
455
|
+
return &guid;
|
456
|
+
}
|
457
|
+
|
458
|
+
ggml_backend_t ggml_backend_metal_init(void) {
|
459
|
+
ggml_backend_dev_t dev = ggml_backend_reg_dev_get(ggml_backend_metal_reg(), 0);
|
460
|
+
ggml_metal_device_t ctx_dev = (ggml_metal_device_t)dev->context;
|
461
|
+
|
462
|
+
ggml_metal_t ctx = ggml_metal_init(ctx_dev);
|
463
|
+
if (ctx == NULL) {
|
464
|
+
GGML_LOG_ERROR("%s: error: failed to allocate context\n", __func__);
|
465
|
+
return NULL;
|
466
|
+
}
|
467
|
+
|
468
|
+
ggml_backend_t backend = (ggml_backend_t) malloc(sizeof(ggml_backend));
|
469
|
+
|
470
|
+
*backend = {
|
471
|
+
/* .guid = */ ggml_backend_metal_guid(),
|
472
|
+
/* .interface = */ ggml_backend_metal_i,
|
473
|
+
/* .device = */ dev,
|
474
|
+
/* .context = */ ctx,
|
475
|
+
};
|
476
|
+
|
477
|
+
ggml_backend_metal_set_n_cb(backend, 1);
|
478
|
+
|
479
|
+
return backend;
|
480
|
+
}
|
481
|
+
|
482
|
+
bool ggml_backend_is_metal(ggml_backend_t backend) {
|
483
|
+
return backend != NULL && ggml_guid_matches(backend->guid, ggml_backend_metal_guid());
|
484
|
+
}
|
485
|
+
|
486
|
+
void ggml_backend_metal_set_abort_callback(ggml_backend_t backend, ggml_abort_callback abort_callback, void * user_data) {
|
487
|
+
GGML_ASSERT(ggml_backend_is_metal(backend));
|
488
|
+
|
489
|
+
ggml_metal_t ctx = (ggml_metal_t)backend->context;
|
490
|
+
|
491
|
+
ggml_metal_set_abort_callback(ctx, abort_callback, user_data);
|
492
|
+
}
|
493
|
+
|
494
|
+
bool ggml_backend_metal_supports_family(ggml_backend_t backend, int family) {
|
495
|
+
GGML_ASSERT(ggml_backend_is_metal(backend));
|
496
|
+
|
497
|
+
ggml_metal_t ctx = (ggml_metal_t)backend->context;
|
498
|
+
|
499
|
+
return ggml_metal_supports_family(ctx, family);
|
500
|
+
}
|
501
|
+
|
502
|
+
void ggml_backend_metal_capture_next_compute(ggml_backend_t backend) {
|
503
|
+
GGML_ASSERT(ggml_backend_is_metal(backend));
|
504
|
+
|
505
|
+
ggml_metal_t ctx = (ggml_metal_t)backend->context;
|
506
|
+
|
507
|
+
ggml_metal_capture_next_compute(ctx);
|
508
|
+
}
|
509
|
+
|
510
|
+
// backend device
|
511
|
+
|
512
|
+
static const char * ggml_backend_metal_device_get_name(ggml_backend_dev_t dev) {
|
513
|
+
return "Metal";
|
514
|
+
|
515
|
+
GGML_UNUSED(dev);
|
516
|
+
}
|
517
|
+
|
518
|
+
static const char * ggml_backend_metal_device_get_description(ggml_backend_dev_t dev) {
|
519
|
+
ggml_metal_device_t ctx_dev = (ggml_metal_device_t)dev->context;
|
520
|
+
|
521
|
+
return ggml_metal_device_get_props(ctx_dev)->name;
|
522
|
+
}
|
523
|
+
|
524
|
+
static void ggml_backend_metal_device_get_memory(ggml_backend_dev_t dev, size_t * free, size_t * total) {
|
525
|
+
ggml_metal_device_t ctx_dev = (ggml_metal_device_t)dev->context;
|
526
|
+
|
527
|
+
ggml_metal_device_get_memory(ctx_dev, free, total);
|
528
|
+
}
|
529
|
+
|
530
|
+
static enum ggml_backend_dev_type ggml_backend_metal_device_get_type(ggml_backend_dev_t dev) {
|
531
|
+
return GGML_BACKEND_DEVICE_TYPE_GPU;
|
532
|
+
|
533
|
+
GGML_UNUSED(dev);
|
534
|
+
}
|
535
|
+
|
536
|
+
static void ggml_backend_metal_device_get_props(ggml_backend_dev_t dev, ggml_backend_dev_props * props) {
|
537
|
+
props->name = ggml_backend_metal_device_get_name(dev);
|
538
|
+
props->description = ggml_backend_metal_device_get_description(dev);
|
539
|
+
props->type = ggml_backend_metal_device_get_type(dev);
|
540
|
+
|
541
|
+
ggml_backend_metal_device_get_memory(dev, &props->memory_free, &props->memory_total);
|
542
|
+
|
543
|
+
props->caps = {
|
544
|
+
/* .async = */ true,
|
545
|
+
/* .host_buffer = */ false,
|
546
|
+
/* .buffer_from_host_ptr = */ true,
|
547
|
+
/* .events = */ false,
|
548
|
+
};
|
549
|
+
}
|
550
|
+
|
551
|
+
static ggml_backend_t ggml_backend_metal_device_init(ggml_backend_dev_t dev, const char * params) {
|
552
|
+
ggml_metal_device_t ctx_dev = (ggml_metal_device_t)dev->context;
|
553
|
+
|
554
|
+
ggml_metal_t ctx = ggml_metal_init(ctx_dev);
|
555
|
+
if (ctx == NULL) {
|
556
|
+
GGML_LOG_ERROR("%s: error: failed to allocate context\n", __func__);
|
557
|
+
return NULL;
|
558
|
+
}
|
559
|
+
|
560
|
+
ggml_backend_t backend = (ggml_backend_t) malloc(sizeof(ggml_backend));
|
561
|
+
|
562
|
+
*backend = {
|
563
|
+
/* .guid = */ ggml_backend_metal_guid(),
|
564
|
+
/* .interface = */ ggml_backend_metal_i,
|
565
|
+
/* .device = */ dev,
|
566
|
+
/* .context = */ ctx,
|
567
|
+
};
|
568
|
+
|
569
|
+
ggml_backend_metal_set_n_cb(backend, 1);
|
570
|
+
|
571
|
+
return backend;
|
572
|
+
|
573
|
+
GGML_UNUSED(params);
|
574
|
+
}
|
575
|
+
|
576
|
+
static ggml_backend_buffer_type_t ggml_backend_metal_device_get_buffer_type(ggml_backend_dev_t dev) {
|
577
|
+
ggml_metal_device_t ctx_dev = (ggml_metal_device_t)dev->context;
|
578
|
+
|
579
|
+
const ggml_metal_device_props * props_dev = ggml_metal_device_get_props(ctx_dev);
|
580
|
+
|
581
|
+
return props_dev->use_shared_buffers ? ggml_backend_metal_buffer_type_shared() : ggml_backend_metal_buffer_type_private();
|
582
|
+
}
|
583
|
+
|
584
|
+
static ggml_backend_buffer_t ggml_backend_metal_device_buffer_mapped(ggml_backend_dev_t dev, void * ptr, size_t size, size_t max_tensor_size) {
|
585
|
+
ggml_metal_device_t ctx_dev = (ggml_metal_device_t)dev->context;
|
586
|
+
|
587
|
+
ggml_metal_buffer_t res = ggml_metal_buffer_map(ctx_dev, ptr, size, max_tensor_size);
|
588
|
+
|
589
|
+
return ggml_backend_buffer_init(ggml_backend_metal_buffer_type_mapped(), ggml_backend_metal_buffer_shared_i, res, size);
|
590
|
+
}
|
591
|
+
|
592
|
+
static bool ggml_backend_metal_device_supports_op(ggml_backend_dev_t dev, const ggml_tensor * op) {
|
593
|
+
ggml_metal_device_t ctx_dev = (ggml_metal_device_t)dev->context;
|
594
|
+
|
595
|
+
return ggml_metal_device_supports_op(ctx_dev, op);
|
596
|
+
}
|
597
|
+
|
598
|
+
static bool ggml_backend_metal_device_supports_buft(ggml_backend_dev_t dev, ggml_backend_buffer_type_t buft) {
|
599
|
+
return
|
600
|
+
buft->iface.get_name == ggml_backend_metal_buffer_type_shared_get_name ||
|
601
|
+
buft->iface.get_name == ggml_backend_metal_buffer_type_private_get_name ||
|
602
|
+
buft->iface.get_name == ggml_backend_metal_buffer_type_mapped_get_name;
|
603
|
+
|
604
|
+
GGML_UNUSED(dev);
|
605
|
+
}
|
606
|
+
|
607
|
+
static int64_t get_op_batch_size(const ggml_tensor * op) {
|
608
|
+
switch (op->op) {
|
609
|
+
case GGML_OP_MUL_MAT:
|
610
|
+
return op->ne[1];
|
611
|
+
case GGML_OP_MUL_MAT_ID:
|
612
|
+
return op->ne[2];
|
613
|
+
default:
|
614
|
+
return ggml_nrows(op);
|
615
|
+
}
|
616
|
+
}
|
617
|
+
|
618
|
+
static bool ggml_backend_metal_device_offload_op(ggml_backend_dev_t dev, const ggml_tensor * op) {
|
619
|
+
const int min_batch_size = 32;
|
620
|
+
|
621
|
+
return (op->op == GGML_OP_MUL_MAT ||
|
622
|
+
op->op == GGML_OP_MUL_MAT_ID) &&
|
623
|
+
get_op_batch_size(op) >= min_batch_size;
|
624
|
+
|
625
|
+
GGML_UNUSED(dev);
|
626
|
+
GGML_UNUSED(op);
|
627
|
+
}
|
628
|
+
|
629
|
+
static ggml_backend_device_i ggml_backend_metal_device_i = {
|
630
|
+
/* .get_name = */ ggml_backend_metal_device_get_name,
|
631
|
+
/* .get_description = */ ggml_backend_metal_device_get_description,
|
632
|
+
/* .get_memory = */ ggml_backend_metal_device_get_memory,
|
633
|
+
/* .get_type = */ ggml_backend_metal_device_get_type,
|
634
|
+
/* .get_props = */ ggml_backend_metal_device_get_props,
|
635
|
+
/* .init_backend = */ ggml_backend_metal_device_init,
|
636
|
+
/* .get_buffer_type = */ ggml_backend_metal_device_get_buffer_type,
|
637
|
+
/* .get_host_buffer_type = */ NULL,
|
638
|
+
/* .buffer_from_host_ptr = */ ggml_backend_metal_device_buffer_mapped,
|
639
|
+
/* .supports_op = */ ggml_backend_metal_device_supports_op,
|
640
|
+
/* .supports_buft = */ ggml_backend_metal_device_supports_buft,
|
641
|
+
/* .offload_op = */ ggml_backend_metal_device_offload_op,
|
642
|
+
/* .event_new = */ NULL,
|
643
|
+
/* .event_free = */ NULL,
|
644
|
+
/* .event_synchronize = */ NULL,
|
645
|
+
};
|
646
|
+
|
647
|
+
// backend registry
|
648
|
+
|
649
|
+
static const char * ggml_backend_metal_reg_get_name(ggml_backend_reg_t reg) {
|
650
|
+
return "Metal";
|
651
|
+
|
652
|
+
GGML_UNUSED(reg);
|
653
|
+
}
|
654
|
+
|
655
|
+
static size_t ggml_backend_metal_reg_device_count(ggml_backend_reg_t reg) {
|
656
|
+
return 1;
|
657
|
+
|
658
|
+
GGML_UNUSED(reg);
|
659
|
+
}
|
660
|
+
|
661
|
+
static ggml_backend_dev_t ggml_backend_metal_reg_device_get(ggml_backend_reg_t reg, size_t index) {
|
662
|
+
GGML_ASSERT(index == 0);
|
663
|
+
|
664
|
+
return &g_ggml_metal_device;
|
665
|
+
|
666
|
+
GGML_UNUSED(reg);
|
667
|
+
GGML_UNUSED(index);
|
668
|
+
}
|
669
|
+
|
670
|
+
static ggml_backend_feature g_ggml_backend_metal_features[] = {
|
671
|
+
#if defined(GGML_METAL_EMBED_LIBRARY)
|
672
|
+
{ "EMBED_LIBRARY", "1" },
|
673
|
+
#endif
|
674
|
+
{ NULL, NULL },
|
675
|
+
};
|
676
|
+
|
677
|
+
static ggml_backend_feature * ggml_backend_metal_get_features(ggml_backend_reg_t reg) {
|
678
|
+
return g_ggml_backend_metal_features;
|
679
|
+
|
680
|
+
GGML_UNUSED(reg);
|
681
|
+
}
|
682
|
+
|
683
|
+
static void * ggml_backend_metal_get_proc_address(ggml_backend_reg_t reg, const char * name) {
|
684
|
+
if (strcmp(name, "ggml_backend_get_features") == 0) {
|
685
|
+
return (void *)ggml_backend_metal_get_features;
|
686
|
+
}
|
687
|
+
|
688
|
+
return NULL;
|
689
|
+
|
690
|
+
GGML_UNUSED(reg);
|
691
|
+
}
|
692
|
+
|
693
|
+
static ggml_backend_reg_i ggml_backend_metal_reg_i = {
|
694
|
+
/* .get_name = */ ggml_backend_metal_reg_get_name,
|
695
|
+
/* .device_count = */ ggml_backend_metal_reg_device_count,
|
696
|
+
/* .device_get = */ ggml_backend_metal_reg_device_get,
|
697
|
+
/* .get_proc_address = */ ggml_backend_metal_get_proc_address,
|
698
|
+
};
|
699
|
+
|
700
|
+
ggml_backend_reg_t ggml_backend_metal_reg(void) {
|
701
|
+
{
|
702
|
+
g_ggml_metal_reg = {
|
703
|
+
/* .api_version = */ GGML_BACKEND_API_VERSION,
|
704
|
+
/* .iface = */ ggml_backend_metal_reg_i,
|
705
|
+
/* .context = */ NULL,
|
706
|
+
};
|
707
|
+
|
708
|
+
g_ggml_metal_device = {
|
709
|
+
/* .iface = */ ggml_backend_metal_device_i,
|
710
|
+
/* .reg = */ &g_ggml_metal_reg,
|
711
|
+
/* .context = */ ggml_metal_device_get(),
|
712
|
+
};
|
713
|
+
}
|
714
|
+
|
715
|
+
return &g_ggml_metal_reg;
|
716
|
+
}
|
717
|
+
|
718
|
+
GGML_BACKEND_DL_IMPL(ggml_backend_metal_reg)
|