local-llm-rn 1.0.0
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.
- package/cpp/CMakeLists.txt +285 -0
- package/cpp/common/CMakeLists.txt +149 -0
- package/cpp/common/arg.cpp +3799 -0
- package/cpp/common/arg.h +131 -0
- package/cpp/common/base64.hpp +392 -0
- package/cpp/common/build-info.cpp.in +4 -0
- package/cpp/common/chat-parser-xml-toolcall.cpp +879 -0
- package/cpp/common/chat-parser-xml-toolcall.h +45 -0
- package/cpp/common/chat-parser.cpp +1649 -0
- package/cpp/common/chat-parser.h +133 -0
- package/cpp/common/chat-peg-parser.cpp +124 -0
- package/cpp/common/chat-peg-parser.h +105 -0
- package/cpp/common/chat.cpp +3355 -0
- package/cpp/common/chat.h +252 -0
- package/cpp/common/common.cpp +1824 -0
- package/cpp/common/common.h +930 -0
- package/cpp/common/console.cpp +1137 -0
- package/cpp/common/console.h +41 -0
- package/cpp/common/debug.cpp +167 -0
- package/cpp/common/debug.h +43 -0
- package/cpp/common/download.cpp +792 -0
- package/cpp/common/download.h +84 -0
- package/cpp/common/http.h +84 -0
- package/cpp/common/jinja/README.md +88 -0
- package/cpp/common/jinja/caps.cpp +285 -0
- package/cpp/common/jinja/caps.h +30 -0
- package/cpp/common/jinja/lexer.cpp +341 -0
- package/cpp/common/jinja/lexer.h +157 -0
- package/cpp/common/jinja/parser.cpp +591 -0
- package/cpp/common/jinja/parser.h +21 -0
- package/cpp/common/jinja/runtime.cpp +867 -0
- package/cpp/common/jinja/runtime.h +638 -0
- package/cpp/common/jinja/string.cpp +213 -0
- package/cpp/common/jinja/string.h +61 -0
- package/cpp/common/jinja/utils.h +149 -0
- package/cpp/common/jinja/value.cpp +1393 -0
- package/cpp/common/jinja/value.h +756 -0
- package/cpp/common/json-partial.cpp +324 -0
- package/cpp/common/json-partial.h +39 -0
- package/cpp/common/json-schema-to-grammar.cpp +1153 -0
- package/cpp/common/json-schema-to-grammar.h +43 -0
- package/cpp/common/llguidance.cpp +258 -0
- package/cpp/common/log.cpp +446 -0
- package/cpp/common/log.h +119 -0
- package/cpp/common/ngram-cache.cpp +285 -0
- package/cpp/common/ngram-cache.h +101 -0
- package/cpp/common/ngram-map.cpp +530 -0
- package/cpp/common/ngram-map.h +115 -0
- package/cpp/common/ngram-mod.cpp +60 -0
- package/cpp/common/ngram-mod.h +38 -0
- package/cpp/common/peg-parser.cpp +1712 -0
- package/cpp/common/peg-parser.h +459 -0
- package/cpp/common/preset.cpp +483 -0
- package/cpp/common/preset.h +83 -0
- package/cpp/common/regex-partial.cpp +204 -0
- package/cpp/common/regex-partial.h +56 -0
- package/cpp/common/sampling.cpp +745 -0
- package/cpp/common/sampling.h +119 -0
- package/cpp/common/speculative.cpp +1074 -0
- package/cpp/common/speculative.h +41 -0
- package/cpp/common/unicode.cpp +64 -0
- package/cpp/common/unicode.h +22 -0
- package/cpp/ggml/CMakeLists.txt +494 -0
- package/cpp/ggml/cmake/GitVars.cmake +22 -0
- package/cpp/ggml/cmake/common.cmake +50 -0
- package/cpp/ggml/cmake/ggml-config.cmake.in +191 -0
- package/cpp/ggml/include/ggml-alloc.h +85 -0
- package/cpp/ggml/include/ggml-backend.h +373 -0
- package/cpp/ggml/include/ggml-blas.h +25 -0
- package/cpp/ggml/include/ggml-cann.h +123 -0
- package/cpp/ggml/include/ggml-cpp.h +39 -0
- package/cpp/ggml/include/ggml-cpu.h +151 -0
- package/cpp/ggml/include/ggml-cuda.h +47 -0
- package/cpp/ggml/include/ggml-hexagon.h +19 -0
- package/cpp/ggml/include/ggml-metal.h +61 -0
- package/cpp/ggml/include/ggml-opencl.h +26 -0
- package/cpp/ggml/include/ggml-opt.h +256 -0
- package/cpp/ggml/include/ggml-rpc.h +30 -0
- package/cpp/ggml/include/ggml-sycl.h +49 -0
- package/cpp/ggml/include/ggml-virtgpu.h +14 -0
- package/cpp/ggml/include/ggml-vulkan.h +29 -0
- package/cpp/ggml/include/ggml-webgpu.h +19 -0
- package/cpp/ggml/include/ggml-zdnn.h +17 -0
- package/cpp/ggml/include/ggml-zendnn.h +22 -0
- package/cpp/ggml/include/ggml.h +2753 -0
- package/cpp/ggml/include/gguf.h +204 -0
- package/cpp/ggml/src/CMakeLists.txt +492 -0
- package/cpp/ggml/src/ggml-alloc.c +1244 -0
- package/cpp/ggml/src/ggml-backend-dl.cpp +48 -0
- package/cpp/ggml/src/ggml-backend-dl.h +45 -0
- package/cpp/ggml/src/ggml-backend-impl.h +255 -0
- package/cpp/ggml/src/ggml-backend-reg.cpp +566 -0
- package/cpp/ggml/src/ggml-backend.cpp +2270 -0
- package/cpp/ggml/src/ggml-blas/CMakeLists.txt +101 -0
- package/cpp/ggml/src/ggml-blas/ggml-blas.cpp +518 -0
- package/cpp/ggml/src/ggml-common.h +1878 -0
- package/cpp/ggml/src/ggml-cpu/CMakeLists.txt +691 -0
- package/cpp/ggml/src/ggml-cpu/amx/amx.cpp +247 -0
- package/cpp/ggml/src/ggml-cpu/amx/amx.h +8 -0
- package/cpp/ggml/src/ggml-cpu/amx/common.h +91 -0
- package/cpp/ggml/src/ggml-cpu/amx/mmq.cpp +2512 -0
- package/cpp/ggml/src/ggml-cpu/amx/mmq.h +10 -0
- package/cpp/ggml/src/ggml-cpu/arch/arm/cpu-feats.cpp +98 -0
- package/cpp/ggml/src/ggml-cpu/arch/arm/quants.c +4052 -0
- package/cpp/ggml/src/ggml-cpu/arch/arm/repack.cpp +4935 -0
- package/cpp/ggml/src/ggml-cpu/arch/loongarch/quants.c +2159 -0
- package/cpp/ggml/src/ggml-cpu/arch/powerpc/cpu-feats.cpp +82 -0
- package/cpp/ggml/src/ggml-cpu/arch/powerpc/quants.c +2305 -0
- package/cpp/ggml/src/ggml-cpu/arch/riscv/cpu-feats.cpp +38 -0
- package/cpp/ggml/src/ggml-cpu/arch/riscv/quants.c +2726 -0
- package/cpp/ggml/src/ggml-cpu/arch/riscv/repack.cpp +342 -0
- package/cpp/ggml/src/ggml-cpu/arch/s390/cpu-feats.cpp +50 -0
- package/cpp/ggml/src/ggml-cpu/arch/s390/quants.c +1468 -0
- package/cpp/ggml/src/ggml-cpu/arch/wasm/quants.c +1221 -0
- package/cpp/ggml/src/ggml-cpu/arch/x86/cpu-feats.cpp +327 -0
- package/cpp/ggml/src/ggml-cpu/arch/x86/quants.c +3820 -0
- package/cpp/ggml/src/ggml-cpu/arch/x86/repack.cpp +6307 -0
- package/cpp/ggml/src/ggml-cpu/arch-fallback.h +313 -0
- package/cpp/ggml/src/ggml-cpu/binary-ops.cpp +154 -0
- package/cpp/ggml/src/ggml-cpu/binary-ops.h +16 -0
- package/cpp/ggml/src/ggml-cpu/cmake/FindSIMD.cmake +100 -0
- package/cpp/ggml/src/ggml-cpu/common.h +95 -0
- package/cpp/ggml/src/ggml-cpu/ggml-cpu-impl.h +529 -0
- package/cpp/ggml/src/ggml-cpu/ggml-cpu.c +3734 -0
- package/cpp/ggml/src/ggml-cpu/ggml-cpu.cpp +701 -0
- package/cpp/ggml/src/ggml-cpu/hbm.cpp +55 -0
- package/cpp/ggml/src/ggml-cpu/hbm.h +8 -0
- package/cpp/ggml/src/ggml-cpu/kleidiai/kernels.cpp +938 -0
- package/cpp/ggml/src/ggml-cpu/kleidiai/kernels.h +90 -0
- package/cpp/ggml/src/ggml-cpu/kleidiai/kleidiai.cpp +798 -0
- package/cpp/ggml/src/ggml-cpu/kleidiai/kleidiai.h +17 -0
- package/cpp/ggml/src/ggml-cpu/llamafile/sgemm.cpp +4033 -0
- package/cpp/ggml/src/ggml-cpu/llamafile/sgemm.h +25 -0
- package/cpp/ggml/src/ggml-cpu/ops.cpp +10978 -0
- package/cpp/ggml/src/ggml-cpu/ops.h +116 -0
- package/cpp/ggml/src/ggml-cpu/quants.c +1193 -0
- package/cpp/ggml/src/ggml-cpu/quants.h +97 -0
- package/cpp/ggml/src/ggml-cpu/repack.cpp +3316 -0
- package/cpp/ggml/src/ggml-cpu/repack.h +173 -0
- package/cpp/ggml/src/ggml-cpu/simd-gemm.h +136 -0
- package/cpp/ggml/src/ggml-cpu/simd-mappings.h +1279 -0
- package/cpp/ggml/src/ggml-cpu/spacemit/ime.cpp +1025 -0
- package/cpp/ggml/src/ggml-cpu/spacemit/ime.h +13 -0
- package/cpp/ggml/src/ggml-cpu/spacemit/ime1_kernels.cpp +3196 -0
- package/cpp/ggml/src/ggml-cpu/spacemit/ime_kernels.h +26 -0
- package/cpp/ggml/src/ggml-cpu/traits.cpp +36 -0
- package/cpp/ggml/src/ggml-cpu/traits.h +38 -0
- package/cpp/ggml/src/ggml-cpu/unary-ops.cpp +337 -0
- package/cpp/ggml/src/ggml-cpu/unary-ops.h +35 -0
- package/cpp/ggml/src/ggml-cpu/vec.cpp +629 -0
- package/cpp/ggml/src/ggml-cpu/vec.h +1585 -0
- package/cpp/ggml/src/ggml-hexagon/CMakeLists.txt +117 -0
- package/cpp/ggml/src/ggml-hexagon/ggml-hexagon.cpp +3232 -0
- package/cpp/ggml/src/ggml-hexagon/htp/CMakeLists.txt +45 -0
- package/cpp/ggml/src/ggml-hexagon/htp/act-ops.c +815 -0
- package/cpp/ggml/src/ggml-hexagon/htp/argsort-ops.c +281 -0
- package/cpp/ggml/src/ggml-hexagon/htp/binary-ops.c +827 -0
- package/cpp/ggml/src/ggml-hexagon/htp/cmake-toolchain.cmake +157 -0
- package/cpp/ggml/src/ggml-hexagon/htp/cpy-ops.c +251 -0
- package/cpp/ggml/src/ggml-hexagon/htp/flash-attn-ops.c +666 -0
- package/cpp/ggml/src/ggml-hexagon/htp/get-rows-ops.c +111 -0
- package/cpp/ggml/src/ggml-hexagon/htp/hex-dma.c +63 -0
- package/cpp/ggml/src/ggml-hexagon/htp/hex-dma.h +182 -0
- package/cpp/ggml/src/ggml-hexagon/htp/hex-dump.h +77 -0
- package/cpp/ggml/src/ggml-hexagon/htp/hex-fastdiv.h +37 -0
- package/cpp/ggml/src/ggml-hexagon/htp/hex-utils.h +51 -0
- package/cpp/ggml/src/ggml-hexagon/htp/htp-ctx.h +35 -0
- package/cpp/ggml/src/ggml-hexagon/htp/htp-msg.h +154 -0
- package/cpp/ggml/src/ggml-hexagon/htp/htp-ops.h +65 -0
- package/cpp/ggml/src/ggml-hexagon/htp/htp_iface.idl +16 -0
- package/cpp/ggml/src/ggml-hexagon/htp/hvx-arith.h +470 -0
- package/cpp/ggml/src/ggml-hexagon/htp/hvx-base.h +173 -0
- package/cpp/ggml/src/ggml-hexagon/htp/hvx-copy.h +245 -0
- package/cpp/ggml/src/ggml-hexagon/htp/hvx-div.h +116 -0
- package/cpp/ggml/src/ggml-hexagon/htp/hvx-dump.h +129 -0
- package/cpp/ggml/src/ggml-hexagon/htp/hvx-exp.h +215 -0
- package/cpp/ggml/src/ggml-hexagon/htp/hvx-floor.h +100 -0
- package/cpp/ggml/src/ggml-hexagon/htp/hvx-inverse.h +176 -0
- package/cpp/ggml/src/ggml-hexagon/htp/hvx-reduce.h +266 -0
- package/cpp/ggml/src/ggml-hexagon/htp/hvx-scale.h +133 -0
- package/cpp/ggml/src/ggml-hexagon/htp/hvx-sigmoid.h +141 -0
- package/cpp/ggml/src/ggml-hexagon/htp/hvx-sqrt.h +126 -0
- package/cpp/ggml/src/ggml-hexagon/htp/hvx-types.h +36 -0
- package/cpp/ggml/src/ggml-hexagon/htp/hvx-utils.h +18 -0
- package/cpp/ggml/src/ggml-hexagon/htp/main.c +1150 -0
- package/cpp/ggml/src/ggml-hexagon/htp/matmul-ops.c +2595 -0
- package/cpp/ggml/src/ggml-hexagon/htp/rope-ops.c +498 -0
- package/cpp/ggml/src/ggml-hexagon/htp/set-rows-ops.c +167 -0
- package/cpp/ggml/src/ggml-hexagon/htp/softmax-ops.c +421 -0
- package/cpp/ggml/src/ggml-hexagon/htp/sum-rows-ops.c +130 -0
- package/cpp/ggml/src/ggml-hexagon/htp/unary-ops.c +384 -0
- package/cpp/ggml/src/ggml-hexagon/htp/worker-pool.c +293 -0
- package/cpp/ggml/src/ggml-hexagon/htp/worker-pool.h +57 -0
- package/cpp/ggml/src/ggml-hexagon/htp-drv.cpp +418 -0
- package/cpp/ggml/src/ggml-hexagon/htp-drv.h +121 -0
- package/cpp/ggml/src/ggml-hexagon/libdl.h +79 -0
- package/cpp/ggml/src/ggml-hexagon/libggml-htp.inf +38 -0
- package/cpp/ggml/src/ggml-hexagon/op-desc.h +153 -0
- package/cpp/ggml/src/ggml-impl.h +724 -0
- package/cpp/ggml/src/ggml-metal/CMakeLists.txt +124 -0
- package/cpp/ggml/src/ggml-metal/ggml-metal-common.cpp +457 -0
- package/cpp/ggml/src/ggml-metal/ggml-metal-common.h +52 -0
- package/cpp/ggml/src/ggml-metal/ggml-metal-context.h +41 -0
- package/cpp/ggml/src/ggml-metal/ggml-metal-context.m +702 -0
- package/cpp/ggml/src/ggml-metal/ggml-metal-device.cpp +1890 -0
- package/cpp/ggml/src/ggml-metal/ggml-metal-device.h +290 -0
- package/cpp/ggml/src/ggml-metal/ggml-metal-device.m +1749 -0
- package/cpp/ggml/src/ggml-metal/ggml-metal-impl.h +1054 -0
- package/cpp/ggml/src/ggml-metal/ggml-metal-ops.cpp +4370 -0
- package/cpp/ggml/src/ggml-metal/ggml-metal-ops.h +94 -0
- package/cpp/ggml/src/ggml-metal/ggml-metal.cpp +937 -0
- package/cpp/ggml/src/ggml-metal/ggml-metal.metal +9819 -0
- package/cpp/ggml/src/ggml-musa/CMakeLists.txt +125 -0
- package/cpp/ggml/src/ggml-musa/mudnn.cu +112 -0
- package/cpp/ggml/src/ggml-musa/mudnn.cuh +12 -0
- package/cpp/ggml/src/ggml-opencl/CMakeLists.txt +150 -0
- package/cpp/ggml/src/ggml-opencl/ggml-opencl.cpp +11553 -0
- package/cpp/ggml/src/ggml-opencl/kernels/add.cl +190 -0
- package/cpp/ggml/src/ggml-opencl/kernels/add_id.cl +42 -0
- package/cpp/ggml/src/ggml-opencl/kernels/argsort.cl +86 -0
- package/cpp/ggml/src/ggml-opencl/kernels/clamp.cl +20 -0
- package/cpp/ggml/src/ggml-opencl/kernels/concat.cl +51 -0
- package/cpp/ggml/src/ggml-opencl/kernels/conv2d.cl +185 -0
- package/cpp/ggml/src/ggml-opencl/kernels/conv2d_f16_f32.cl +176 -0
- package/cpp/ggml/src/ggml-opencl/kernels/cpy.cl +184 -0
- package/cpp/ggml/src/ggml-opencl/kernels/cvt.cl +417 -0
- package/cpp/ggml/src/ggml-opencl/kernels/diag_mask_inf.cl +58 -0
- package/cpp/ggml/src/ggml-opencl/kernels/div.cl +138 -0
- package/cpp/ggml/src/ggml-opencl/kernels/embed_kernel.py +26 -0
- package/cpp/ggml/src/ggml-opencl/kernels/expm1.cl +113 -0
- package/cpp/ggml/src/ggml-opencl/kernels/fill.cl +17 -0
- package/cpp/ggml/src/ggml-opencl/kernels/flash_attn_f16.cl +370 -0
- package/cpp/ggml/src/ggml-opencl/kernels/flash_attn_f32.cl +371 -0
- package/cpp/ggml/src/ggml-opencl/kernels/flash_attn_f32_f16.cl +373 -0
- package/cpp/ggml/src/ggml-opencl/kernels/gelu.cl +89 -0
- package/cpp/ggml/src/ggml-opencl/kernels/gemm_moe_mxfp4_f32.cl +162 -0
- package/cpp/ggml/src/ggml-opencl/kernels/gemv_moe_mxfp4_f32.cl +156 -0
- package/cpp/ggml/src/ggml-opencl/kernels/gemv_noshuffle.cl +268 -0
- package/cpp/ggml/src/ggml-opencl/kernels/gemv_noshuffle_general.cl +274 -0
- package/cpp/ggml/src/ggml-opencl/kernels/gemv_noshuffle_general_q8_0_f32.cl +195 -0
- package/cpp/ggml/src/ggml-opencl/kernels/get_rows.cl +187 -0
- package/cpp/ggml/src/ggml-opencl/kernels/glu.cl +378 -0
- package/cpp/ggml/src/ggml-opencl/kernels/group_norm.cl +121 -0
- package/cpp/ggml/src/ggml-opencl/kernels/im2col_f16.cl +57 -0
- package/cpp/ggml/src/ggml-opencl/kernels/im2col_f32.cl +57 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mean.cl +140 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul.cl +152 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mat_Ab_Bi_8x4.cl +139 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mat_f16_f32.cl +130 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mm_f16_f32_kq_kqv.cl +273 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mm_f16_f32_l4_lm.cl +146 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mm_f32_f32_l4_lm.cl +147 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mm_q4_0_f32_l4_lm.cl +163 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mm_q4_1_f32_l4_lm.cl +165 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mm_q6_k_f32_l4_lm.cl +158 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mm_q8_0_f32_8x4.cl +129 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mm_q8_0_f32_l4_lm.cl +154 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_f16_f16.cl +118 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_f16_f32.cl +118 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_f16_f32_1row.cl +94 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_f16_f32_l4.cl +84 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_f32_f32.cl +118 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_id_mxfp4_f32.cl +189 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_id_mxfp4_f32_flat.cl +176 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_id_q4_0_f32_8x_flat.cl +283 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_id_q8_0_f32.cl +140 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_id_q8_0_f32_flat.cl +222 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_mxfp4_f32.cl +144 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_mxfp4_f32_flat.cl +167 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q4_0_f32.cl +192 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q4_0_f32_1d_16x_flat.cl +307 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q4_0_f32_1d_8x_flat.cl +265 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q4_0_f32_8x_flat.cl +272 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q4_0_f32_v.cl +254 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q4_1_f32.cl +219 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q4_1_f32_flat.cl +229 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q4_k_f32.cl +180 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q6_k_f32.cl +194 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q6_k_f32_flat.cl +194 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q8_0_f32.cl +125 -0
- package/cpp/ggml/src/ggml-opencl/kernels/mul_mv_q8_0_f32_flat.cl +202 -0
- package/cpp/ggml/src/ggml-opencl/kernels/norm.cl +161 -0
- package/cpp/ggml/src/ggml-opencl/kernels/pad.cl +39 -0
- package/cpp/ggml/src/ggml-opencl/kernels/relu.cl +16 -0
- package/cpp/ggml/src/ggml-opencl/kernels/repeat.cl +38 -0
- package/cpp/ggml/src/ggml-opencl/kernels/rms_norm.cl +190 -0
- package/cpp/ggml/src/ggml-opencl/kernels/rope.cl +747 -0
- package/cpp/ggml/src/ggml-opencl/kernels/scale.cl +27 -0
- package/cpp/ggml/src/ggml-opencl/kernels/set_rows.cl +208 -0
- package/cpp/ggml/src/ggml-opencl/kernels/sigmoid.cl +29 -0
- package/cpp/ggml/src/ggml-opencl/kernels/silu.cl +30 -0
- package/cpp/ggml/src/ggml-opencl/kernels/softmax_4_f16.cl +108 -0
- package/cpp/ggml/src/ggml-opencl/kernels/softmax_4_f32.cl +108 -0
- package/cpp/ggml/src/ggml-opencl/kernels/softmax_f16.cl +107 -0
- package/cpp/ggml/src/ggml-opencl/kernels/softmax_f32.cl +107 -0
- package/cpp/ggml/src/ggml-opencl/kernels/softplus.cl +116 -0
- package/cpp/ggml/src/ggml-opencl/kernels/solve_tri.cl +51 -0
- package/cpp/ggml/src/ggml-opencl/kernels/sqr.cl +53 -0
- package/cpp/ggml/src/ggml-opencl/kernels/sqrt.cl +53 -0
- package/cpp/ggml/src/ggml-opencl/kernels/ssm_conv.cl +77 -0
- package/cpp/ggml/src/ggml-opencl/kernels/sub.cl +138 -0
- package/cpp/ggml/src/ggml-opencl/kernels/sum_rows.cl +140 -0
- package/cpp/ggml/src/ggml-opencl/kernels/tanh.cl +109 -0
- package/cpp/ggml/src/ggml-opencl/kernels/transpose.cl +117 -0
- package/cpp/ggml/src/ggml-opencl/kernels/tri.cl +32 -0
- package/cpp/ggml/src/ggml-opencl/kernels/tsembd.cl +48 -0
- package/cpp/ggml/src/ggml-opencl/kernels/upscale.cl +120 -0
- package/cpp/ggml/src/ggml-opt.cpp +1093 -0
- package/cpp/ggml/src/ggml-quants.c +5325 -0
- package/cpp/ggml/src/ggml-quants.h +106 -0
- package/cpp/ggml/src/ggml-rpc/CMakeLists.txt +9 -0
- package/cpp/ggml/src/ggml-rpc/ggml-rpc.cpp +2118 -0
- package/cpp/ggml/src/ggml-threading.cpp +12 -0
- package/cpp/ggml/src/ggml-threading.h +14 -0
- package/cpp/ggml/src/ggml-virtgpu/CMakeLists.txt +70 -0
- package/cpp/ggml/src/ggml-virtgpu/apir_cs_ggml-rpc-front.cpp +87 -0
- package/cpp/ggml/src/ggml-virtgpu/backend/CMakeLists.txt +21 -0
- package/cpp/ggml/src/ggml-virtgpu/backend/apir_cs_ggml-rpc-back.cpp +115 -0
- package/cpp/ggml/src/ggml-virtgpu/backend/backend-convert.h +13 -0
- package/cpp/ggml/src/ggml-virtgpu/backend/backend-dispatched-backend.cpp +102 -0
- package/cpp/ggml/src/ggml-virtgpu/backend/backend-dispatched-buffer-type.cpp +105 -0
- package/cpp/ggml/src/ggml-virtgpu/backend/backend-dispatched-buffer.cpp +179 -0
- package/cpp/ggml/src/ggml-virtgpu/backend/backend-dispatched-device.cpp +148 -0
- package/cpp/ggml/src/ggml-virtgpu/backend/backend-dispatched.cpp +51 -0
- package/cpp/ggml/src/ggml-virtgpu/backend/backend-dispatched.gen.h +73 -0
- package/cpp/ggml/src/ggml-virtgpu/backend/backend-dispatched.h +27 -0
- package/cpp/ggml/src/ggml-virtgpu/backend/backend-virgl-apir.h +32 -0
- package/cpp/ggml/src/ggml-virtgpu/backend/backend.cpp +144 -0
- package/cpp/ggml/src/ggml-virtgpu/backend/shared/api_remoting.h +95 -0
- package/cpp/ggml/src/ggml-virtgpu/backend/shared/apir_backend.gen.h +94 -0
- package/cpp/ggml/src/ggml-virtgpu/backend/shared/apir_backend.h +50 -0
- package/cpp/ggml/src/ggml-virtgpu/backend/shared/apir_cs.h +378 -0
- package/cpp/ggml/src/ggml-virtgpu/backend/shared/apir_cs_ggml.h +232 -0
- package/cpp/ggml/src/ggml-virtgpu/backend/shared/apir_cs_rpc.h +58 -0
- package/cpp/ggml/src/ggml-virtgpu/ggml-backend-buffer-type.cpp +81 -0
- package/cpp/ggml/src/ggml-virtgpu/ggml-backend-buffer.cpp +119 -0
- package/cpp/ggml/src/ggml-virtgpu/ggml-backend-device.cpp +158 -0
- package/cpp/ggml/src/ggml-virtgpu/ggml-backend-reg.cpp +213 -0
- package/cpp/ggml/src/ggml-virtgpu/ggml-backend.cpp +69 -0
- package/cpp/ggml/src/ggml-virtgpu/ggml-remoting.h +71 -0
- package/cpp/ggml/src/ggml-virtgpu/ggmlremoting_functions.yaml +166 -0
- package/cpp/ggml/src/ggml-virtgpu/include/apir_hw.h +9 -0
- package/cpp/ggml/src/ggml-virtgpu/regenerate_remoting.py +333 -0
- package/cpp/ggml/src/ggml-virtgpu/virtgpu-apir.h +15 -0
- package/cpp/ggml/src/ggml-virtgpu/virtgpu-forward-backend.cpp +58 -0
- package/cpp/ggml/src/ggml-virtgpu/virtgpu-forward-buffer-type.cpp +110 -0
- package/cpp/ggml/src/ggml-virtgpu/virtgpu-forward-buffer.cpp +173 -0
- package/cpp/ggml/src/ggml-virtgpu/virtgpu-forward-device.cpp +192 -0
- package/cpp/ggml/src/ggml-virtgpu/virtgpu-forward-impl.h +36 -0
- package/cpp/ggml/src/ggml-virtgpu/virtgpu-forward.gen.h +53 -0
- package/cpp/ggml/src/ggml-virtgpu/virtgpu-shm.cpp +98 -0
- package/cpp/ggml/src/ggml-virtgpu/virtgpu-shm.h +23 -0
- package/cpp/ggml/src/ggml-virtgpu/virtgpu-utils.cpp +179 -0
- package/cpp/ggml/src/ggml-virtgpu/virtgpu-utils.h +86 -0
- package/cpp/ggml/src/ggml-virtgpu/virtgpu.cpp +544 -0
- package/cpp/ggml/src/ggml-virtgpu/virtgpu.h +117 -0
- package/cpp/ggml/src/ggml-webgpu/CMakeLists.txt +80 -0
- package/cpp/ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp +1231 -0
- package/cpp/ggml/src/ggml-webgpu/ggml-webgpu.cpp +3150 -0
- package/cpp/ggml/src/ggml-webgpu/pre_wgsl.hpp +778 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/argmax.wgsl +72 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/argsort.wgsl +106 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/argsort_merge.wgsl +134 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/binary.wgsl +107 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/common_decls.tmpl +923 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/cpy.tmpl.wgsl +107 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/cumsum.wgsl +66 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/embed_wgsl.py +182 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn.wgsl +636 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/get_rows.wgsl +668 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/glu.tmpl.wgsl +323 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/memset.wgsl +40 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat.wgsl +713 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_decls.tmpl +103 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_reg_tile.wgsl +138 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_subgroup_matrix.wgsl +188 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec.wgsl +194 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/pad.wgsl +86 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/rms_norm.wgsl +123 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/rope.tmpl.wgsl +295 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/scale.wgsl +63 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/set_rows.wgsl +109 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/soft_max.tmpl.wgsl +345 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/sum_rows.wgsl +55 -0
- package/cpp/ggml/src/ggml-webgpu/wgsl-shaders/unary.wgsl +193 -0
- package/cpp/ggml/src/ggml-zdnn/CMakeLists.txt +36 -0
- package/cpp/ggml/src/ggml-zdnn/common.hpp +59 -0
- package/cpp/ggml/src/ggml-zdnn/ggml-zdnn.cpp +633 -0
- package/cpp/ggml/src/ggml-zdnn/mmf.cpp +80 -0
- package/cpp/ggml/src/ggml-zdnn/mmf.hpp +12 -0
- package/cpp/ggml/src/ggml-zdnn/utils.cpp +79 -0
- package/cpp/ggml/src/ggml-zdnn/utils.hpp +19 -0
- package/cpp/ggml/src/ggml-zendnn/CMakeLists.txt +92 -0
- package/cpp/ggml/src/ggml-zendnn/ggml-zendnn.cpp +469 -0
- package/cpp/ggml/src/ggml.c +7669 -0
- package/cpp/ggml/src/ggml.cpp +26 -0
- package/cpp/ggml/src/gguf.cpp +1699 -0
- package/cpp/include/llama-cpp.h +32 -0
- package/cpp/include/llama.h +1568 -0
- package/cpp/mtmd/CMakeLists.txt +98 -0
- package/cpp/mtmd/README.md +63 -0
- package/cpp/mtmd/clip-graph.h +117 -0
- package/cpp/mtmd/clip-impl.h +586 -0
- package/cpp/mtmd/clip-model.h +390 -0
- package/cpp/mtmd/clip.cpp +4154 -0
- package/cpp/mtmd/clip.h +121 -0
- package/cpp/mtmd/deprecation-warning.cpp +22 -0
- package/cpp/mtmd/legacy-models/convert_image_encoder_to_gguf.py +412 -0
- package/cpp/mtmd/legacy-models/glmedge-convert-image-encoder-to-gguf.py +280 -0
- package/cpp/mtmd/legacy-models/glmedge-surgery.py +33 -0
- package/cpp/mtmd/legacy-models/llava_surgery.py +38 -0
- package/cpp/mtmd/legacy-models/llava_surgery_v2.py +180 -0
- package/cpp/mtmd/legacy-models/minicpmv-convert-image-encoder-to-gguf.py +892 -0
- package/cpp/mtmd/legacy-models/minicpmv-surgery.py +47 -0
- package/cpp/mtmd/models/cogvlm.cpp +98 -0
- package/cpp/mtmd/models/conformer.cpp +216 -0
- package/cpp/mtmd/models/glm4v.cpp +122 -0
- package/cpp/mtmd/models/internvl.cpp +69 -0
- package/cpp/mtmd/models/kimik25.cpp +101 -0
- package/cpp/mtmd/models/kimivl.cpp +63 -0
- package/cpp/mtmd/models/llama4.cpp +96 -0
- package/cpp/mtmd/models/llava.cpp +374 -0
- package/cpp/mtmd/models/minicpmv.cpp +114 -0
- package/cpp/mtmd/models/mobilenetv5.cpp +451 -0
- package/cpp/mtmd/models/models.h +128 -0
- package/cpp/mtmd/models/nemotron-v2-vl.cpp +35 -0
- package/cpp/mtmd/models/paddleocr.cpp +52 -0
- package/cpp/mtmd/models/pixtral.cpp +86 -0
- package/cpp/mtmd/models/qwen2vl.cpp +183 -0
- package/cpp/mtmd/models/qwen3vl.cpp +193 -0
- package/cpp/mtmd/models/siglip.cpp +86 -0
- package/cpp/mtmd/models/whisper-enc.cpp +115 -0
- package/cpp/mtmd/models/youtuvl.cpp +179 -0
- package/cpp/mtmd/mtmd-audio.cpp +730 -0
- package/cpp/mtmd/mtmd-audio.h +113 -0
- package/cpp/mtmd/mtmd-cli.cpp +437 -0
- package/cpp/mtmd/mtmd-helper.cpp +521 -0
- package/cpp/mtmd/mtmd-helper.h +96 -0
- package/cpp/mtmd/mtmd.cpp +1156 -0
- package/cpp/mtmd/mtmd.h +319 -0
- package/cpp/mtmd/requirements.txt +5 -0
- package/cpp/mtmd/test-1.jpeg +0 -0
- package/cpp/mtmd/test-2.mp3 +0 -0
- package/cpp/mtmd/tests.sh +192 -0
- package/cpp/src/CMakeLists.txt +169 -0
- package/cpp/src/llama-adapter.cpp +488 -0
- package/cpp/src/llama-adapter.h +89 -0
- package/cpp/src/llama-arch.cpp +2855 -0
- package/cpp/src/llama-arch.h +619 -0
- package/cpp/src/llama-batch.cpp +917 -0
- package/cpp/src/llama-batch.h +173 -0
- package/cpp/src/llama-chat.cpp +896 -0
- package/cpp/src/llama-chat.h +71 -0
- package/cpp/src/llama-context.cpp +3512 -0
- package/cpp/src/llama-context.h +359 -0
- package/cpp/src/llama-cparams.cpp +5 -0
- package/cpp/src/llama-cparams.h +44 -0
- package/cpp/src/llama-grammar.cpp +1464 -0
- package/cpp/src/llama-grammar.h +194 -0
- package/cpp/src/llama-graph.cpp +2685 -0
- package/cpp/src/llama-graph.h +1026 -0
- package/cpp/src/llama-hparams.cpp +234 -0
- package/cpp/src/llama-hparams.h +339 -0
- package/cpp/src/llama-impl.cpp +171 -0
- package/cpp/src/llama-impl.h +73 -0
- package/cpp/src/llama-io.cpp +15 -0
- package/cpp/src/llama-io.h +35 -0
- package/cpp/src/llama-kv-cache-iswa.cpp +330 -0
- package/cpp/src/llama-kv-cache-iswa.h +137 -0
- package/cpp/src/llama-kv-cache.cpp +2271 -0
- package/cpp/src/llama-kv-cache.h +388 -0
- package/cpp/src/llama-kv-cells.h +533 -0
- package/cpp/src/llama-memory-hybrid-iswa.cpp +275 -0
- package/cpp/src/llama-memory-hybrid-iswa.h +140 -0
- package/cpp/src/llama-memory-hybrid.cpp +268 -0
- package/cpp/src/llama-memory-hybrid.h +139 -0
- package/cpp/src/llama-memory-recurrent.cpp +1165 -0
- package/cpp/src/llama-memory-recurrent.h +182 -0
- package/cpp/src/llama-memory.cpp +59 -0
- package/cpp/src/llama-memory.h +122 -0
- package/cpp/src/llama-mmap.cpp +785 -0
- package/cpp/src/llama-mmap.h +92 -0
- package/cpp/src/llama-model-loader.cpp +1414 -0
- package/cpp/src/llama-model-loader.h +203 -0
- package/cpp/src/llama-model-saver.cpp +286 -0
- package/cpp/src/llama-model-saver.h +37 -0
- package/cpp/src/llama-model.cpp +9253 -0
- package/cpp/src/llama-model.h +576 -0
- package/cpp/src/llama-quant.cpp +1119 -0
- package/cpp/src/llama-quant.h +1 -0
- package/cpp/src/llama-sampler.cpp +3885 -0
- package/cpp/src/llama-sampler.h +42 -0
- package/cpp/src/llama-vocab.cpp +3970 -0
- package/cpp/src/llama-vocab.h +187 -0
- package/cpp/src/llama.cpp +1313 -0
- package/cpp/src/models/afmoe.cpp +191 -0
- package/cpp/src/models/apertus.cpp +125 -0
- package/cpp/src/models/arcee.cpp +135 -0
- package/cpp/src/models/arctic.cpp +138 -0
- package/cpp/src/models/arwkv7.cpp +86 -0
- package/cpp/src/models/baichuan.cpp +122 -0
- package/cpp/src/models/bailingmoe.cpp +144 -0
- package/cpp/src/models/bailingmoe2.cpp +135 -0
- package/cpp/src/models/bert.cpp +178 -0
- package/cpp/src/models/bitnet.cpp +160 -0
- package/cpp/src/models/bloom.cpp +101 -0
- package/cpp/src/models/chameleon.cpp +178 -0
- package/cpp/src/models/chatglm.cpp +132 -0
- package/cpp/src/models/codeshell.cpp +111 -0
- package/cpp/src/models/cogvlm.cpp +102 -0
- package/cpp/src/models/cohere2-iswa.cpp +134 -0
- package/cpp/src/models/command-r.cpp +122 -0
- package/cpp/src/models/dbrx.cpp +123 -0
- package/cpp/src/models/deci.cpp +135 -0
- package/cpp/src/models/deepseek.cpp +144 -0
- package/cpp/src/models/deepseek2.cpp +262 -0
- package/cpp/src/models/delta-net-base.cpp +376 -0
- package/cpp/src/models/dots1.cpp +134 -0
- package/cpp/src/models/dream.cpp +105 -0
- package/cpp/src/models/ernie4-5-moe.cpp +150 -0
- package/cpp/src/models/ernie4-5.cpp +110 -0
- package/cpp/src/models/eurobert.cpp +97 -0
- package/cpp/src/models/exaone-moe.cpp +146 -0
- package/cpp/src/models/exaone.cpp +114 -0
- package/cpp/src/models/exaone4.cpp +123 -0
- package/cpp/src/models/falcon-h1.cpp +111 -0
- package/cpp/src/models/falcon.cpp +120 -0
- package/cpp/src/models/gemma-embedding.cpp +116 -0
- package/cpp/src/models/gemma.cpp +112 -0
- package/cpp/src/models/gemma2-iswa.cpp +128 -0
- package/cpp/src/models/gemma3.cpp +155 -0
- package/cpp/src/models/gemma3n-iswa.cpp +384 -0
- package/cpp/src/models/glm4-moe.cpp +170 -0
- package/cpp/src/models/glm4.cpp +157 -0
- package/cpp/src/models/gpt2.cpp +105 -0
- package/cpp/src/models/gptneox.cpp +144 -0
- package/cpp/src/models/granite-hybrid.cpp +196 -0
- package/cpp/src/models/granite.cpp +211 -0
- package/cpp/src/models/grok.cpp +159 -0
- package/cpp/src/models/grovemoe.cpp +141 -0
- package/cpp/src/models/hunyuan-dense.cpp +132 -0
- package/cpp/src/models/hunyuan-moe.cpp +154 -0
- package/cpp/src/models/internlm2.cpp +120 -0
- package/cpp/src/models/jais.cpp +86 -0
- package/cpp/src/models/jais2.cpp +123 -0
- package/cpp/src/models/jamba.cpp +106 -0
- package/cpp/src/models/kimi-linear.cpp +392 -0
- package/cpp/src/models/lfm2.cpp +190 -0
- package/cpp/src/models/llada-moe.cpp +122 -0
- package/cpp/src/models/llada.cpp +99 -0
- package/cpp/src/models/llama-iswa.cpp +178 -0
- package/cpp/src/models/llama.cpp +168 -0
- package/cpp/src/models/maincoder.cpp +117 -0
- package/cpp/src/models/mamba-base.cpp +285 -0
- package/cpp/src/models/mamba.cpp +54 -0
- package/cpp/src/models/mimo2-iswa.cpp +123 -0
- package/cpp/src/models/minicpm3.cpp +200 -0
- package/cpp/src/models/minimax-m2.cpp +124 -0
- package/cpp/src/models/mistral3.cpp +160 -0
- package/cpp/src/models/models.h +684 -0
- package/cpp/src/models/modern-bert.cpp +109 -0
- package/cpp/src/models/mpt.cpp +126 -0
- package/cpp/src/models/nemotron-h.cpp +148 -0
- package/cpp/src/models/nemotron.cpp +122 -0
- package/cpp/src/models/neo-bert.cpp +104 -0
- package/cpp/src/models/olmo.cpp +121 -0
- package/cpp/src/models/olmo2.cpp +150 -0
- package/cpp/src/models/olmoe.cpp +124 -0
- package/cpp/src/models/openai-moe-iswa.cpp +127 -0
- package/cpp/src/models/openelm.cpp +124 -0
- package/cpp/src/models/orion.cpp +123 -0
- package/cpp/src/models/paddleocr.cpp +122 -0
- package/cpp/src/models/pangu-embedded.cpp +121 -0
- package/cpp/src/models/phi2.cpp +121 -0
- package/cpp/src/models/phi3.cpp +152 -0
- package/cpp/src/models/plamo.cpp +110 -0
- package/cpp/src/models/plamo2.cpp +318 -0
- package/cpp/src/models/plamo3.cpp +128 -0
- package/cpp/src/models/plm.cpp +169 -0
- package/cpp/src/models/qwen.cpp +108 -0
- package/cpp/src/models/qwen2.cpp +126 -0
- package/cpp/src/models/qwen2moe.cpp +151 -0
- package/cpp/src/models/qwen2vl.cpp +117 -0
- package/cpp/src/models/qwen3.cpp +117 -0
- package/cpp/src/models/qwen35.cpp +386 -0
- package/cpp/src/models/qwen35moe.cpp +420 -0
- package/cpp/src/models/qwen3moe.cpp +124 -0
- package/cpp/src/models/qwen3next.cpp +525 -0
- package/cpp/src/models/qwen3vl-moe.cpp +140 -0
- package/cpp/src/models/qwen3vl.cpp +132 -0
- package/cpp/src/models/refact.cpp +94 -0
- package/cpp/src/models/rnd1.cpp +126 -0
- package/cpp/src/models/rwkv6-base.cpp +164 -0
- package/cpp/src/models/rwkv6.cpp +94 -0
- package/cpp/src/models/rwkv6qwen2.cpp +86 -0
- package/cpp/src/models/rwkv7-base.cpp +137 -0
- package/cpp/src/models/rwkv7.cpp +90 -0
- package/cpp/src/models/seed-oss.cpp +124 -0
- package/cpp/src/models/smallthinker.cpp +126 -0
- package/cpp/src/models/smollm3.cpp +128 -0
- package/cpp/src/models/stablelm.cpp +146 -0
- package/cpp/src/models/starcoder.cpp +100 -0
- package/cpp/src/models/starcoder2.cpp +121 -0
- package/cpp/src/models/step35-iswa.cpp +168 -0
- package/cpp/src/models/t5-dec.cpp +166 -0
- package/cpp/src/models/t5-enc.cpp +96 -0
- package/cpp/src/models/wavtokenizer-dec.cpp +149 -0
- package/cpp/src/models/xverse.cpp +108 -0
- package/cpp/src/unicode-data.cpp +7034 -0
- package/cpp/src/unicode-data.h +20 -0
- package/cpp/src/unicode.cpp +1103 -0
- package/cpp/src/unicode.h +111 -0
- package/cpp/vendor/nlohmann/json.hpp +25526 -0
- package/cpp/vendor/nlohmann/json_fwd.hpp +187 -0
- package/cpp/vendor/stb/stb_image.h +7988 -0
- package/ios/LocalLLM-Bridging-Header.h +2 -0
- package/ios/LocalLLM.h +5 -0
- package/ios/LocalLLM.mm +1267 -0
- package/local-llm-rn.podspec +60 -0
- package/package.json +35 -0
- package/src/NativeLocalLLM.ts +73 -0
- package/src/device.ts +50 -0
- package/src/download-adapter.ts +17 -0
- package/src/index.ts +21 -0
- package/src/native-bridge.ts +142 -0
- package/src/rn-downloader.ts +37 -0
|
@@ -0,0 +1,815 @@
|
|
|
1
|
+
#pragma clang diagnostic ignored "-Wunused-variable"
|
|
2
|
+
#pragma clang diagnostic ignored "-Wunused-function"
|
|
3
|
+
#pragma clang diagnostic ignored "-Wunused-but-set-variable"
|
|
4
|
+
|
|
5
|
+
#include <HAP_farf.h>
|
|
6
|
+
#include <HAP_perf.h>
|
|
7
|
+
|
|
8
|
+
#include <math.h>
|
|
9
|
+
#include <string.h>
|
|
10
|
+
|
|
11
|
+
#include "hex-dma.h"
|
|
12
|
+
#include "hvx-utils.h"
|
|
13
|
+
|
|
14
|
+
#define GGML_COMMON_DECL_C
|
|
15
|
+
#include "ggml-common.h"
|
|
16
|
+
#include "htp-ctx.h"
|
|
17
|
+
#include "htp-msg.h"
|
|
18
|
+
#include "htp-ops.h"
|
|
19
|
+
|
|
20
|
+
#define htp_act_preamble3 \
|
|
21
|
+
const uint32_t ne00 = src0->ne[0]; \
|
|
22
|
+
const uint32_t ne01 = src0->ne[1]; \
|
|
23
|
+
const uint32_t ne02 = src0->ne[2]; \
|
|
24
|
+
const uint32_t ne03 = src0->ne[3]; \
|
|
25
|
+
\
|
|
26
|
+
const uint32_t ne10 = src1->ne[0]; \
|
|
27
|
+
const uint32_t ne11 = src1->ne[1]; \
|
|
28
|
+
const uint32_t ne12 = src1->ne[2]; \
|
|
29
|
+
const uint32_t ne13 = src1->ne[3]; \
|
|
30
|
+
\
|
|
31
|
+
const uint32_t ne0 = dst->ne[0]; \
|
|
32
|
+
const uint32_t ne1 = dst->ne[1]; \
|
|
33
|
+
const uint32_t ne2 = dst->ne[2]; \
|
|
34
|
+
const uint32_t ne3 = dst->ne[3]; \
|
|
35
|
+
\
|
|
36
|
+
const uint32_t nb00 = src0->nb[0]; \
|
|
37
|
+
const uint32_t nb01 = src0->nb[1]; \
|
|
38
|
+
const uint32_t nb02 = src0->nb[2]; \
|
|
39
|
+
const uint32_t nb03 = src0->nb[3]; \
|
|
40
|
+
\
|
|
41
|
+
const uint32_t nb10 = src1->nb[0]; \
|
|
42
|
+
const uint32_t nb11 = src1->nb[1]; \
|
|
43
|
+
const uint32_t nb12 = src1->nb[2]; \
|
|
44
|
+
const uint32_t nb13 = src1->nb[3]; \
|
|
45
|
+
\
|
|
46
|
+
const uint32_t nb0 = dst->nb[0]; \
|
|
47
|
+
const uint32_t nb1 = dst->nb[1]; \
|
|
48
|
+
const uint32_t nb2 = dst->nb[2]; \
|
|
49
|
+
const uint32_t nb3 = dst->nb[3];
|
|
50
|
+
|
|
51
|
+
#define htp_act_preamble2 \
|
|
52
|
+
const uint32_t ne00 = src0->ne[0]; \
|
|
53
|
+
const uint32_t ne01 = src0->ne[1]; \
|
|
54
|
+
const uint32_t ne02 = src0->ne[2]; \
|
|
55
|
+
const uint32_t ne03 = src0->ne[3]; \
|
|
56
|
+
\
|
|
57
|
+
const uint32_t ne0 = dst->ne[0]; \
|
|
58
|
+
const uint32_t ne1 = dst->ne[1]; \
|
|
59
|
+
const uint32_t ne2 = dst->ne[2]; \
|
|
60
|
+
const uint32_t ne3 = dst->ne[3]; \
|
|
61
|
+
\
|
|
62
|
+
const uint32_t nb00 = src0->nb[0]; \
|
|
63
|
+
const uint32_t nb01 = src0->nb[1]; \
|
|
64
|
+
const uint32_t nb02 = src0->nb[2]; \
|
|
65
|
+
const uint32_t nb03 = src0->nb[3]; \
|
|
66
|
+
\
|
|
67
|
+
const uint32_t nb0 = dst->nb[0]; \
|
|
68
|
+
const uint32_t nb1 = dst->nb[1]; \
|
|
69
|
+
const uint32_t nb2 = dst->nb[2]; \
|
|
70
|
+
const uint32_t nb3 = dst->nb[3];
|
|
71
|
+
|
|
72
|
+
struct htp_act_context {
|
|
73
|
+
struct htp_ops_context * octx;
|
|
74
|
+
|
|
75
|
+
// Precomputed values
|
|
76
|
+
const uint8_t * data_src0;
|
|
77
|
+
const uint8_t * data_src1;
|
|
78
|
+
uint8_t * data_dst;
|
|
79
|
+
|
|
80
|
+
size_t src0_row_size;
|
|
81
|
+
size_t src1_row_size;
|
|
82
|
+
size_t dst_row_size;
|
|
83
|
+
|
|
84
|
+
size_t src0_row_size_aligned;
|
|
85
|
+
size_t src1_row_size_aligned;
|
|
86
|
+
size_t dst_row_size_aligned;
|
|
87
|
+
|
|
88
|
+
size_t src0_spad_half_size;
|
|
89
|
+
size_t src1_spad_half_size;
|
|
90
|
+
size_t dst_spad_half_size;
|
|
91
|
+
|
|
92
|
+
uint32_t block;
|
|
93
|
+
uint32_t src0_nrows;
|
|
94
|
+
uint32_t src0_nrows_per_thread;
|
|
95
|
+
int nc;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
static void glu_swiglu_f32_per_thread(unsigned int nth, unsigned int ith, void * data) {
|
|
99
|
+
struct htp_act_context * actx = (struct htp_act_context *) data;
|
|
100
|
+
const struct htp_tensor * src0 = &actx->octx->src0;
|
|
101
|
+
const struct htp_tensor * src1 = &actx->octx->src1;
|
|
102
|
+
const struct htp_tensor * dst = &actx->octx->dst;
|
|
103
|
+
htp_act_preamble3;
|
|
104
|
+
|
|
105
|
+
size_t src0_row_size = actx->src0_row_size;
|
|
106
|
+
size_t src1_row_size = actx->src1_row_size;
|
|
107
|
+
size_t dst_row_size = actx->dst_row_size;
|
|
108
|
+
|
|
109
|
+
const uint32_t src0_nrows = actx->src0_nrows;
|
|
110
|
+
const uint32_t src0_nrows_per_thread = actx->src0_nrows_per_thread;
|
|
111
|
+
const uint32_t src0_start_row = src0_nrows_per_thread * ith;
|
|
112
|
+
const uint32_t src0_end_row = MIN(src0_start_row + src0_nrows_per_thread, src0_nrows);
|
|
113
|
+
|
|
114
|
+
// no work for this thread
|
|
115
|
+
if (src0_start_row >= src0_end_row) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
uint64_t t1, t2;
|
|
120
|
+
t1 = HAP_perf_get_qtimer_count();
|
|
121
|
+
|
|
122
|
+
const uint8_t * restrict data_src0 = actx->data_src0;
|
|
123
|
+
const uint8_t * restrict data_src1 = actx->data_src1;
|
|
124
|
+
uint8_t * restrict data_dst = actx->data_dst;
|
|
125
|
+
|
|
126
|
+
const int nc = actx->nc;
|
|
127
|
+
|
|
128
|
+
const size_t src0_row_size_aligned = actx->src0_row_size_aligned;
|
|
129
|
+
const size_t src1_row_size_aligned = actx->src1_row_size_aligned;
|
|
130
|
+
const size_t dst_row_size_aligned = actx->dst_row_size_aligned;
|
|
131
|
+
|
|
132
|
+
uint8_t * restrict src0_spad_data = actx->octx->src0_spad.data + (ith * actx->octx->src0_spad.size_per_thread);
|
|
133
|
+
uint8_t * restrict src1_spad_data = actx->octx->src1_spad.data + (ith * actx->octx->src1_spad.size_per_thread);
|
|
134
|
+
uint8_t * restrict dst_spad_data = actx->octx->dst_spad.data + (ith * actx->octx->dst_spad.size_per_thread);
|
|
135
|
+
|
|
136
|
+
size_t src0_spad_half_size = actx->src0_spad_half_size;
|
|
137
|
+
size_t src1_spad_half_size = actx->src1_spad_half_size;
|
|
138
|
+
size_t dst_spad_half_size = actx->dst_spad_half_size;
|
|
139
|
+
|
|
140
|
+
const int BLOCK = actx->block;
|
|
141
|
+
if (BLOCK == 0) {
|
|
142
|
+
FARF(ERROR,
|
|
143
|
+
"swiglu-f32 : current VTCM reservation %zu is too small for even 1 row per thread, needed at least %zu\n",
|
|
144
|
+
actx->octx->src0_spad.size_per_thread, src0_row_size_aligned);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
dma_queue * dma_queue = actx->octx->ctx->dma[ith];
|
|
149
|
+
|
|
150
|
+
// See discussion: https://github.com/ggml-org/llama.cpp/pull/18151#issuecomment-3678235379
|
|
151
|
+
for (uint32_t ir = src0_start_row, spad_idx = 0; ir < src0_end_row && spad_idx < 2; ir += BLOCK, spad_idx++) {
|
|
152
|
+
const uint32_t block_size = MIN(BLOCK, src0_end_row - ir);
|
|
153
|
+
|
|
154
|
+
// Dummy DMA transation for sequencing (interleaving dst,src,dst,...)
|
|
155
|
+
dma_queue_push_vtcm_to_ddr(dma_queue,
|
|
156
|
+
dma_make_ptr(data_dst, dst_spad_data + (spad_idx * dst_spad_half_size)),
|
|
157
|
+
dst_row_size, dst_row_size_aligned, 0);
|
|
158
|
+
|
|
159
|
+
dma_queue_push_ddr_to_vtcm(dma_queue,
|
|
160
|
+
dma_make_ptr(src0_spad_data + (spad_idx * src0_spad_half_size), data_src0 + (ir * src0_row_size)),
|
|
161
|
+
src0_row_size_aligned, src0_row_size, block_size);
|
|
162
|
+
dma_queue_push_ddr_to_vtcm(dma_queue,
|
|
163
|
+
dma_make_ptr(src1_spad_data + (spad_idx * src1_spad_half_size), data_src1 + (ir * src1_row_size)),
|
|
164
|
+
src1_row_size_aligned, src1_row_size, block_size);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
for (uint32_t ir = src0_start_row; ir < src0_end_row; ir += BLOCK) {
|
|
168
|
+
const uint32_t block_size = MIN(BLOCK, src0_end_row - ir);
|
|
169
|
+
|
|
170
|
+
float * dst_spad = (float *) dma_queue_pop(dma_queue).src;
|
|
171
|
+
float * src0_spad = (float *) dma_queue_pop(dma_queue).dst;
|
|
172
|
+
float * src1_spad = (float *) dma_queue_pop(dma_queue).dst;
|
|
173
|
+
|
|
174
|
+
for (uint32_t ib = 0; ib < block_size; ib++) {
|
|
175
|
+
const float * src0_spad_ptr = src0_spad + ib * (src0_row_size_aligned / sizeof(float));
|
|
176
|
+
const float * src1_spad_ptr = src1_spad + ib * (src1_row_size_aligned / sizeof(float));
|
|
177
|
+
float * dst_spad_ptr = dst_spad + ib * (dst_row_size_aligned / sizeof(float));
|
|
178
|
+
|
|
179
|
+
//swiglu(x) = x1 * sigmoid(x0)
|
|
180
|
+
hvx_sigmoid_f32_aa((uint8_t *) dst_spad_ptr, (const uint8_t *) src0_spad_ptr, nc);
|
|
181
|
+
hvx_mul_mul_f32_aa((uint8_t *) dst_spad_ptr, (const uint8_t *) src0_spad_ptr, (const uint8_t *) dst_spad_ptr,
|
|
182
|
+
(const uint8_t *) src1_spad_ptr, nc);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
dma_queue_push_vtcm_to_ddr(dma_queue, dma_make_ptr(data_dst + (ir * dst_row_size), dst_spad), dst_row_size,
|
|
186
|
+
dst_row_size_aligned, block_size);
|
|
187
|
+
|
|
188
|
+
// prefetch N+2 loop iteration if any
|
|
189
|
+
const uint32_t pref_block = (ir + BLOCK * 2);
|
|
190
|
+
if (pref_block < src0_end_row) {
|
|
191
|
+
const uint32_t pref_block_size = MIN(BLOCK, src0_end_row - pref_block);
|
|
192
|
+
dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(src0_spad, data_src0 + (pref_block * src0_row_size)),
|
|
193
|
+
src0_row_size_aligned, src0_row_size, pref_block_size);
|
|
194
|
+
dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(src1_spad, data_src1 + (pref_block * src1_row_size)),
|
|
195
|
+
src1_row_size_aligned, src1_row_size, pref_block_size);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
dma_queue_flush(dma_queue);
|
|
200
|
+
|
|
201
|
+
t2 = HAP_perf_get_qtimer_count();
|
|
202
|
+
|
|
203
|
+
FARF(HIGH, "swiglu-f32 %d/%d: %ux%ux%ux%u (%u:%u) x %ux%ux%ux%u -> %ux%ux%ux%u usec %u\n", ith, nth,
|
|
204
|
+
ne00, ne01, ne02, ne03, src0_start_row, src0_end_row, ne10, ne11, ne12, ne13, ne0, ne1, ne2, ne3,
|
|
205
|
+
(unsigned) HAP_perf_qtimer_count_to_us(t2 - t1));
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
static void glu_swiglu_oai_f32_per_thread(unsigned int nth, unsigned int ith, void * data) {
|
|
209
|
+
struct htp_act_context * actx = (struct htp_act_context *) data;
|
|
210
|
+
const struct htp_tensor * src0 = &actx->octx->src0;
|
|
211
|
+
const struct htp_tensor * src1 = &actx->octx->src1;
|
|
212
|
+
const struct htp_tensor * dst = &actx->octx->dst;
|
|
213
|
+
htp_act_preamble3;
|
|
214
|
+
|
|
215
|
+
uint64_t t1, t2;
|
|
216
|
+
t1 = HAP_perf_get_qtimer_count();
|
|
217
|
+
|
|
218
|
+
size_t src0_row_size = actx->src0_row_size;
|
|
219
|
+
size_t src1_row_size = actx->src1_row_size;
|
|
220
|
+
size_t dst_row_size = actx->dst_row_size;
|
|
221
|
+
|
|
222
|
+
const uint32_t src0_nrows = actx->src0_nrows;
|
|
223
|
+
const uint32_t src0_nrows_per_thread = actx->src0_nrows_per_thread;
|
|
224
|
+
|
|
225
|
+
const uint32_t src0_start_row = src0_nrows_per_thread * ith;
|
|
226
|
+
const uint32_t src0_end_row = MIN(src0_start_row + src0_nrows_per_thread, src0_nrows);
|
|
227
|
+
|
|
228
|
+
// no work for this thread
|
|
229
|
+
if (src0_start_row >= src0_end_row) {
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
const uint8_t * restrict data_src0 = actx->data_src0;
|
|
234
|
+
const uint8_t * restrict data_src1 = actx->data_src1;
|
|
235
|
+
uint8_t * restrict data_dst = actx->data_dst;
|
|
236
|
+
|
|
237
|
+
const int nc = actx->nc;
|
|
238
|
+
|
|
239
|
+
const size_t src0_row_size_aligned = actx->src0_row_size_aligned;
|
|
240
|
+
const size_t src1_row_size_aligned = actx->src1_row_size_aligned;
|
|
241
|
+
const size_t dst_row_size_aligned = actx->dst_row_size_aligned;
|
|
242
|
+
|
|
243
|
+
uint8_t * restrict src0_spad_data = actx->octx->src0_spad.data + (ith * actx->octx->src0_spad.size_per_thread);
|
|
244
|
+
uint8_t * restrict src1_spad_data = actx->octx->src1_spad.data + (ith * actx->octx->src1_spad.size_per_thread);
|
|
245
|
+
uint8_t * restrict dst_spad_data = actx->octx->dst_spad.data + (ith * actx->octx->dst_spad.size_per_thread);
|
|
246
|
+
|
|
247
|
+
size_t src0_spad_half_size = actx->src0_spad_half_size;
|
|
248
|
+
size_t src1_spad_half_size = actx->src1_spad_half_size;
|
|
249
|
+
size_t dst_spad_half_size = actx->dst_spad_half_size;
|
|
250
|
+
|
|
251
|
+
const int BLOCK = actx->block;
|
|
252
|
+
if (BLOCK == 0) {
|
|
253
|
+
FARF(ERROR,
|
|
254
|
+
"swiglu-oai-f32 : current VTCM reservation %zu is too small for even 1 row per thread, needed at least "
|
|
255
|
+
"%zu\n",
|
|
256
|
+
actx->octx->src0_spad.size_per_thread, src0_row_size_aligned);
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
const float alpha = ((const float *) (actx->octx->op_params))[2];
|
|
260
|
+
const float limit = ((const float *) (actx->octx->op_params))[3];
|
|
261
|
+
|
|
262
|
+
dma_queue * dma_queue = actx->octx->ctx->dma[ith];
|
|
263
|
+
|
|
264
|
+
// See discussion: https://github.com/ggml-org/llama.cpp/pull/18151#issuecomment-3678235379
|
|
265
|
+
for (uint32_t ir = src0_start_row, spad_idx = 0; ir < src0_end_row && spad_idx < 2; ir += BLOCK, spad_idx++) {
|
|
266
|
+
const uint32_t block_size = MIN(BLOCK, src0_end_row - ir);
|
|
267
|
+
|
|
268
|
+
// Dummy DMA transation for sequencing (interleaving dst,src,dst,...)
|
|
269
|
+
dma_queue_push_vtcm_to_ddr(dma_queue, dma_make_ptr(data_dst, dst_spad_data + (spad_idx * dst_spad_half_size)),
|
|
270
|
+
dst_row_size, dst_row_size_aligned, 0);
|
|
271
|
+
|
|
272
|
+
dma_queue_push_ddr_to_vtcm(
|
|
273
|
+
dma_queue,
|
|
274
|
+
dma_make_ptr(src0_spad_data + (spad_idx * src0_spad_half_size), data_src0 + (ir * src0_row_size)),
|
|
275
|
+
src0_row_size_aligned, src0_row_size, block_size);
|
|
276
|
+
dma_queue_push_ddr_to_vtcm(
|
|
277
|
+
dma_queue,
|
|
278
|
+
dma_make_ptr(src1_spad_data + (spad_idx * src1_spad_half_size), data_src1 + (ir * src1_row_size)),
|
|
279
|
+
src1_row_size_aligned, src1_row_size, block_size);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
for (uint32_t ir = src0_start_row; ir < src0_end_row; ir += BLOCK) {
|
|
283
|
+
const uint32_t block_size = MIN(BLOCK, src0_end_row - ir);
|
|
284
|
+
|
|
285
|
+
float * dst_spad = (float *) dma_queue_pop(dma_queue).src;
|
|
286
|
+
float * src0_spad = (float *) dma_queue_pop(dma_queue).dst;
|
|
287
|
+
float * src1_spad = (float *) dma_queue_pop(dma_queue).dst;
|
|
288
|
+
|
|
289
|
+
for (uint32_t ib = 0; ib < block_size; ib++) {
|
|
290
|
+
const float * src0_spad_ptr = src0_spad + ib * (src0_row_size_aligned / sizeof(float));
|
|
291
|
+
const float * src1_spad_ptr = src1_spad + ib * (src1_row_size_aligned / sizeof(float));
|
|
292
|
+
float * dst_spad_ptr = dst_spad + ib * (dst_row_size_aligned / sizeof(float));
|
|
293
|
+
|
|
294
|
+
// x (src0_spad_data) = std::min(src0_p[k], limit);
|
|
295
|
+
hvx_min_scalar_f32((uint8_t *) src0_spad_ptr, (const uint8_t *) src0_spad_ptr, limit, nc);
|
|
296
|
+
// y1 (src1_spad_data) = std::clamp(src1_p[k], -limit, limit);
|
|
297
|
+
hvx_clamp_scalar_f32((uint8_t *) src1_spad_ptr, (const uint8_t *) src1_spad_ptr, -limit, limit, nc);
|
|
298
|
+
// y (src1_spad_data) = y1 + 1.f
|
|
299
|
+
hvx_add_scalar_f32((uint8_t *) src1_spad_ptr, (const uint8_t *) src1_spad_ptr, 1.0, nc);
|
|
300
|
+
// x1 (dst_spad_data) = alpha * (x)
|
|
301
|
+
hvx_mul_scalar_f32((uint8_t *) dst_spad_ptr, (const uint8_t *) src0_spad_ptr, alpha, nc);
|
|
302
|
+
// x2 (dst_spad_data) = sigmoid(x1) = 1/(1+exp(-x1))
|
|
303
|
+
hvx_sigmoid_f32_aa((uint8_t *) dst_spad_ptr, (const uint8_t *) dst_spad_ptr, nc);
|
|
304
|
+
// out = x * sigmoid(alpha * x) * (y + 1.f)
|
|
305
|
+
hvx_mul_mul_f32_aa((uint8_t *) dst_spad_ptr, (const uint8_t *) src0_spad_ptr, (const uint8_t *) dst_spad_ptr,
|
|
306
|
+
(const uint8_t *) src1_spad_ptr, nc);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
dma_queue_push_vtcm_to_ddr(dma_queue, dma_make_ptr(data_dst + (ir * dst_row_size), dst_spad), dst_row_size,
|
|
310
|
+
dst_row_size_aligned, block_size);
|
|
311
|
+
|
|
312
|
+
// prefetch N+2 loop iteration if any
|
|
313
|
+
const uint32_t pref_block = (ir + BLOCK * 2);
|
|
314
|
+
if (pref_block < src0_end_row) {
|
|
315
|
+
const uint32_t pref_block_size = MIN(BLOCK, src0_end_row - pref_block);
|
|
316
|
+
dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(src0_spad, data_src0 + (pref_block * src0_row_size)),
|
|
317
|
+
src0_row_size_aligned, src0_row_size, pref_block_size);
|
|
318
|
+
dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(src1_spad, data_src1 + (pref_block * src1_row_size)),
|
|
319
|
+
src1_row_size_aligned, src1_row_size, pref_block_size);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
dma_queue_flush(dma_queue);
|
|
324
|
+
|
|
325
|
+
t2 = HAP_perf_get_qtimer_count();
|
|
326
|
+
|
|
327
|
+
FARF(HIGH, "swiglu-oai-f32 %d/%d: %ux%ux%ux%u (%u:%u) x %ux%ux%ux%u -> %ux%ux%ux%u usec %u\n", ith, nth, src0->ne[0],
|
|
328
|
+
src0->ne[1], src0->ne[2], src0->ne[3], src0_start_row, src0_end_row, src1->ne[0], src1->ne[1], src1->ne[2],
|
|
329
|
+
src1->ne[3], dst->ne[0], dst->ne[1], dst->ne[2], dst->ne[3], (unsigned) HAP_perf_qtimer_count_to_us(t2 - t1));
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
static void unary_gelu_f32_per_thread(unsigned int nth, unsigned int ith, void * data) {
|
|
334
|
+
struct htp_act_context * actx = (struct htp_act_context *) data;
|
|
335
|
+
const struct htp_tensor * src0 = &actx->octx->src0;
|
|
336
|
+
const struct htp_tensor * dst = &actx->octx->dst;
|
|
337
|
+
htp_act_preamble2;
|
|
338
|
+
|
|
339
|
+
uint64_t t1, t2;
|
|
340
|
+
t1 = HAP_perf_get_qtimer_count();
|
|
341
|
+
|
|
342
|
+
const size_t src0_row_size = actx->src0_row_size;
|
|
343
|
+
const size_t dst_row_size = actx->dst_row_size;
|
|
344
|
+
const size_t src0_row_size_aligned = actx->src0_row_size_aligned;
|
|
345
|
+
const size_t dst_row_size_aligned = actx->dst_row_size_aligned;
|
|
346
|
+
|
|
347
|
+
const uint32_t src0_nrows = actx->src0_nrows;
|
|
348
|
+
const uint32_t src0_nrows_per_thread = actx->src0_nrows_per_thread;
|
|
349
|
+
|
|
350
|
+
const uint32_t src0_start_row = src0_nrows_per_thread * ith;
|
|
351
|
+
const uint32_t src0_end_row = MIN(src0_start_row + src0_nrows_per_thread, src0_nrows);
|
|
352
|
+
|
|
353
|
+
// no work for this thread
|
|
354
|
+
if (src0_start_row >= src0_end_row) {
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
const uint8_t * data_src0 = actx->data_src0;
|
|
359
|
+
uint8_t * data_dst = actx->data_dst;
|
|
360
|
+
|
|
361
|
+
// nc/ne0 matches.
|
|
362
|
+
const int ne0_val = actx->nc; // == dst->ne[0]
|
|
363
|
+
|
|
364
|
+
uint8_t * src0_spad_data = actx->octx->src0_spad.data + (ith * actx->octx->src0_spad.size_per_thread);
|
|
365
|
+
uint8_t * dst_spad_data = actx->octx->dst_spad.data + (ith * actx->octx->dst_spad.size_per_thread);
|
|
366
|
+
|
|
367
|
+
size_t src0_spad_half_size = actx->src0_spad_half_size;
|
|
368
|
+
size_t dst_spad_half_size = actx->dst_spad_half_size;
|
|
369
|
+
|
|
370
|
+
// In gelu = x*sigmoid(x*1.702)
|
|
371
|
+
const int BLOCK = actx->block;
|
|
372
|
+
|
|
373
|
+
if (BLOCK == 0) {
|
|
374
|
+
FARF(ERROR, "gelu-f32 : current VTCM reservation %zu is too small for even 1 row per thread, needed at least %zu\n",
|
|
375
|
+
actx->octx->src0_spad.size_per_thread, src0_row_size_aligned);
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
dma_queue * dma_queue = actx->octx->ctx->dma[ith];
|
|
380
|
+
|
|
381
|
+
// See discussion: https://github.com/ggml-org/llama.cpp/pull/18151#issuecomment-3678235379
|
|
382
|
+
for (uint32_t ir = src0_start_row, spad_idx = 0; ir < src0_end_row && spad_idx < 2; ir += BLOCK, spad_idx++) {
|
|
383
|
+
const uint32_t block_size = MIN(BLOCK, src0_end_row - ir);
|
|
384
|
+
|
|
385
|
+
// Dummy DMA transation for sequencing (interleaving dst,src,dst,...)
|
|
386
|
+
dma_queue_push_vtcm_to_ddr(dma_queue,
|
|
387
|
+
dma_make_ptr(data_dst, dst_spad_data + (spad_idx * dst_spad_half_size)),
|
|
388
|
+
dst_row_size, dst_row_size_aligned, 0);
|
|
389
|
+
|
|
390
|
+
dma_queue_push_ddr_to_vtcm(dma_queue,
|
|
391
|
+
dma_make_ptr(src0_spad_data + (spad_idx * src0_spad_half_size), data_src0 + (ir * src0_row_size)),
|
|
392
|
+
src0_row_size_aligned, src0_row_size, block_size);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
for (uint32_t ir = src0_start_row; ir < src0_end_row; ir += BLOCK) {
|
|
396
|
+
const uint32_t block_size = MIN(BLOCK, src0_end_row - ir);
|
|
397
|
+
|
|
398
|
+
float* dst_spad = (float *) dma_queue_pop(dma_queue).src;
|
|
399
|
+
float* src0_spad = (float *) dma_queue_pop(dma_queue).dst;
|
|
400
|
+
|
|
401
|
+
for (uint32_t ib = 0; ib < block_size; ib++) {
|
|
402
|
+
const float* src0_spad_ptr = src0_spad + ib * (src0_row_size_aligned / sizeof(float));
|
|
403
|
+
float* dst_spad_ptr = dst_spad + ib * (dst_row_size_aligned / sizeof(float));
|
|
404
|
+
|
|
405
|
+
// gelu = x * sigmoid(1.702 * x) // current implementation
|
|
406
|
+
hvx_mul_scalar_f32((uint8_t *) dst_spad_ptr, (const uint8_t *) src0_spad_ptr, (float) 1.702, ne0_val);
|
|
407
|
+
hvx_sigmoid_f32_aa((uint8_t *) dst_spad_ptr, (const uint8_t *) dst_spad_ptr, ne0_val);
|
|
408
|
+
hvx_mul_f32_aaa((uint8_t *) dst_spad_ptr, (const uint8_t *) src0_spad_ptr, (const uint8_t *) dst_spad_ptr, ne0_val);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
dma_queue_push_vtcm_to_ddr(dma_queue,
|
|
412
|
+
dma_make_ptr(data_dst + (ir * dst_row_size), dst_spad),
|
|
413
|
+
dst_row_size, dst_row_size_aligned, block_size);
|
|
414
|
+
|
|
415
|
+
// prefetch N+2 loop iteration if any
|
|
416
|
+
const uint32_t pref_block = (ir + BLOCK * 2);
|
|
417
|
+
if (pref_block < src0_end_row) {
|
|
418
|
+
const uint32_t pref_block_size = MIN(BLOCK, src0_end_row - pref_block);
|
|
419
|
+
dma_queue_push_ddr_to_vtcm(dma_queue,
|
|
420
|
+
dma_make_ptr(src0_spad, data_src0 + (pref_block * src0_row_size)),
|
|
421
|
+
src0_row_size_aligned, src0_row_size, pref_block_size);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
dma_queue_flush(dma_queue);
|
|
426
|
+
|
|
427
|
+
t2 = HAP_perf_get_qtimer_count();
|
|
428
|
+
|
|
429
|
+
FARF(HIGH, "gelu-f32 %d/%d: %ux%ux%ux%u (%u:%u) -> %ux%ux%ux%u usec %u\n", ith, nth, ne00, ne01, ne02,
|
|
430
|
+
ne03, src0_start_row, src0_end_row, ne0, ne1, ne2, ne3, (unsigned) HAP_perf_qtimer_count_to_us(t2 - t1));
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
|
|
434
|
+
static void unary_silu_f32_per_thread(unsigned int nth, unsigned int ith, void * data) {
|
|
435
|
+
struct htp_act_context * actx = (struct htp_act_context *) data;
|
|
436
|
+
const struct htp_tensor * src0 = &actx->octx->src0;
|
|
437
|
+
const struct htp_tensor * dst = &actx->octx->dst;
|
|
438
|
+
htp_act_preamble2;
|
|
439
|
+
|
|
440
|
+
uint64_t t1, t2;
|
|
441
|
+
t1 = HAP_perf_get_qtimer_count();
|
|
442
|
+
|
|
443
|
+
const size_t src0_row_size = actx->src0_row_size;
|
|
444
|
+
const size_t dst_row_size = actx->dst_row_size;
|
|
445
|
+
const size_t src0_row_size_aligned = actx->src0_row_size_aligned;
|
|
446
|
+
const size_t dst_row_size_aligned = actx->dst_row_size_aligned;
|
|
447
|
+
|
|
448
|
+
const uint32_t src0_nrows = actx->src0_nrows;
|
|
449
|
+
const uint32_t src0_nrows_per_thread = actx->src0_nrows_per_thread;
|
|
450
|
+
|
|
451
|
+
const uint32_t src0_start_row = src0_nrows_per_thread * ith;
|
|
452
|
+
const uint32_t src0_end_row = MIN(src0_start_row + src0_nrows_per_thread, src0_nrows);
|
|
453
|
+
|
|
454
|
+
// no work for this thread
|
|
455
|
+
if (src0_start_row >= src0_end_row) {
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
const uint8_t * data_src0 = actx->data_src0;
|
|
460
|
+
uint8_t * data_dst = actx->data_dst;
|
|
461
|
+
|
|
462
|
+
const int ne0_val = actx->nc; // == dst->ne[0]
|
|
463
|
+
|
|
464
|
+
uint8_t * src0_spad_data = actx->octx->src0_spad.data + (ith * actx->octx->src0_spad.size_per_thread);
|
|
465
|
+
uint8_t * dst_spad_data = actx->octx->dst_spad.data + (ith * actx->octx->dst_spad.size_per_thread);
|
|
466
|
+
|
|
467
|
+
size_t src0_spad_half_size = actx->src0_spad_half_size;
|
|
468
|
+
size_t dst_spad_half_size = actx->dst_spad_half_size;
|
|
469
|
+
|
|
470
|
+
const int BLOCK = actx->block;
|
|
471
|
+
|
|
472
|
+
if (BLOCK == 0) {
|
|
473
|
+
FARF(ERROR, "silu-f32 : current VTCM reservation %zu is too small for even 1 row per thread, needed at least %zu\n",
|
|
474
|
+
actx->octx->src0_spad.size_per_thread, src0_row_size_aligned);
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
dma_queue * dma_queue = actx->octx->ctx->dma[ith];
|
|
479
|
+
|
|
480
|
+
// See discussion: https://github.com/ggml-org/llama.cpp/pull/18151#issuecomment-3678235379
|
|
481
|
+
for (uint32_t ir = src0_start_row, spad_idx = 0; ir < src0_end_row && spad_idx < 2; ir += BLOCK, spad_idx++) {
|
|
482
|
+
const uint32_t block_size = MIN(BLOCK, src0_end_row - ir);
|
|
483
|
+
|
|
484
|
+
// Dummy DMA transation for sequencing (interleaving dst,src,dst,...)
|
|
485
|
+
dma_queue_push_vtcm_to_ddr(dma_queue,
|
|
486
|
+
dma_make_ptr(data_dst, dst_spad_data + (spad_idx * dst_spad_half_size)),
|
|
487
|
+
dst_row_size, dst_row_size_aligned, 0);
|
|
488
|
+
|
|
489
|
+
dma_queue_push_ddr_to_vtcm(dma_queue,
|
|
490
|
+
dma_make_ptr(src0_spad_data + (spad_idx * src0_spad_half_size), data_src0 + (ir * src0_row_size)),
|
|
491
|
+
src0_row_size_aligned, src0_row_size, block_size);
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
for (uint32_t ir = src0_start_row; ir < src0_end_row; ir += BLOCK) {
|
|
495
|
+
const uint32_t block_size = MIN(BLOCK, src0_end_row - ir);
|
|
496
|
+
|
|
497
|
+
float* dst_spad = (float *) dma_queue_pop(dma_queue).src;
|
|
498
|
+
float* src0_spad = (float *) dma_queue_pop(dma_queue).dst;
|
|
499
|
+
|
|
500
|
+
for (uint32_t ib = 0; ib < block_size; ib++) {
|
|
501
|
+
const float* src0_spad_ptr = src0_spad + ib * (src0_row_size_aligned / sizeof(float));
|
|
502
|
+
float* dst_spad_ptr = dst_spad + ib * (dst_row_size_aligned / sizeof(float));
|
|
503
|
+
|
|
504
|
+
// silu = x * sigmoid(x)
|
|
505
|
+
hvx_sigmoid_f32_aa((uint8_t *) dst_spad_ptr, (const uint8_t *) src0_spad_ptr, ne0_val);
|
|
506
|
+
hvx_mul_f32_aaa((uint8_t *) dst_spad_ptr, (const uint8_t *) src0_spad_ptr, (const uint8_t *) dst_spad_ptr, ne0_val);
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
dma_queue_push_vtcm_to_ddr(dma_queue,
|
|
510
|
+
dma_make_ptr(data_dst + (ir * dst_row_size), dst_spad),
|
|
511
|
+
dst_row_size, dst_row_size_aligned, block_size);
|
|
512
|
+
|
|
513
|
+
// prefetch N+2 loop iteration if any
|
|
514
|
+
const uint32_t pref_block = (ir + BLOCK * 2);
|
|
515
|
+
if (pref_block < src0_end_row) {
|
|
516
|
+
const uint32_t pref_block_size = MIN(BLOCK, src0_end_row - pref_block);
|
|
517
|
+
dma_queue_push_ddr_to_vtcm(dma_queue,
|
|
518
|
+
dma_make_ptr(src0_spad, data_src0 + (pref_block * src0_row_size)),
|
|
519
|
+
src0_row_size_aligned, src0_row_size, pref_block_size);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
dma_queue_flush(dma_queue);
|
|
524
|
+
|
|
525
|
+
t2 = HAP_perf_get_qtimer_count();
|
|
526
|
+
|
|
527
|
+
FARF(HIGH, "silu-f32 %d/%d: %ux%ux%ux%u (%u:%u) -> %ux%ux%ux%u usec %u\n", ith, nth, ne00, ne01, ne02,
|
|
528
|
+
ne03, src0_start_row, src0_end_row, ne0, ne1, ne2, ne3, (unsigned) HAP_perf_qtimer_count_to_us(t2 - t1));
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
static const float GELU_COEF_A = 0.044715f;
|
|
532
|
+
static const float SQRT_2_OVER_PI = 0.79788456080286535587989211986876f;
|
|
533
|
+
|
|
534
|
+
static void glu_geglu_f32_per_thread(unsigned int nth, unsigned int ith, void * data) {
|
|
535
|
+
struct htp_act_context * actx = (struct htp_act_context *) data;
|
|
536
|
+
const struct htp_tensor * src0 = &actx->octx->src0;
|
|
537
|
+
const struct htp_tensor * src1 = &actx->octx->src1;
|
|
538
|
+
const struct htp_tensor * dst = &actx->octx->dst;
|
|
539
|
+
htp_act_preamble3;
|
|
540
|
+
|
|
541
|
+
size_t src0_row_size = actx->src0_row_size;
|
|
542
|
+
size_t src1_row_size = actx->src1_row_size;
|
|
543
|
+
size_t dst_row_size = actx->dst_row_size;
|
|
544
|
+
|
|
545
|
+
uint64_t t1, t2;
|
|
546
|
+
t1 = HAP_perf_get_qtimer_count();
|
|
547
|
+
|
|
548
|
+
const uint32_t src0_nrows = actx->src0_nrows;
|
|
549
|
+
const uint32_t src0_nrows_per_thread = actx->src0_nrows_per_thread;
|
|
550
|
+
|
|
551
|
+
const uint32_t src0_start_row = src0_nrows_per_thread * ith;
|
|
552
|
+
const uint32_t src0_end_row = MIN(src0_start_row + src0_nrows_per_thread, src0_nrows);
|
|
553
|
+
|
|
554
|
+
// no work for this thread
|
|
555
|
+
if (src0_start_row >= src0_end_row) {
|
|
556
|
+
return;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
const uint8_t * restrict data_src0 = actx->data_src0;
|
|
560
|
+
const uint8_t * restrict data_src1 = actx->data_src1;
|
|
561
|
+
uint8_t * restrict data_dst = actx->data_dst;
|
|
562
|
+
|
|
563
|
+
const int nc = actx->nc;
|
|
564
|
+
|
|
565
|
+
const size_t src0_row_size_aligned = actx->src0_row_size_aligned;
|
|
566
|
+
const size_t src1_row_size_aligned = actx->src1_row_size_aligned;
|
|
567
|
+
const size_t dst_row_size_aligned = actx->dst_row_size_aligned;
|
|
568
|
+
|
|
569
|
+
uint8_t * restrict src0_spad_data = actx->octx->src0_spad.data + (ith * actx->octx->src0_spad.size_per_thread);
|
|
570
|
+
uint8_t * restrict src1_spad_data = actx->octx->src1_spad.data + (ith * actx->octx->src1_spad.size_per_thread);
|
|
571
|
+
uint8_t * restrict dst_spad_data = actx->octx->dst_spad.data + (ith * actx->octx->dst_spad.size_per_thread);
|
|
572
|
+
|
|
573
|
+
size_t src0_spad_half_size = actx->src0_spad_half_size;
|
|
574
|
+
size_t src1_spad_half_size = actx->src1_spad_half_size;
|
|
575
|
+
size_t dst_spad_half_size = actx->dst_spad_half_size;
|
|
576
|
+
|
|
577
|
+
const int BLOCK = actx->block;
|
|
578
|
+
if (BLOCK == 0) {
|
|
579
|
+
FARF(ERROR,
|
|
580
|
+
"geglu-f32 : current VTCM reservation %zu is too small for even 1 row per thread, needed at least %zu\n",
|
|
581
|
+
actx->octx->src0_spad.size_per_thread, src0_row_size_aligned);
|
|
582
|
+
return;
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
dma_queue * dma_queue = actx->octx->ctx->dma[ith];
|
|
586
|
+
|
|
587
|
+
// See discussion: https://github.com/ggml-org/llama.cpp/pull/18151#issuecomment-3678235379
|
|
588
|
+
for (uint32_t ir = src0_start_row, spad_idx = 0; ir < src0_end_row && spad_idx < 2; ir += BLOCK, spad_idx++) {
|
|
589
|
+
const uint32_t block_size = MIN(BLOCK, src0_end_row - ir);
|
|
590
|
+
|
|
591
|
+
// Dummy DMA transation for sequencing (interleaving dst,src,dst,...)
|
|
592
|
+
dma_queue_push_vtcm_to_ddr(dma_queue,
|
|
593
|
+
dma_make_ptr(data_dst, dst_spad_data + (spad_idx * dst_spad_half_size)),
|
|
594
|
+
dst_row_size, dst_row_size_aligned, 0);
|
|
595
|
+
|
|
596
|
+
dma_queue_push_ddr_to_vtcm(dma_queue,
|
|
597
|
+
dma_make_ptr(src0_spad_data + (spad_idx * src0_spad_half_size), data_src0 + (ir * src0_row_size)),
|
|
598
|
+
src0_row_size_aligned, src0_row_size, block_size);
|
|
599
|
+
dma_queue_push_ddr_to_vtcm(dma_queue,
|
|
600
|
+
dma_make_ptr(src1_spad_data + (spad_idx * src1_spad_half_size), data_src1 + (ir * src1_row_size)),
|
|
601
|
+
src1_row_size_aligned, src1_row_size, block_size);
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
for (uint32_t ir = src0_start_row; ir < src0_end_row; ir += BLOCK) {
|
|
605
|
+
const uint32_t block_size = MIN(BLOCK, src0_end_row - ir);
|
|
606
|
+
|
|
607
|
+
float * dst_spad = (float *) dma_queue_pop(dma_queue).src;
|
|
608
|
+
float * src0_spad = (float *) dma_queue_pop(dma_queue).dst;
|
|
609
|
+
float * src1_spad = (float *) dma_queue_pop(dma_queue).dst;
|
|
610
|
+
|
|
611
|
+
for (uint32_t ib = 0; ib < block_size; ib++) {
|
|
612
|
+
const uint8_t * src0_spad_ptr = (const uint8_t *)(src0_spad + ib * (src0_row_size_aligned / sizeof(float)));
|
|
613
|
+
const uint8_t * src1_spad_ptr = (const uint8_t *)(src1_spad + ib * (src1_row_size_aligned / sizeof(float)));
|
|
614
|
+
uint8_t * dst_spad_ptr = (uint8_t *)(dst_spad + ib * (dst_row_size_aligned / sizeof(float)));
|
|
615
|
+
|
|
616
|
+
// geglu tanh implementation
|
|
617
|
+
// geglu(x, g) = gelu(x) * g
|
|
618
|
+
// gelu(x) = 0.5f*x*(1.0f + tanhf(SQRT_2_OVER_PI*x*(1.0f + GELU_COEF_A*x*x)))
|
|
619
|
+
hvx_mul_f32_aaa(dst_spad_ptr, src0_spad_ptr, src0_spad_ptr, nc); // res = x*x
|
|
620
|
+
hvx_mul_scalar_f32_aa(dst_spad_ptr, (const uint8_t *)dst_spad_ptr, GELU_COEF_A, nc); // res = res * GELU_COEF_A
|
|
621
|
+
hvx_add_scalar_f32_aa(dst_spad_ptr, (const uint8_t *)dst_spad_ptr, 1.0f, nc); // res = res + 1.0f
|
|
622
|
+
hvx_mul_f32_aaa(dst_spad_ptr, src0_spad_ptr, (const uint8_t *)dst_spad_ptr, nc); // res = res * x
|
|
623
|
+
hvx_mul_scalar_f32_aa(dst_spad_ptr, (const uint8_t*)dst_spad_ptr, SQRT_2_OVER_PI, nc); // res = result * SQRT_2_OVER_PI
|
|
624
|
+
hvx_tanh_f32_aa((uint8_t *) dst_spad_ptr, (const uint8_t *) dst_spad_ptr, nc); // res = tanh(res)
|
|
625
|
+
hvx_add_scalar_f32_aa(dst_spad_ptr, (const uint8_t*)dst_spad_ptr, 1.0f, nc); // res = res + 1.0f
|
|
626
|
+
hvx_mul_f32_aaa(dst_spad_ptr, src0_spad_ptr, (const uint8_t *)dst_spad_ptr, nc); // res = res * x
|
|
627
|
+
hvx_mul_scalar_f32_aa(dst_spad_ptr, (const uint8_t *)dst_spad_ptr, 0.5f, nc); // res = res + 0.5f
|
|
628
|
+
hvx_mul_f32_aaa(dst_spad_ptr, (const uint8_t *)dst_spad_ptr, src1_spad_ptr, nc); // res = res * g
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
dma_queue_push_vtcm_to_ddr(dma_queue, dma_make_ptr(data_dst + (ir * dst_row_size), dst_spad), dst_row_size,
|
|
632
|
+
dst_row_size_aligned, block_size);
|
|
633
|
+
|
|
634
|
+
// prefetch N+2 loop iteration if any
|
|
635
|
+
const uint32_t pref_block = (ir + BLOCK * 2);
|
|
636
|
+
if (pref_block < src0_end_row) {
|
|
637
|
+
const uint32_t pref_block_size = MIN(BLOCK, src0_end_row - pref_block);
|
|
638
|
+
dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(src0_spad, data_src0 + (pref_block * src0_row_size)),
|
|
639
|
+
src0_row_size_aligned, src0_row_size, pref_block_size);
|
|
640
|
+
dma_queue_push_ddr_to_vtcm(dma_queue, dma_make_ptr(src1_spad, data_src1 + (pref_block * src1_row_size)),
|
|
641
|
+
src1_row_size_aligned, src1_row_size, pref_block_size);
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
dma_queue_flush(dma_queue);
|
|
646
|
+
|
|
647
|
+
t2 = HAP_perf_get_qtimer_count();
|
|
648
|
+
|
|
649
|
+
FARF(HIGH, "geglu-f32 %d/%d: %ux%ux%ux%u (%u:%u) x %ux%ux%ux%u -> %ux%ux%ux%u usec %u\n", ith, nth,
|
|
650
|
+
ne00, ne01, ne02, ne03, src0_start_row, src0_end_row, ne10, ne11, ne12, ne13, ne0, ne1, ne2, ne3,
|
|
651
|
+
(unsigned) HAP_perf_qtimer_count_to_us(t2 - t1));
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
static int execute_op_activations_f32(struct htp_ops_context * octx) {
|
|
655
|
+
const struct htp_tensor * src0 = &octx->src0;
|
|
656
|
+
const struct htp_tensor * src1 = &octx->src1;
|
|
657
|
+
struct htp_tensor * dst = &octx->dst;
|
|
658
|
+
|
|
659
|
+
if (((src0->ne[0] * SIZEOF_FP32) != src0->nb[1]) || ((dst->ne[0] * SIZEOF_FP32) != dst->nb[1])) {
|
|
660
|
+
FARF(ERROR, "Non-contiguous tensors are not supported at this time \n");
|
|
661
|
+
return HTP_STATUS_NO_SUPPORT;
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
worker_callback_t act_op_func;
|
|
665
|
+
const char * op_type = NULL;
|
|
666
|
+
|
|
667
|
+
switch (octx->op) {
|
|
668
|
+
case HTP_OP_UNARY_SILU:
|
|
669
|
+
act_op_func = (worker_callback_t)unary_silu_f32_per_thread;
|
|
670
|
+
op_type = "silu-f32";
|
|
671
|
+
break;
|
|
672
|
+
|
|
673
|
+
case HTP_OP_GLU_SWIGLU:
|
|
674
|
+
act_op_func = (worker_callback_t)glu_swiglu_f32_per_thread;
|
|
675
|
+
op_type = "swiglu-f32";
|
|
676
|
+
break;
|
|
677
|
+
|
|
678
|
+
case HTP_OP_GLU_SWIGLU_OAI:
|
|
679
|
+
act_op_func = (worker_callback_t)glu_swiglu_oai_f32_per_thread;
|
|
680
|
+
op_type = "swiglu-oai-f32";
|
|
681
|
+
break;
|
|
682
|
+
case HTP_OP_UNARY_GELU:
|
|
683
|
+
act_op_func = (worker_callback_t)unary_gelu_f32_per_thread;
|
|
684
|
+
op_type = "gelu-f32";
|
|
685
|
+
break;
|
|
686
|
+
|
|
687
|
+
case HTP_OP_GLU_GEGLU:
|
|
688
|
+
act_op_func = (worker_callback_t)glu_geglu_f32_per_thread;
|
|
689
|
+
op_type = "geglu-f32";
|
|
690
|
+
break;
|
|
691
|
+
default:
|
|
692
|
+
FARF(ERROR, "Unsupported activations Op %u\n", octx->op);
|
|
693
|
+
return HTP_STATUS_NO_SUPPORT;
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
const uint32_t n_threads = octx->n_threads;
|
|
697
|
+
const uint32_t src0_nrows = src0->ne[1] * src0->ne[2] * src0->ne[3];
|
|
698
|
+
|
|
699
|
+
size_t src0_row_size = src0->nb[1];
|
|
700
|
+
size_t src1_row_size = src1->nb[1]; // zero bytes if src1 is not used
|
|
701
|
+
size_t dst_row_size = dst->nb[1];
|
|
702
|
+
|
|
703
|
+
const bool src1_valid = src1->ne[0];
|
|
704
|
+
if (!src1_valid) {
|
|
705
|
+
src1_row_size = src0_row_size;
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
const size_t src0_row_size_aligned = hex_round_up(src0_row_size, VLEN);
|
|
709
|
+
const size_t src1_row_size_aligned = hex_round_up(src1_row_size, VLEN);
|
|
710
|
+
const size_t dst_row_size_aligned = hex_round_up(dst_row_size, VLEN);
|
|
711
|
+
// VTCM scratchpads for all tensors
|
|
712
|
+
// N rows per thread, padded to HVX vector size
|
|
713
|
+
|
|
714
|
+
size_t spad_size_per_row = (src0_row_size_aligned + src1_row_size_aligned) + dst_row_size_aligned;
|
|
715
|
+
size_t vtcm_row_per_thread = (octx->ctx->vtcm_size)/ (n_threads* spad_size_per_row);
|
|
716
|
+
|
|
717
|
+
// Make sure the reserved vtcm size is sufficient
|
|
718
|
+
if(vtcm_row_per_thread ==0){
|
|
719
|
+
FARF(ERROR, "act-%s : current VTCM reservation %zu is too small for even 1 row per thread, needed at least %zu\n", op_type, octx->ctx->vtcm_size,
|
|
720
|
+
spad_size_per_row * n_threads);
|
|
721
|
+
return HTP_STATUS_VTCM_TOO_SMALL;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
octx->src0_spad.size_per_thread = src0_row_size_aligned * vtcm_row_per_thread;
|
|
725
|
+
octx->src1_spad.size_per_thread = src1_row_size_aligned * vtcm_row_per_thread;
|
|
726
|
+
octx->dst_spad.size_per_thread = dst_row_size_aligned * vtcm_row_per_thread;
|
|
727
|
+
|
|
728
|
+
octx->dst_spad.size = n_threads* octx->dst_spad.size_per_thread;
|
|
729
|
+
octx->src0_spad.size = n_threads* octx->src0_spad.size_per_thread;
|
|
730
|
+
octx->src1_spad.size = n_threads* octx->src1_spad.size_per_thread;
|
|
731
|
+
|
|
732
|
+
octx->src0_spad.data = octx->ctx->vtcm_base;
|
|
733
|
+
octx->src1_spad.data = octx->src0_spad.data + octx->src0_spad.size;
|
|
734
|
+
octx->dst_spad.data = octx->src1_spad.data + octx->src1_spad.size;
|
|
735
|
+
|
|
736
|
+
if (src1->ne[0]) {
|
|
737
|
+
FARF(HIGH, "%s: %ux%ux%ux%u x %ux%ux%ux%u -> %ux%ux%ux%u : src0-spad-size %u src1-spad-size %u dst-spad-size %u\n",
|
|
738
|
+
op_type, src0->ne[0], src0->ne[1], src0->ne[2], src0->ne[3], src1->ne[0], src1->ne[1], src1->ne[2],
|
|
739
|
+
src1->ne[3], dst->ne[0], dst->ne[1], dst->ne[2], dst->ne[3], octx->src0_spad.size, octx->src1_spad.size,
|
|
740
|
+
octx->dst_spad.size);
|
|
741
|
+
} else {
|
|
742
|
+
FARF(HIGH, "%s: %ux%ux%ux%u -> %ux%ux%ux%u : src0-spad-size %u src1-spad-size %u dst-spad-size %u\n", op_type,
|
|
743
|
+
src0->ne[0], src0->ne[1], src0->ne[2], src0->ne[3], dst->ne[0], dst->ne[1], dst->ne[2], dst->ne[3],
|
|
744
|
+
octx->src0_spad.size, octx->src1_spad.size, octx->dst_spad.size);
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
if ((octx->flags & HTP_OPFLAGS_SKIP_COMPUTE)) {
|
|
748
|
+
return HTP_STATUS_OK;
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
uint32_t n_jobs = MIN(n_threads, src0_nrows);
|
|
752
|
+
|
|
753
|
+
// Prepare context
|
|
754
|
+
struct htp_act_context actx;
|
|
755
|
+
actx.octx = octx;
|
|
756
|
+
|
|
757
|
+
actx.src0_nrows_per_thread = (src0_nrows + n_jobs - 1) / n_jobs;
|
|
758
|
+
|
|
759
|
+
actx.src0_row_size = src0_row_size;
|
|
760
|
+
actx.src1_row_size = src1_row_size;
|
|
761
|
+
actx.dst_row_size = dst_row_size;
|
|
762
|
+
|
|
763
|
+
actx.src0_row_size_aligned = src0_row_size_aligned;
|
|
764
|
+
actx.src1_row_size_aligned = src1_row_size_aligned;
|
|
765
|
+
actx.dst_row_size_aligned = dst_row_size_aligned;
|
|
766
|
+
|
|
767
|
+
actx.src0_spad_half_size = octx->src0_spad.size_per_thread / 2;
|
|
768
|
+
actx.src1_spad_half_size = octx->src1_spad.size_per_thread / 2;
|
|
769
|
+
actx.dst_spad_half_size = octx->dst_spad.size_per_thread / 2;
|
|
770
|
+
|
|
771
|
+
actx.block = actx.src0_spad_half_size / actx.src0_row_size_aligned;
|
|
772
|
+
actx.src0_nrows = src0_nrows;
|
|
773
|
+
|
|
774
|
+
actx.nc = dst->ne[0];
|
|
775
|
+
|
|
776
|
+
// Pointers and GLU logic
|
|
777
|
+
const uint8_t * data_src0 = (const uint8_t *) src0->data;
|
|
778
|
+
const uint8_t * data_src1 = (const uint8_t *) src1->data;
|
|
779
|
+
|
|
780
|
+
if (!src1_valid && (octx->op == HTP_OP_GLU_SWIGLU || octx->op == HTP_OP_GLU_SWIGLU_OAI || octx->op == HTP_OP_GLU_GEGLU)) {
|
|
781
|
+
const int32_t swapped = octx->op_params[1];
|
|
782
|
+
data_src1 = data_src0;
|
|
783
|
+
actx.src1_row_size = actx.src0_row_size;
|
|
784
|
+
|
|
785
|
+
size_t nc_in_bytes = actx.nc * SIZEOF_FP32;
|
|
786
|
+
if (swapped) {
|
|
787
|
+
data_src0 += nc_in_bytes;
|
|
788
|
+
} else {
|
|
789
|
+
data_src1 += nc_in_bytes;
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
actx.data_src0 = data_src0;
|
|
794
|
+
actx.data_src1 = data_src1;
|
|
795
|
+
actx.data_dst = (uint8_t *) dst->data;
|
|
796
|
+
|
|
797
|
+
worker_pool_run_func(octx->ctx->worker_pool, act_op_func, &actx, n_jobs);
|
|
798
|
+
return HTP_STATUS_OK;
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
int op_activations(struct htp_ops_context * octx) {
|
|
802
|
+
int err = HTP_STATUS_OK;
|
|
803
|
+
|
|
804
|
+
switch (octx->src0.type) {
|
|
805
|
+
case HTP_TYPE_F32:
|
|
806
|
+
err = execute_op_activations_f32(octx);
|
|
807
|
+
break;
|
|
808
|
+
|
|
809
|
+
default:
|
|
810
|
+
err = HTP_STATUS_NO_SUPPORT;
|
|
811
|
+
break;
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
return err;
|
|
815
|
+
}
|