whispercpp 1.3.6 → 1.3.8

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.
Files changed (965) hide show
  1. checksums.yaml +4 -4
  2. data/.document +3 -0
  3. data/.rdoc_options +2 -0
  4. data/README.md +43 -9
  5. data/Rakefile +18 -3
  6. data/ext/dependencies.rb +10 -4
  7. data/ext/dependencies_for_windows.rb +17 -0
  8. data/ext/extconf.rb +20 -8
  9. data/ext/options.rb +54 -14
  10. data/ext/options_for_windows.rb +51 -0
  11. data/ext/ruby_whisper.c +35 -42
  12. data/ext/ruby_whisper.h +141 -0
  13. data/ext/ruby_whisper_context.c +157 -29
  14. data/ext/ruby_whisper_log_queue.c +180 -0
  15. data/ext/ruby_whisper_log_settable.h +46 -0
  16. data/ext/ruby_whisper_parakeet.c +49 -0
  17. data/ext/ruby_whisper_parakeet_context.c +304 -0
  18. data/ext/ruby_whisper_parakeet_context_params.c +117 -0
  19. data/ext/ruby_whisper_parakeet_model.c +84 -0
  20. data/ext/ruby_whisper_parakeet_params.c +548 -0
  21. data/ext/ruby_whisper_parakeet_segment.c +157 -0
  22. data/ext/ruby_whisper_parakeet_token.c +188 -0
  23. data/ext/ruby_whisper_parakeet_transcribe.cpp +58 -0
  24. data/ext/ruby_whisper_params.c +265 -73
  25. data/ext/ruby_whisper_segment.c +6 -6
  26. data/ext/ruby_whisper_transcribe.cpp +23 -15
  27. data/ext/ruby_whisper_vad_context.c +30 -10
  28. data/ext/ruby_whisper_vad_context_detect.cpp +8 -9
  29. data/ext/ruby_whisper_vad_params.c +4 -4
  30. data/ext/ruby_whisper_vad_segment.c +2 -2
  31. data/ext/sources/CMakeLists.txt +42 -3
  32. data/ext/sources/CMakePresets.json +95 -0
  33. data/ext/sources/cmake/parakeet-config.cmake.in +30 -0
  34. data/ext/sources/cmake/parakeet.pc.in +10 -0
  35. data/ext/sources/cmake/whisper.pc.in +2 -2
  36. data/ext/sources/examples/CMakeLists.txt +4 -2
  37. data/ext/sources/examples/bench/bench.cpp +1 -1
  38. data/ext/sources/examples/cli/cli.cpp +52 -10
  39. data/ext/sources/examples/common-ggml.cpp +4 -0
  40. data/ext/sources/examples/common-whisper.cpp +139 -67
  41. data/ext/sources/examples/common-whisper.h +11 -0
  42. data/ext/sources/examples/ffmpeg-transcode.cpp +211 -341
  43. data/ext/sources/examples/parakeet-cli/CMakeLists.txt +8 -0
  44. data/ext/sources/examples/parakeet-cli/parakeet-cli.cpp +243 -0
  45. data/ext/sources/examples/parakeet-quantize/CMakeLists.txt +7 -0
  46. data/ext/sources/examples/parakeet-quantize/parakeet-quantize.cpp +230 -0
  47. data/ext/sources/examples/server/server.cpp +199 -163
  48. data/ext/sources/examples/vad-speech-segments/speech.cpp +3 -2
  49. data/ext/sources/ggml/CMakeLists.txt +21 -14
  50. data/ext/sources/ggml/cmake/FindNCCL.cmake +36 -0
  51. data/ext/sources/ggml/cmake/ggml-config.cmake.in +12 -2
  52. data/ext/sources/ggml/include/ggml-alloc.h +1 -0
  53. data/ext/sources/ggml/include/ggml-backend.h +72 -10
  54. data/ext/sources/ggml/include/ggml-cuda.h +2 -2
  55. data/ext/sources/ggml/include/ggml-rpc.h +3 -3
  56. data/ext/sources/ggml/include/ggml-sycl.h +8 -0
  57. data/ext/sources/ggml/include/ggml.h +103 -9
  58. data/ext/sources/ggml/include/gguf.h +10 -2
  59. data/ext/sources/ggml/src/CMakeLists.txt +30 -6
  60. data/ext/sources/ggml/src/ggml-alloc.c +5 -1
  61. data/ext/sources/ggml/src/ggml-backend-impl.h +22 -2
  62. data/ext/sources/ggml/src/ggml-backend-meta.cpp +2266 -0
  63. data/ext/sources/ggml/src/ggml-backend-reg.cpp +12 -0
  64. data/ext/sources/ggml/src/ggml-backend.cpp +110 -9
  65. data/ext/sources/ggml/src/ggml-blas/ggml-blas.cpp +4 -0
  66. data/ext/sources/ggml/src/ggml-cann/aclnn_ops.cpp +672 -257
  67. data/ext/sources/ggml/src/ggml-cann/aclnn_ops.h +71 -0
  68. data/ext/sources/ggml/src/ggml-cann/common.h +20 -10
  69. data/ext/sources/ggml/src/ggml-cann/ggml-cann.cpp +211 -30
  70. data/ext/sources/ggml/src/ggml-common.h +24 -2
  71. data/ext/sources/ggml/src/ggml-cpu/CMakeLists.txt +59 -30
  72. data/ext/sources/ggml/src/ggml-cpu/amx/amx.cpp +2 -0
  73. data/ext/sources/ggml/src/ggml-cpu/amx/mmq.cpp +21 -22
  74. data/ext/sources/ggml/src/ggml-cpu/arch/arm/quants.c +194 -11
  75. data/ext/sources/ggml/src/ggml-cpu/arch/arm/repack.cpp +65 -0
  76. data/ext/sources/ggml/src/ggml-cpu/arch/loongarch/quants.c +151 -1
  77. data/ext/sources/ggml/src/ggml-cpu/arch/powerpc/quants.c +0 -1
  78. data/ext/sources/ggml/src/ggml-cpu/arch/riscv/quants.c +4279 -1292
  79. data/ext/sources/ggml/src/ggml-cpu/arch/riscv/repack.cpp +5 -35
  80. data/ext/sources/ggml/src/ggml-cpu/arch/s390/quants.c +0 -1
  81. data/ext/sources/ggml/src/ggml-cpu/arch/wasm/quants.c +72 -1
  82. data/ext/sources/ggml/src/ggml-cpu/arch/x86/quants.c +319 -31
  83. data/ext/sources/ggml/src/ggml-cpu/arch/x86/repack.cpp +1 -1
  84. data/ext/sources/ggml/src/ggml-cpu/arch-fallback.h +12 -2
  85. data/ext/sources/ggml/src/ggml-cpu/cmake/FindSMTIME.cmake +32 -0
  86. data/ext/sources/ggml/src/ggml-cpu/ggml-cpu-impl.h +10 -0
  87. data/ext/sources/ggml/src/ggml-cpu/ggml-cpu.c +109 -5
  88. data/ext/sources/ggml/src/ggml-cpu/ggml-cpu.cpp +2 -0
  89. data/ext/sources/ggml/src/ggml-cpu/kleidiai/kleidiai.cpp +146 -134
  90. data/ext/sources/ggml/src/ggml-cpu/llamafile/sgemm.cpp +107 -82
  91. data/ext/sources/ggml/src/ggml-cpu/ops.cpp +501 -119
  92. data/ext/sources/ggml/src/ggml-cpu/ops.h +3 -0
  93. data/ext/sources/ggml/src/ggml-cpu/quants.c +106 -0
  94. data/ext/sources/ggml/src/ggml-cpu/quants.h +6 -0
  95. data/ext/sources/ggml/src/ggml-cpu/repack.cpp +3 -0
  96. data/ext/sources/ggml/src/ggml-cpu/simd-gemm.h +91 -1
  97. data/ext/sources/ggml/src/ggml-cpu/simd-mappings.h +14 -16
  98. data/ext/sources/ggml/src/ggml-cpu/spacemit/ime.cpp +1402 -687
  99. data/ext/sources/ggml/src/ggml-cpu/spacemit/ime.h +8 -0
  100. data/ext/sources/ggml/src/ggml-cpu/spacemit/ime1_kernels.cpp +597 -2766
  101. data/ext/sources/ggml/src/ggml-cpu/spacemit/ime2_kernels.cpp +5768 -0
  102. data/ext/sources/ggml/src/ggml-cpu/spacemit/ime_env.cpp +320 -0
  103. data/ext/sources/ggml/src/ggml-cpu/spacemit/ime_env.h +55 -0
  104. data/ext/sources/ggml/src/ggml-cpu/spacemit/ime_kernels.h +182 -19
  105. data/ext/sources/ggml/src/ggml-cpu/spacemit/repack.cpp +1795 -0
  106. data/ext/sources/ggml/src/ggml-cpu/spacemit/repack.h +14 -0
  107. data/ext/sources/ggml/src/ggml-cpu/spacemit/rvv_kernels.cpp +3178 -0
  108. data/ext/sources/ggml/src/ggml-cpu/spacemit/rvv_kernels.h +95 -0
  109. data/ext/sources/ggml/src/ggml-cpu/spacemit/spine_barrier.h +34 -0
  110. data/ext/sources/ggml/src/ggml-cpu/spacemit/spine_mem_pool.cpp +760 -0
  111. data/ext/sources/ggml/src/ggml-cpu/spacemit/spine_mem_pool.h +32 -0
  112. data/ext/sources/ggml/src/ggml-cpu/spacemit/spine_tcm.h +409 -0
  113. data/ext/sources/ggml/src/ggml-cpu/vec.cpp +39 -55
  114. data/ext/sources/ggml/src/ggml-cpu/vec.h +225 -240
  115. data/ext/sources/ggml/src/ggml-cuda/CMakeLists.txt +17 -7
  116. data/ext/sources/ggml/src/ggml-cuda/allreduce.cu +971 -0
  117. data/ext/sources/ggml/src/ggml-cuda/allreduce.cuh +29 -0
  118. data/ext/sources/ggml/src/ggml-cuda/argsort.cu +62 -26
  119. data/ext/sources/ggml/src/ggml-cuda/binbcast.cu +134 -64
  120. data/ext/sources/ggml/src/ggml-cuda/binbcast.cuh +1 -0
  121. data/ext/sources/ggml/src/ggml-cuda/col2im-1d.cu +81 -0
  122. data/ext/sources/ggml/src/ggml-cuda/col2im-1d.cuh +3 -0
  123. data/ext/sources/ggml/src/ggml-cuda/common.cuh +246 -28
  124. data/ext/sources/ggml/src/ggml-cuda/concat.cu +134 -116
  125. data/ext/sources/ggml/src/ggml-cuda/conv-transpose-1d.cu +14 -12
  126. data/ext/sources/ggml/src/ggml-cuda/conv2d-transpose.cu +45 -21
  127. data/ext/sources/ggml/src/ggml-cuda/conv2d-transpose.cuh +1 -0
  128. data/ext/sources/ggml/src/ggml-cuda/convert.cu +139 -34
  129. data/ext/sources/ggml/src/ggml-cuda/convert.cuh +10 -0
  130. data/ext/sources/ggml/src/ggml-cuda/cpy.cu +88 -29
  131. data/ext/sources/ggml/src/ggml-cuda/dequantize.cuh +22 -0
  132. data/ext/sources/ggml/src/ggml-cuda/fattn-common.cuh +287 -49
  133. data/ext/sources/ggml/src/ggml-cuda/fattn-mma-f16.cuh +335 -130
  134. data/ext/sources/ggml/src/ggml-cuda/fattn-tile.cu +12 -0
  135. data/ext/sources/ggml/src/ggml-cuda/fattn-tile.cuh +127 -24
  136. data/ext/sources/ggml/src/ggml-cuda/fattn-vec.cuh +40 -15
  137. data/ext/sources/ggml/src/ggml-cuda/fattn-wmma-f16.cu +18 -9
  138. data/ext/sources/ggml/src/ggml-cuda/fattn.cu +169 -60
  139. data/ext/sources/ggml/src/ggml-cuda/fattn.cuh +2 -0
  140. data/ext/sources/ggml/src/ggml-cuda/fwht.cu +101 -0
  141. data/ext/sources/ggml/src/ggml-cuda/fwht.cuh +4 -0
  142. data/ext/sources/ggml/src/ggml-cuda/gated_delta_net.cu +109 -45
  143. data/ext/sources/ggml/src/ggml-cuda/gated_delta_net.cuh +10 -0
  144. data/ext/sources/ggml/src/ggml-cuda/getrows.cu +48 -23
  145. data/ext/sources/ggml/src/ggml-cuda/ggml-cuda.cu +2034 -2104
  146. data/ext/sources/ggml/src/ggml-cuda/im2col.cu +32 -29
  147. data/ext/sources/ggml/src/ggml-cuda/mean.cu +4 -2
  148. data/ext/sources/ggml/src/ggml-cuda/mma.cuh +242 -195
  149. data/ext/sources/ggml/src/ggml-cuda/mmf.cuh +3 -3
  150. data/ext/sources/ggml/src/ggml-cuda/mmq.cu +25 -12
  151. data/ext/sources/ggml/src/ggml-cuda/mmq.cuh +502 -423
  152. data/ext/sources/ggml/src/ggml-cuda/mmvf.cu +19 -12
  153. data/ext/sources/ggml/src/ggml-cuda/mmvq.cu +562 -97
  154. data/ext/sources/ggml/src/ggml-cuda/mmvq.cuh +6 -1
  155. data/ext/sources/ggml/src/ggml-cuda/norm.cu +36 -10
  156. data/ext/sources/ggml/src/ggml-cuda/out-prod.cu +66 -7
  157. data/ext/sources/ggml/src/ggml-cuda/quantize.cu +133 -26
  158. data/ext/sources/ggml/src/ggml-cuda/quantize.cuh +1 -1
  159. data/ext/sources/ggml/src/ggml-cuda/reduce_rows.cuh +5 -1
  160. data/ext/sources/ggml/src/ggml-cuda/rope.cu +11 -4
  161. data/ext/sources/ggml/src/ggml-cuda/scale.cu +4 -1
  162. data/ext/sources/ggml/src/ggml-cuda/set-rows.cu +78 -10
  163. data/ext/sources/ggml/src/ggml-cuda/snake.cu +72 -0
  164. data/ext/sources/ggml/src/ggml-cuda/snake.cuh +8 -0
  165. data/ext/sources/ggml/src/ggml-cuda/softcap.cu +4 -1
  166. data/ext/sources/ggml/src/ggml-cuda/ssm-conv.cu +45 -13
  167. data/ext/sources/ggml/src/ggml-cuda/ssm-conv.cuh +1 -1
  168. data/ext/sources/ggml/src/ggml-cuda/ssm-scan.cu +40 -18
  169. data/ext/sources/ggml/src/ggml-cuda/sumrows.cu +8 -4
  170. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_1-ncols2_16.cu +1 -0
  171. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_1-ncols2_32.cu +1 -0
  172. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_1-ncols2_8.cu +2 -0
  173. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_16-ncols2_2.cu +1 -0
  174. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_16-ncols2_4.cu +1 -0
  175. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_16.cu +1 -0
  176. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_32.cu +1 -0
  177. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_4.cu +1 -0
  178. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_8.cu +2 -0
  179. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_32-ncols2_2.cu +1 -0
  180. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_16.cu +1 -0
  181. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_2.cu +1 -0
  182. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_4.cu +1 -0
  183. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_8.cu +2 -0
  184. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_8-ncols2_2.cu +1 -0
  185. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_8-ncols2_4.cu +1 -0
  186. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_8-ncols2_8.cu +2 -0
  187. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq192-dv128.cu +5 -0
  188. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq320-dv256.cu +5 -0
  189. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq512-dv512.cu +5 -0
  190. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-bf16.cu +7 -0
  191. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-f16.cu +7 -0
  192. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q4_0.cu +7 -0
  193. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q4_1.cu +7 -0
  194. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q5_0.cu +7 -0
  195. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q5_1.cu +7 -0
  196. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q8_0.cu +7 -0
  197. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-bf16.cu +7 -0
  198. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-bf16.cu +7 -0
  199. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-bf16.cu +7 -0
  200. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-bf16.cu +7 -0
  201. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-bf16.cu +7 -0
  202. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-bf16.cu +7 -0
  203. data/ext/sources/ggml/src/ggml-cuda/template-instances/mmq-instance-nvfp4.cu +5 -0
  204. data/ext/sources/ggml/src/ggml-cuda/template-instances/mmq-instance-q1_0.cu +5 -0
  205. data/ext/sources/ggml/src/ggml-cuda/top-k.cu +5 -4
  206. data/ext/sources/ggml/src/ggml-cuda/topk-moe.cu +33 -24
  207. data/ext/sources/ggml/src/ggml-cuda/unary.cu +31 -2
  208. data/ext/sources/ggml/src/ggml-cuda/unary.cuh +2 -0
  209. data/ext/sources/ggml/src/ggml-cuda/vecdotq.cuh +80 -0
  210. data/ext/sources/ggml/src/ggml-cuda/vendors/cuda.h +7 -2
  211. data/ext/sources/ggml/src/ggml-cuda/vendors/hip.h +23 -4
  212. data/ext/sources/ggml/src/ggml-cuda/vendors/musa.h +4 -0
  213. data/ext/sources/ggml/src/ggml-hexagon/CMakeLists.txt +1 -5
  214. data/ext/sources/ggml/src/ggml-hexagon/ggml-hexagon.cpp +2788 -1762
  215. data/ext/sources/ggml/src/ggml-hexagon/htp/CMakeLists.txt +13 -4
  216. data/ext/sources/ggml/src/ggml-hexagon/htp/act-ops.c +53 -84
  217. data/ext/sources/ggml/src/ggml-hexagon/htp/argsort-ops.c +25 -12
  218. data/ext/sources/ggml/src/ggml-hexagon/htp/binary-ops.c +165 -184
  219. data/ext/sources/ggml/src/ggml-hexagon/htp/cmake-toolchain.cmake +17 -19
  220. data/ext/sources/ggml/src/ggml-hexagon/htp/concat-ops.c +277 -0
  221. data/ext/sources/ggml/src/ggml-hexagon/htp/cpy-ops.c +170 -127
  222. data/ext/sources/ggml/src/ggml-hexagon/htp/cumsum-ops.c +270 -0
  223. data/ext/sources/ggml/src/ggml-hexagon/htp/diag-ops.c +216 -0
  224. data/ext/sources/ggml/src/ggml-hexagon/htp/fill-ops.c +123 -0
  225. data/ext/sources/ggml/src/ggml-hexagon/htp/flash-attn-ops.c +1774 -396
  226. data/ext/sources/ggml/src/ggml-hexagon/htp/flash-attn-ops.h +303 -0
  227. data/ext/sources/ggml/src/ggml-hexagon/htp/gated-delta-net-ops.c +1148 -0
  228. data/ext/sources/ggml/src/ggml-hexagon/htp/get-rows-ops.c +148 -42
  229. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-common.h +80 -0
  230. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-dma.c +2 -2
  231. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-dma.h +255 -62
  232. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-dump.h +9 -0
  233. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-profile.h +64 -0
  234. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-utils.h +25 -21
  235. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-fa-kernels.h +555 -0
  236. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-mm-kernels-tiled.h +1303 -0
  237. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-queue.c +167 -0
  238. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-queue.h +157 -0
  239. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-utils.h +222 -0
  240. data/ext/sources/ggml/src/ggml-hexagon/htp/htp-ctx.h +104 -13
  241. data/ext/sources/ggml/src/ggml-hexagon/htp/htp-ops.h +222 -57
  242. data/ext/sources/ggml/src/ggml-hexagon/htp/htp-vtcm.h +19 -0
  243. data/ext/sources/ggml/src/ggml-hexagon/htp/htp_iface.idl +10 -3
  244. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-base.h +78 -26
  245. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-copy.h +27 -10
  246. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-div.h +63 -23
  247. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-exp.h +48 -8
  248. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-fa-kernels.h +232 -0
  249. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-flash-attn.h +47 -0
  250. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-log.h +65 -0
  251. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-mm-kernels-flat.h +1511 -0
  252. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-mm-kernels-tiled.h +1200 -0
  253. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-pow.h +42 -0
  254. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-repl.h +74 -0
  255. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-sigmoid.h +40 -0
  256. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-sin-cos.h +90 -0
  257. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-utils.h +5 -8
  258. data/ext/sources/ggml/src/ggml-hexagon/htp/main.c +625 -816
  259. data/ext/sources/ggml/src/ggml-hexagon/htp/matmul-ops.c +3052 -2166
  260. data/ext/sources/ggml/src/ggml-hexagon/htp/matmul-ops.h +650 -0
  261. data/ext/sources/ggml/src/ggml-hexagon/htp/pad-ops.c +547 -0
  262. data/ext/sources/ggml/src/ggml-hexagon/htp/repeat-ops.c +148 -0
  263. data/ext/sources/ggml/src/ggml-hexagon/htp/rope-ops.c +337 -106
  264. data/ext/sources/ggml/src/ggml-hexagon/htp/set-rows-ops.c +59 -37
  265. data/ext/sources/ggml/src/ggml-hexagon/htp/softmax-ops.c +121 -133
  266. data/ext/sources/ggml/src/ggml-hexagon/htp/solve-tri-ops.c +267 -0
  267. data/ext/sources/ggml/src/ggml-hexagon/htp/ssm-conv.c +245 -151
  268. data/ext/sources/ggml/src/ggml-hexagon/htp/sum-rows-ops.c +6 -6
  269. data/ext/sources/ggml/src/ggml-hexagon/htp/unary-ops.c +719 -45
  270. data/ext/sources/ggml/src/ggml-hexagon/htp/worker-pool.c +15 -3
  271. data/ext/sources/ggml/src/ggml-hexagon/htp/worker-pool.h +8 -0
  272. data/ext/sources/ggml/src/ggml-hexagon/htp-opnode.h +390 -0
  273. data/ext/sources/ggml/src/ggml-hexagon/libggml-htp.inf +3 -5
  274. data/ext/sources/ggml/src/ggml-hip/CMakeLists.txt +27 -9
  275. data/ext/sources/ggml/src/ggml-impl.h +6 -1
  276. data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.cpp +207 -18
  277. data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.h +36 -2
  278. data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.m +186 -29
  279. data/ext/sources/ggml/src/ggml-metal/ggml-metal-impl.h +118 -0
  280. data/ext/sources/ggml/src/ggml-metal/ggml-metal-ops.cpp +322 -21
  281. data/ext/sources/ggml/src/ggml-metal/ggml-metal-ops.h +4 -0
  282. data/ext/sources/ggml/src/ggml-metal/ggml-metal.cpp +39 -26
  283. data/ext/sources/ggml/src/ggml-metal/ggml-metal.metal +1226 -467
  284. data/ext/sources/ggml/src/ggml-musa/CMakeLists.txt +5 -6
  285. data/ext/sources/ggml/src/ggml-opencl/CMakeLists.txt +67 -5
  286. data/ext/sources/ggml/src/ggml-opencl/fa_tune.h +92 -0
  287. data/ext/sources/ggml/src/ggml-opencl/ggml-opencl.cpp +16290 -6246
  288. data/ext/sources/ggml/src/ggml-opencl/kernels/concat.cl +67 -0
  289. data/ext/sources/ggml/src/ggml-opencl/kernels/cpy.cl +59 -0
  290. data/ext/sources/ggml/src/ggml-opencl/kernels/cvt.cl +1997 -92
  291. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f16.cl +81 -41
  292. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32.cl +88 -39
  293. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32_f16.cl +1995 -96
  294. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32_q4_0.cl +1615 -0
  295. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32_q8_0.cl +1486 -0
  296. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_pre_f16.cl +156 -0
  297. data/ext/sources/ggml/src/ggml-opencl/kernels/gated_delta_net.cl +249 -0
  298. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_mxfp4_f32_ns.cl +374 -0
  299. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q4_0_f32_ns.cl +324 -0
  300. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q4_1_f32_ns.cl +326 -0
  301. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q4_k_f32_ns.cl +348 -0
  302. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q5_0_f32_ns.cl +328 -0
  303. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q5_1_f32_ns.cl +330 -0
  304. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q5_k_f32_ns.cl +356 -0
  305. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q6_k_f32_ns.cl +335 -0
  306. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_iq4_nl_f32.cl +150 -0
  307. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q1_0_f32.cl +94 -0
  308. data/ext/sources/ggml/src/ggml-opencl/kernels/{mul_mat_Ab_Bi_8x4.cl → gemm_noshuffle_q4_0_f32.cl} +1 -1
  309. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q4_k_f32.cl +172 -0
  310. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q5_0_f32.cl +131 -0
  311. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q5_1_f32.cl +134 -0
  312. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q5_k_f32.cl +176 -0
  313. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q6_k_f32.cl +140 -0
  314. data/ext/sources/ggml/src/ggml-opencl/kernels/{mul_mm_q8_0_f32_8x4.cl → gemm_noshuffle_q8_0_f32.cl} +1 -1
  315. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_xmem_f16_f32_os8.cl +233 -0
  316. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_mxfp4_f32_ns.cl +165 -0
  317. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q4_0_f32_ns.cl +120 -0
  318. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q4_1_f32_ns.cl +123 -0
  319. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q4_k_f32_ns.cl +155 -0
  320. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q5_0_f32_ns.cl +123 -0
  321. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q5_1_f32_ns.cl +125 -0
  322. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q5_k_f32_ns.cl +160 -0
  323. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q6_k_f32_ns.cl +141 -0
  324. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_iq4_nl_f32.cl +302 -0
  325. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q1_0_f32.cl +121 -0
  326. data/ext/sources/ggml/src/ggml-opencl/kernels/{gemv_noshuffle_general.cl → gemv_noshuffle_q4_0_f32.cl} +5 -5
  327. data/ext/sources/ggml/src/ggml-opencl/kernels/{gemv_noshuffle.cl → gemv_noshuffle_q4_0_f32_spec.cl} +5 -5
  328. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q4_k_f32.cl +318 -0
  329. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q5_0_f32.cl +291 -0
  330. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q5_1_f32.cl +294 -0
  331. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q5_k_f32.cl +326 -0
  332. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q6_k_f32.cl +293 -0
  333. data/ext/sources/ggml/src/ggml-opencl/kernels/{gemv_noshuffle_general_q8_0_f32.cl → gemv_noshuffle_q8_0_f32.cl} +1 -1
  334. data/ext/sources/ggml/src/ggml-opencl/kernels/get_rows.cl +15 -9
  335. data/ext/sources/ggml/src/ggml-opencl/kernels/moe_reorder_b.cl +30 -0
  336. data/ext/sources/ggml/src/ggml-opencl/kernels/moe_sort_by_expert.cl +82 -0
  337. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_iq4_nl_f32_l4_lm.cl +171 -0
  338. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_q1_0_f32_l4_lm.cl +156 -0
  339. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_q4_k_f32_l4_lm.cl +179 -0
  340. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_q5_0_f32_l4_lm.cl +173 -0
  341. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_q5_1_f32_l4_lm.cl +175 -0
  342. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_q5_k_f32_l4_lm.cl +192 -0
  343. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_f16_f32_l4.cl +1149 -0
  344. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_iq4_nl_f32.cl +164 -0
  345. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_iq4_nl_f32_flat.cl +202 -0
  346. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q1_0_f32.cl +141 -0
  347. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q1_0_f32_flat.cl +190 -0
  348. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q4_k_f32_flat.cl +196 -0
  349. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_0_f32.cl +241 -0
  350. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_0_f32_flat.cl +243 -0
  351. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_1_f32.cl +243 -0
  352. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_1_f32_flat.cl +247 -0
  353. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_k_f32.cl +187 -0
  354. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_k_f32_flat.cl +203 -0
  355. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q6_k_f32_flat.cl +48 -64
  356. data/ext/sources/ggml/src/ggml-opencl/kernels/norm.cl +5 -2
  357. data/ext/sources/ggml/src/ggml-opencl/kernels/set_rows.cl +500 -0
  358. data/ext/sources/ggml/src/ggml-opencl/libdl.h +79 -0
  359. data/ext/sources/ggml/src/ggml-openvino/.clang-format +0 -5
  360. data/ext/sources/ggml/src/ggml-openvino/CMakeLists.txt +2 -4
  361. data/ext/sources/ggml/src/ggml-openvino/ggml-decoder.cpp +740 -127
  362. data/ext/sources/ggml/src/ggml-openvino/ggml-decoder.h +76 -23
  363. data/ext/sources/ggml/src/ggml-openvino/ggml-openvino-extra.cpp +75 -14
  364. data/ext/sources/ggml/src/ggml-openvino/ggml-openvino-extra.h +29 -8
  365. data/ext/sources/ggml/src/ggml-openvino/ggml-openvino.cpp +339 -69
  366. data/ext/sources/ggml/src/ggml-openvino/ggml-quants.cpp +330 -192
  367. data/ext/sources/ggml/src/ggml-openvino/ggml-quants.h +10 -4
  368. data/ext/sources/ggml/src/ggml-openvino/openvino/decoder.h +56 -16
  369. data/ext/sources/ggml/src/ggml-openvino/openvino/frontend.h +1 -1
  370. data/ext/sources/ggml/src/ggml-openvino/openvino/input_model.h +4 -4
  371. data/ext/sources/ggml/src/ggml-openvino/openvino/node_context.h +94 -37
  372. data/ext/sources/ggml/src/ggml-openvino/openvino/op/add_id.cpp +76 -0
  373. data/ext/sources/ggml/src/ggml-openvino/openvino/op/argsort.cpp +47 -0
  374. data/ext/sources/ggml/src/ggml-openvino/openvino/op/clamp.cpp +33 -0
  375. data/ext/sources/ggml/src/ggml-openvino/openvino/op/concat.cpp +48 -0
  376. data/ext/sources/ggml/src/ggml-openvino/openvino/op/cont.cpp +8 -16
  377. data/ext/sources/ggml/src/ggml-openvino/openvino/op/cpy.cpp +14 -1
  378. data/ext/sources/ggml/src/ggml-openvino/openvino/op/div.cpp +146 -0
  379. data/ext/sources/ggml/src/ggml-openvino/openvino/op/flash_attn_ext.cpp +108 -21
  380. data/ext/sources/ggml/src/ggml-openvino/openvino/op/gated_delta_net.cpp +282 -0
  381. data/ext/sources/ggml/src/ggml-openvino/openvino/op/gated_delta_net.hpp +65 -0
  382. data/ext/sources/ggml/src/ggml-openvino/openvino/op/get_rows.cpp +2 -9
  383. data/ext/sources/ggml/src/ggml-openvino/openvino/op/glu_geglu.cpp +21 -7
  384. data/ext/sources/ggml/src/ggml-openvino/openvino/op/glu_swiglu.cpp +41 -8
  385. data/ext/sources/ggml/src/ggml-openvino/openvino/op/im2col.cpp +120 -0
  386. data/ext/sources/ggml/src/ggml-openvino/openvino/op/l2_norm.cpp +44 -0
  387. data/ext/sources/ggml/src/ggml-openvino/openvino/op/mul_mat_id.cpp +226 -0
  388. data/ext/sources/ggml/src/ggml-openvino/openvino/op/mulmat.cpp +19 -9
  389. data/ext/sources/ggml/src/ggml-openvino/openvino/op/norm.cpp +58 -0
  390. data/ext/sources/ggml/src/ggml-openvino/openvino/op/pad.cpp +95 -0
  391. data/ext/sources/ggml/src/ggml-openvino/openvino/op/permute.cpp +58 -13
  392. data/ext/sources/ggml/src/ggml-openvino/openvino/op/repeat.cpp +74 -0
  393. data/ext/sources/ggml/src/ggml-openvino/openvino/op/reshape.cpp +13 -6
  394. data/ext/sources/ggml/src/ggml-openvino/openvino/op/rms_norm.cpp +1 -1
  395. data/ext/sources/ggml/src/ggml-openvino/openvino/op/rope.cpp +161 -39
  396. data/ext/sources/ggml/src/ggml-openvino/openvino/op/set_rows.cpp +3 -3
  397. data/ext/sources/ggml/src/ggml-openvino/openvino/op/softmax.cpp +126 -49
  398. data/ext/sources/ggml/src/ggml-openvino/openvino/op/ssm_conv.cpp +59 -0
  399. data/ext/sources/ggml/src/ggml-openvino/openvino/op/sum_rows.cpp +27 -0
  400. data/ext/sources/ggml/src/ggml-openvino/openvino/op/transpose.cpp +32 -1
  401. data/ext/sources/ggml/src/ggml-openvino/openvino/op/unary_silu.cpp +1 -1
  402. data/ext/sources/ggml/src/ggml-openvino/openvino/op/unary_softplus.cpp +38 -0
  403. data/ext/sources/ggml/src/ggml-openvino/openvino/op/view.cpp +90 -25
  404. data/ext/sources/ggml/src/ggml-openvino/openvino/op_table.cpp +41 -22
  405. data/ext/sources/ggml/src/ggml-openvino/openvino/op_table.h +18 -4
  406. data/ext/sources/ggml/src/ggml-openvino/openvino/pass/mark_decompression_convert_constant_folding.h +1 -1
  407. data/ext/sources/ggml/src/ggml-openvino/openvino/rt_info/weightless_caching_attributes.hpp +41 -0
  408. data/ext/sources/ggml/src/ggml-openvino/openvino/translate_session.cpp +70 -43
  409. data/ext/sources/ggml/src/ggml-openvino/openvino/translate_session.h +5 -4
  410. data/ext/sources/ggml/src/ggml-openvino/openvino/utils.cpp +612 -36
  411. data/ext/sources/ggml/src/ggml-openvino/openvino/utils.h +29 -26
  412. data/ext/sources/ggml/src/ggml-openvino/utils.cpp +460 -114
  413. data/ext/sources/ggml/src/ggml-openvino/utils.h +32 -9
  414. data/ext/sources/ggml/src/ggml-opt.cpp +1 -0
  415. data/ext/sources/ggml/src/ggml-quants.c +365 -114
  416. data/ext/sources/ggml/src/ggml-quants.h +6 -0
  417. data/ext/sources/ggml/src/ggml-rpc/CMakeLists.txt +24 -0
  418. data/ext/sources/ggml/src/ggml-rpc/ggml-rpc.cpp +167 -311
  419. data/ext/sources/ggml/src/ggml-rpc/transport.cpp +683 -0
  420. data/ext/sources/ggml/src/ggml-rpc/transport.h +34 -0
  421. data/ext/sources/ggml/src/ggml-sycl/CMakeLists.txt +50 -4
  422. data/ext/sources/ggml/src/ggml-sycl/add-id.cpp +1 -1
  423. data/ext/sources/ggml/src/ggml-sycl/backend.hpp +5 -1
  424. data/ext/sources/ggml/src/ggml-sycl/binbcast.cpp +12 -0
  425. data/ext/sources/ggml/src/ggml-sycl/col2im-1d.cpp +102 -0
  426. data/ext/sources/ggml/src/ggml-sycl/col2im-1d.hpp +8 -0
  427. data/ext/sources/ggml/src/ggml-sycl/common.cpp +72 -2
  428. data/ext/sources/ggml/src/ggml-sycl/common.hpp +59 -2
  429. data/ext/sources/ggml/src/ggml-sycl/concat.cpp +21 -1
  430. data/ext/sources/ggml/src/ggml-sycl/conv2d-dw.cpp +158 -0
  431. data/ext/sources/ggml/src/ggml-sycl/conv2d-dw.hpp +10 -0
  432. data/ext/sources/ggml/src/ggml-sycl/conv2d-transpose.cpp +125 -0
  433. data/ext/sources/ggml/src/ggml-sycl/conv2d-transpose.hpp +10 -0
  434. data/ext/sources/ggml/src/ggml-sycl/conv2d.cpp +150 -0
  435. data/ext/sources/ggml/src/ggml-sycl/conv2d.hpp +10 -0
  436. data/ext/sources/ggml/src/ggml-sycl/conv3d.cpp +224 -0
  437. data/ext/sources/ggml/src/ggml-sycl/conv3d.hpp +8 -0
  438. data/ext/sources/ggml/src/ggml-sycl/convert.cpp +121 -13
  439. data/ext/sources/ggml/src/ggml-sycl/convert.hpp +9 -0
  440. data/ext/sources/ggml/src/ggml-sycl/cpy.cpp +706 -0
  441. data/ext/sources/ggml/src/ggml-sycl/cpy.hpp +281 -0
  442. data/ext/sources/ggml/src/ggml-sycl/cross_entropy_loss.cpp +255 -0
  443. data/ext/sources/ggml/src/ggml-sycl/cross_entropy_loss.hpp +7 -0
  444. data/ext/sources/ggml/src/ggml-sycl/cumsum.cpp +148 -0
  445. data/ext/sources/ggml/src/ggml-sycl/cumsum.hpp +5 -0
  446. data/ext/sources/ggml/src/ggml-sycl/dequantize.hpp +678 -0
  447. data/ext/sources/ggml/src/ggml-sycl/diag.cpp +67 -0
  448. data/ext/sources/ggml/src/ggml-sycl/diag.hpp +5 -0
  449. data/ext/sources/ggml/src/ggml-sycl/dmmv.cpp +997 -244
  450. data/ext/sources/ggml/src/ggml-sycl/dpct/helper.hpp +15 -7
  451. data/ext/sources/ggml/src/ggml-sycl/element_wise.cpp +215 -204
  452. data/ext/sources/ggml/src/ggml-sycl/element_wise.hpp +2 -2
  453. data/ext/sources/ggml/src/ggml-sycl/fattn-buffers.cpp +56 -0
  454. data/ext/sources/ggml/src/ggml-sycl/fattn-buffers.hpp +63 -0
  455. data/ext/sources/ggml/src/ggml-sycl/fattn-common.hpp +7 -5
  456. data/ext/sources/ggml/src/ggml-sycl/fattn-tile.cpp +4 -0
  457. data/ext/sources/ggml/src/ggml-sycl/fattn-tile.hpp +76 -168
  458. data/ext/sources/ggml/src/ggml-sycl/fattn-vec.hpp +7 -0
  459. data/ext/sources/ggml/src/ggml-sycl/fattn.cpp +3 -1
  460. data/ext/sources/ggml/src/ggml-sycl/fill.cpp +55 -0
  461. data/ext/sources/ggml/src/ggml-sycl/fill.hpp +5 -0
  462. data/ext/sources/ggml/src/ggml-sycl/gated_delta_net.cpp +69 -31
  463. data/ext/sources/ggml/src/ggml-sycl/gated_delta_net.hpp +1 -0
  464. data/ext/sources/ggml/src/ggml-sycl/gemm.hpp +3 -0
  465. data/ext/sources/ggml/src/ggml-sycl/getrows.cpp +79 -3
  466. data/ext/sources/ggml/src/ggml-sycl/ggml-sycl.cpp +1758 -455
  467. data/ext/sources/ggml/src/ggml-sycl/im2col.cpp +353 -89
  468. data/ext/sources/ggml/src/ggml-sycl/im2col.hpp +5 -3
  469. data/ext/sources/ggml/src/ggml-sycl/mmvq.cpp +1542 -39
  470. data/ext/sources/ggml/src/ggml-sycl/mmvq.hpp +33 -0
  471. data/ext/sources/ggml/src/ggml-sycl/norm.cpp +103 -49
  472. data/ext/sources/ggml/src/ggml-sycl/outprod.cpp +45 -9
  473. data/ext/sources/ggml/src/ggml-sycl/pad.cpp +27 -27
  474. data/ext/sources/ggml/src/ggml-sycl/pool.cpp +185 -0
  475. data/ext/sources/ggml/src/ggml-sycl/pool.hpp +22 -0
  476. data/ext/sources/ggml/src/ggml-sycl/presets.hpp +3 -1
  477. data/ext/sources/ggml/src/ggml-sycl/quants.hpp +71 -0
  478. data/ext/sources/ggml/src/ggml-sycl/set_rows.cpp +17 -3
  479. data/ext/sources/ggml/src/ggml-sycl/softmax.cpp +9 -10
  480. data/ext/sources/ggml/src/ggml-sycl/solve_tri.cpp +172 -0
  481. data/ext/sources/ggml/src/ggml-sycl/solve_tri.hpp +8 -0
  482. data/ext/sources/ggml/src/ggml-sycl/ssm_conv.cpp +6 -1
  483. data/ext/sources/ggml/src/ggml-sycl/ssm_scan.cpp +156 -0
  484. data/ext/sources/ggml/src/ggml-sycl/ssm_scan.hpp +5 -0
  485. data/ext/sources/ggml/src/ggml-sycl/sycl_hw.cpp +62 -10
  486. data/ext/sources/ggml/src/ggml-sycl/sycl_hw.hpp +18 -6
  487. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-tile-instance-dkq512-dv512.cpp +6 -0
  488. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-f16.cpp +1 -0
  489. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-q4_0.cpp +1 -0
  490. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-q4_1.cpp +1 -0
  491. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-q5_0.cpp +1 -0
  492. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-q5_1.cpp +1 -0
  493. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-q8_0.cpp +1 -0
  494. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-f16.cpp +1 -0
  495. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-q4_0.cpp +1 -0
  496. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-q4_1.cpp +1 -0
  497. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-q5_0.cpp +1 -0
  498. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-q5_1.cpp +1 -0
  499. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-q8_0.cpp +1 -0
  500. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-f16.cpp +1 -0
  501. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-q4_0.cpp +1 -0
  502. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-q4_1.cpp +1 -0
  503. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-q5_0.cpp +1 -0
  504. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-q5_1.cpp +1 -0
  505. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-q8_0.cpp +1 -0
  506. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-f16.cpp +1 -0
  507. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-q4_0.cpp +1 -0
  508. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-q4_1.cpp +1 -0
  509. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-q5_0.cpp +1 -0
  510. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-q5_1.cpp +1 -0
  511. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-q8_0.cpp +1 -0
  512. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-f16.cpp +1 -0
  513. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-q4_0.cpp +1 -0
  514. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-q4_1.cpp +1 -0
  515. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-q5_0.cpp +1 -0
  516. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-q5_1.cpp +1 -0
  517. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-q8_0.cpp +1 -0
  518. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-f16.cpp +1 -0
  519. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-q4_0.cpp +1 -0
  520. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-q4_1.cpp +1 -0
  521. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-q5_0.cpp +1 -0
  522. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-q5_1.cpp +1 -0
  523. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-q8_0.cpp +1 -0
  524. data/ext/sources/ggml/src/ggml-sycl/type.hpp +112 -0
  525. data/ext/sources/ggml/src/ggml-sycl/upscale.cpp +410 -0
  526. data/ext/sources/ggml/src/ggml-sycl/upscale.hpp +9 -0
  527. data/ext/sources/ggml/src/ggml-sycl/vecdotq.hpp +242 -45
  528. data/ext/sources/ggml/src/ggml-virtgpu/ggml-backend-buffer.cpp +4 -0
  529. data/ext/sources/ggml/src/ggml-virtgpu/ggml-backend-device.cpp +2 -0
  530. data/ext/sources/ggml/src/ggml-virtgpu/ggml-backend.cpp +2 -0
  531. data/ext/sources/ggml/src/ggml-virtgpu/virtgpu-shm.cpp +1 -0
  532. data/ext/sources/ggml/src/ggml-virtgpu/virtgpu.cpp +1 -0
  533. data/ext/sources/ggml/src/ggml-virtgpu/virtgpu.h +0 -2
  534. data/ext/sources/ggml/src/ggml-vulkan/CMakeLists.txt +16 -0
  535. data/ext/sources/ggml/src/ggml-vulkan/ggml-vulkan.cpp +2843 -700
  536. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/CMakeLists.txt +4 -0
  537. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/col2im_1d.comp +61 -0
  538. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/contig_copy.comp +6 -2
  539. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/conv2d_mm.comp +146 -13
  540. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/conv3d_mm.comp +431 -0
  541. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/copy.comp +3 -1
  542. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/copy_from_quant.comp +1 -1
  543. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/copy_to_quant.comp +25 -1
  544. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs.glsl +88 -0
  545. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs_cm2.glsl +643 -1
  546. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_nvfp4.comp +32 -0
  547. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q1_0.comp +29 -0
  548. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/diag.comp +3 -4
  549. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dot_product_funcs.glsl +27 -0
  550. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/feature-tests/coopmat2_decode_vector.comp +7 -0
  551. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn.comp +198 -48
  552. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_base.glsl +60 -59
  553. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_cm1.comp +116 -113
  554. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_cm2.comp +122 -31
  555. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_dequant.glsl +131 -0
  556. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_mmq_funcs.glsl +203 -0
  557. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/fwht.comp +115 -0
  558. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/gated_delta_net.comp +125 -64
  559. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/generic_binary_head.glsl +0 -1
  560. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/generic_unary_head.glsl +21 -19
  561. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/get_rows_back.comp +25 -0
  562. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/glu_head.glsl +29 -1
  563. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/glu_main.glsl +17 -11
  564. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/im2col.comp +76 -54
  565. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/im2col_3d.comp +0 -1
  566. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/l2_norm.comp +4 -7
  567. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/log.comp +0 -1
  568. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec.comp +122 -27
  569. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iface.glsl +6 -6
  570. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q2_k.comp +1 -1
  571. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q4_k.comp +1 -1
  572. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q5_k.comp +1 -1
  573. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vecq.comp +22 -24
  574. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vecq_funcs.glsl +88 -55
  575. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm.comp +42 -40
  576. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_cm2.comp +49 -15
  577. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_funcs.glsl +222 -171
  578. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_funcs.glsl +8 -8
  579. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_shmem_types.glsl +24 -9
  580. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/multi_add.comp +0 -1
  581. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/norm.comp +10 -10
  582. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/repeat_back.comp +3 -3
  583. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/roll.comp +3 -3
  584. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/rope_funcs.glsl +5 -2
  585. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/rope_head.glsl +0 -1
  586. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/rope_params.glsl +3 -2
  587. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/snake.comp +49 -0
  588. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/ssm_conv.comp +11 -1
  589. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/tri.comp +3 -4
  590. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/types.glsl +79 -2
  591. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/unary.comp +168 -0
  592. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp +282 -211
  593. data/ext/sources/ggml/src/ggml-webgpu/CMakeLists.txt +5 -2
  594. data/ext/sources/ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp +2209 -283
  595. data/ext/sources/ggml/src/ggml-webgpu/ggml-webgpu.cpp +2618 -1416
  596. data/ext/sources/ggml/src/ggml-webgpu/pre_wgsl.hpp +37 -7
  597. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/add_id.wgsl +64 -0
  598. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/binary.wgsl +8 -7
  599. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/common_decls.tmpl +90 -95
  600. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/concat.wgsl +19 -1
  601. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/conv2d.wgsl +165 -0
  602. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/{cpy.tmpl.wgsl → cpy.wgsl} +25 -50
  603. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn.wgsl +107 -184
  604. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn_quant_staging.tmpl +124 -0
  605. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn_tile.wgsl +397 -0
  606. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn_vec_blk.wgsl +101 -0
  607. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn_vec_reduce.wgsl +84 -0
  608. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn_vec_split.wgsl +619 -0
  609. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/gated_delta_net.wgsl +149 -0
  610. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/get_rows.wgsl +204 -78
  611. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/glu.wgsl +155 -0
  612. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/im2col.wgsl +101 -0
  613. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_decls.tmpl +805 -526
  614. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_id.wgsl +195 -0
  615. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_id_gather.wgsl +52 -0
  616. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_id_vec.wgsl +154 -0
  617. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_reg_tile.wgsl +8 -6
  618. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_subgroup_matrix.wgsl +5 -1
  619. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec.wgsl +90 -413
  620. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_acc.tmpl +1553 -0
  621. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_q_acc.tmpl +297 -0
  622. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/quant_inner_loops.tmpl +21 -0
  623. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/quantize_q8.wgsl +178 -0
  624. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/rms_norm_mul.wgsl +152 -0
  625. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/{rope.tmpl.wgsl → rope.wgsl} +71 -142
  626. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/row_norm.wgsl +153 -0
  627. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/scale.wgsl +6 -4
  628. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/set.wgsl +109 -0
  629. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/set_rows.wgsl +2 -3
  630. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/set_rows_quant.wgsl +224 -0
  631. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/{soft_max.tmpl.wgsl → soft_max.wgsl} +106 -206
  632. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/solve_tri.wgsl +121 -0
  633. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/ssm_conv.wgsl +65 -0
  634. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/ssm_scan.wgsl +193 -0
  635. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/unary.wgsl +68 -48
  636. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/upscale.wgsl +240 -0
  637. data/ext/sources/ggml/src/ggml-zdnn/ggml-zdnn.cpp +18 -14
  638. data/ext/sources/ggml/src/ggml-zendnn/CMakeLists.txt +1 -1
  639. data/ext/sources/ggml/src/ggml-zendnn/ggml-zendnn.cpp +244 -10
  640. data/ext/sources/ggml/src/ggml.c +146 -42
  641. data/ext/sources/ggml/src/gguf.cpp +173 -28
  642. data/ext/sources/include/parakeet.h +342 -0
  643. data/ext/sources/include/whisper.h +31 -0
  644. data/ext/sources/media/matmul.png +0 -0
  645. data/ext/sources/src/CMakeLists.txt +23 -0
  646. data/ext/sources/src/parakeet-arch.h +188 -0
  647. data/ext/sources/src/parakeet.cpp +3838 -0
  648. data/ext/sources/src/whisper.cpp +220 -26
  649. data/extsources.rb +26 -10
  650. data/lib/whisper/log_settable.rb +33 -0
  651. data/lib/whisper/model/uri.rb +13 -8
  652. data/lib/whisper/output.rb +74 -0
  653. data/sig/whisper.rbs +417 -62
  654. data/test/helper.rb +2 -0
  655. data/test/jfk_reader/jfk_reader.c +50 -7
  656. data/test/test_callback.rb +1 -0
  657. data/test/test_package.rb +6 -5
  658. data/test/test_parakeet.rb +28 -0
  659. data/test/test_parakeet_callback.rb +107 -0
  660. data/test/test_parakeet_context.rb +116 -0
  661. data/test/test_parakeet_context_params.rb +24 -0
  662. data/test/test_parakeet_model.rb +21 -0
  663. data/test/test_parakeet_params.rb +78 -0
  664. data/test/test_parakeet_segment.rb +42 -0
  665. data/test/test_parakeet_token.rb +73 -0
  666. data/test/test_params.rb +2 -0
  667. data/test/test_vad.rb +9 -0
  668. data/test/test_vad_context.rb +2 -2
  669. data/test/test_vad_segment.rb +1 -1
  670. data/test/test_whisper.rb +24 -6
  671. data/whispercpp.gemspec +2 -2
  672. metadata +263 -304
  673. data/ext/sources/bindings/javascript/CMakeLists.txt +0 -41
  674. data/ext/sources/bindings/javascript/emscripten.cpp +0 -93
  675. data/ext/sources/bindings/javascript/libwhisper.worker.js +0 -1
  676. data/ext/sources/bindings/javascript/package.json +0 -26
  677. data/ext/sources/bindings/javascript/whisper.js +0 -19
  678. data/ext/sources/examples/addon.node/CMakeLists.txt +0 -31
  679. data/ext/sources/examples/addon.node/__test__/whisper.spec.js +0 -133
  680. data/ext/sources/examples/addon.node/addon.cpp +0 -557
  681. data/ext/sources/examples/addon.node/index.js +0 -59
  682. data/ext/sources/examples/addon.node/package.json +0 -16
  683. data/ext/sources/examples/addon.node/vad-example.js +0 -132
  684. data/ext/sources/examples/bench.wasm/CMakeLists.txt +0 -49
  685. data/ext/sources/examples/bench.wasm/emscripten.cpp +0 -87
  686. data/ext/sources/examples/bench.wasm/index-tmpl.html +0 -285
  687. data/ext/sources/examples/coi-serviceworker.js +0 -146
  688. data/ext/sources/examples/command/CMakeLists.txt +0 -10
  689. data/ext/sources/examples/command/command.cpp +0 -802
  690. data/ext/sources/examples/command/commands.txt +0 -9
  691. data/ext/sources/examples/command.wasm/CMakeLists.txt +0 -50
  692. data/ext/sources/examples/command.wasm/emscripten.cpp +0 -327
  693. data/ext/sources/examples/command.wasm/index-tmpl.html +0 -415
  694. data/ext/sources/examples/generate-karaoke.sh +0 -57
  695. data/ext/sources/examples/helpers.js +0 -191
  696. data/ext/sources/examples/livestream.sh +0 -112
  697. data/ext/sources/examples/lsp/CMakeLists.txt +0 -10
  698. data/ext/sources/examples/lsp/lsp.cpp +0 -471
  699. data/ext/sources/examples/lsp/whisper.vim +0 -362
  700. data/ext/sources/examples/python/test_whisper_processor.py +0 -7
  701. data/ext/sources/examples/python/whisper_processor.py +0 -54
  702. data/ext/sources/examples/server/bench.js +0 -29
  703. data/ext/sources/examples/server.py +0 -120
  704. data/ext/sources/examples/stream/CMakeLists.txt +0 -10
  705. data/ext/sources/examples/stream/stream.cpp +0 -437
  706. data/ext/sources/examples/stream.wasm/CMakeLists.txt +0 -49
  707. data/ext/sources/examples/stream.wasm/emscripten.cpp +0 -216
  708. data/ext/sources/examples/stream.wasm/index-tmpl.html +0 -491
  709. data/ext/sources/examples/sycl/CMakeLists.txt +0 -9
  710. data/ext/sources/examples/sycl/build.sh +0 -22
  711. data/ext/sources/examples/sycl/ls-sycl-device.cpp +0 -11
  712. data/ext/sources/examples/sycl/run-whisper.sh +0 -17
  713. data/ext/sources/examples/talk-llama/CMakeLists.txt +0 -48
  714. data/ext/sources/examples/talk-llama/eleven-labs.py +0 -80
  715. data/ext/sources/examples/talk-llama/llama-adapter.cpp +0 -488
  716. data/ext/sources/examples/talk-llama/llama-adapter.h +0 -89
  717. data/ext/sources/examples/talk-llama/llama-arch.cpp +0 -2877
  718. data/ext/sources/examples/talk-llama/llama-arch.h +0 -628
  719. data/ext/sources/examples/talk-llama/llama-batch.cpp +0 -919
  720. data/ext/sources/examples/talk-llama/llama-batch.h +0 -173
  721. data/ext/sources/examples/talk-llama/llama-chat.cpp +0 -896
  722. data/ext/sources/examples/talk-llama/llama-chat.h +0 -71
  723. data/ext/sources/examples/talk-llama/llama-context.cpp +0 -3633
  724. data/ext/sources/examples/talk-llama/llama-context.h +0 -359
  725. data/ext/sources/examples/talk-llama/llama-cparams.cpp +0 -5
  726. data/ext/sources/examples/talk-llama/llama-cparams.h +0 -47
  727. data/ext/sources/examples/talk-llama/llama-ext.h +0 -12
  728. data/ext/sources/examples/talk-llama/llama-grammar.cpp +0 -1464
  729. data/ext/sources/examples/talk-llama/llama-grammar.h +0 -194
  730. data/ext/sources/examples/talk-llama/llama-graph.cpp +0 -2735
  731. data/ext/sources/examples/talk-llama/llama-graph.h +0 -1031
  732. data/ext/sources/examples/talk-llama/llama-hparams.cpp +0 -258
  733. data/ext/sources/examples/talk-llama/llama-hparams.h +0 -353
  734. data/ext/sources/examples/talk-llama/llama-impl.cpp +0 -171
  735. data/ext/sources/examples/talk-llama/llama-impl.h +0 -75
  736. data/ext/sources/examples/talk-llama/llama-io.cpp +0 -15
  737. data/ext/sources/examples/talk-llama/llama-io.h +0 -35
  738. data/ext/sources/examples/talk-llama/llama-kv-cache-iswa.cpp +0 -330
  739. data/ext/sources/examples/talk-llama/llama-kv-cache-iswa.h +0 -137
  740. data/ext/sources/examples/talk-llama/llama-kv-cache.cpp +0 -2285
  741. data/ext/sources/examples/talk-llama/llama-kv-cache.h +0 -389
  742. data/ext/sources/examples/talk-llama/llama-kv-cells.h +0 -533
  743. data/ext/sources/examples/talk-llama/llama-memory-hybrid-iswa.cpp +0 -275
  744. data/ext/sources/examples/talk-llama/llama-memory-hybrid-iswa.h +0 -140
  745. data/ext/sources/examples/talk-llama/llama-memory-hybrid.cpp +0 -268
  746. data/ext/sources/examples/talk-llama/llama-memory-hybrid.h +0 -139
  747. data/ext/sources/examples/talk-llama/llama-memory-recurrent.cpp +0 -1165
  748. data/ext/sources/examples/talk-llama/llama-memory-recurrent.h +0 -182
  749. data/ext/sources/examples/talk-llama/llama-memory.cpp +0 -59
  750. data/ext/sources/examples/talk-llama/llama-memory.h +0 -122
  751. data/ext/sources/examples/talk-llama/llama-mmap.cpp +0 -752
  752. data/ext/sources/examples/talk-llama/llama-mmap.h +0 -73
  753. data/ext/sources/examples/talk-llama/llama-model-loader.cpp +0 -1655
  754. data/ext/sources/examples/talk-llama/llama-model-loader.h +0 -206
  755. data/ext/sources/examples/talk-llama/llama-model-saver.cpp +0 -299
  756. data/ext/sources/examples/talk-llama/llama-model-saver.h +0 -40
  757. data/ext/sources/examples/talk-llama/llama-model.cpp +0 -9056
  758. data/ext/sources/examples/talk-llama/llama-model.h +0 -597
  759. data/ext/sources/examples/talk-llama/llama-quant.cpp +0 -1304
  760. data/ext/sources/examples/talk-llama/llama-quant.h +0 -1
  761. data/ext/sources/examples/talk-llama/llama-sampler.cpp +0 -3885
  762. data/ext/sources/examples/talk-llama/llama-sampler.h +0 -42
  763. data/ext/sources/examples/talk-llama/llama-vocab.cpp +0 -3970
  764. data/ext/sources/examples/talk-llama/llama-vocab.h +0 -187
  765. data/ext/sources/examples/talk-llama/llama.cpp +0 -1194
  766. data/ext/sources/examples/talk-llama/llama.h +0 -1573
  767. data/ext/sources/examples/talk-llama/models/afmoe.cpp +0 -190
  768. data/ext/sources/examples/talk-llama/models/apertus.cpp +0 -125
  769. data/ext/sources/examples/talk-llama/models/arcee.cpp +0 -135
  770. data/ext/sources/examples/talk-llama/models/arctic.cpp +0 -137
  771. data/ext/sources/examples/talk-llama/models/arwkv7.cpp +0 -86
  772. data/ext/sources/examples/talk-llama/models/baichuan.cpp +0 -123
  773. data/ext/sources/examples/talk-llama/models/bailingmoe.cpp +0 -143
  774. data/ext/sources/examples/talk-llama/models/bailingmoe2.cpp +0 -133
  775. data/ext/sources/examples/talk-llama/models/bert.cpp +0 -184
  776. data/ext/sources/examples/talk-llama/models/bitnet.cpp +0 -145
  777. data/ext/sources/examples/talk-llama/models/bloom.cpp +0 -101
  778. data/ext/sources/examples/talk-llama/models/chameleon.cpp +0 -178
  779. data/ext/sources/examples/talk-llama/models/chatglm.cpp +0 -132
  780. data/ext/sources/examples/talk-llama/models/codeshell.cpp +0 -111
  781. data/ext/sources/examples/talk-llama/models/cogvlm.cpp +0 -102
  782. data/ext/sources/examples/talk-llama/models/cohere2-iswa.cpp +0 -134
  783. data/ext/sources/examples/talk-llama/models/command-r.cpp +0 -122
  784. data/ext/sources/examples/talk-llama/models/dbrx.cpp +0 -122
  785. data/ext/sources/examples/talk-llama/models/deci.cpp +0 -135
  786. data/ext/sources/examples/talk-llama/models/deepseek.cpp +0 -142
  787. data/ext/sources/examples/talk-llama/models/deepseek2.cpp +0 -262
  788. data/ext/sources/examples/talk-llama/models/delta-net-base.cpp +0 -445
  789. data/ext/sources/examples/talk-llama/models/dots1.cpp +0 -132
  790. data/ext/sources/examples/talk-llama/models/dream.cpp +0 -105
  791. data/ext/sources/examples/talk-llama/models/ernie4-5-moe.cpp +0 -148
  792. data/ext/sources/examples/talk-llama/models/ernie4-5.cpp +0 -110
  793. data/ext/sources/examples/talk-llama/models/eurobert.cpp +0 -97
  794. data/ext/sources/examples/talk-llama/models/exaone-moe.cpp +0 -145
  795. data/ext/sources/examples/talk-llama/models/exaone.cpp +0 -114
  796. data/ext/sources/examples/talk-llama/models/exaone4.cpp +0 -123
  797. data/ext/sources/examples/talk-llama/models/falcon-h1.cpp +0 -111
  798. data/ext/sources/examples/talk-llama/models/falcon.cpp +0 -120
  799. data/ext/sources/examples/talk-llama/models/gemma-embedding.cpp +0 -116
  800. data/ext/sources/examples/talk-llama/models/gemma.cpp +0 -112
  801. data/ext/sources/examples/talk-llama/models/gemma2-iswa.cpp +0 -128
  802. data/ext/sources/examples/talk-llama/models/gemma3.cpp +0 -155
  803. data/ext/sources/examples/talk-llama/models/gemma3n-iswa.cpp +0 -384
  804. data/ext/sources/examples/talk-llama/models/glm4-moe.cpp +0 -170
  805. data/ext/sources/examples/talk-llama/models/glm4.cpp +0 -157
  806. data/ext/sources/examples/talk-llama/models/gpt2.cpp +0 -105
  807. data/ext/sources/examples/talk-llama/models/gptneox.cpp +0 -144
  808. data/ext/sources/examples/talk-llama/models/granite-hybrid.cpp +0 -195
  809. data/ext/sources/examples/talk-llama/models/granite.cpp +0 -210
  810. data/ext/sources/examples/talk-llama/models/grok.cpp +0 -159
  811. data/ext/sources/examples/talk-llama/models/grovemoe.cpp +0 -139
  812. data/ext/sources/examples/talk-llama/models/hunyuan-dense.cpp +0 -132
  813. data/ext/sources/examples/talk-llama/models/hunyuan-moe.cpp +0 -153
  814. data/ext/sources/examples/talk-llama/models/internlm2.cpp +0 -120
  815. data/ext/sources/examples/talk-llama/models/jais.cpp +0 -86
  816. data/ext/sources/examples/talk-llama/models/jais2.cpp +0 -123
  817. data/ext/sources/examples/talk-llama/models/jamba.cpp +0 -106
  818. data/ext/sources/examples/talk-llama/models/kimi-linear.cpp +0 -381
  819. data/ext/sources/examples/talk-llama/models/lfm2.cpp +0 -196
  820. data/ext/sources/examples/talk-llama/models/llada-moe.cpp +0 -122
  821. data/ext/sources/examples/talk-llama/models/llada.cpp +0 -99
  822. data/ext/sources/examples/talk-llama/models/llama-iswa.cpp +0 -178
  823. data/ext/sources/examples/talk-llama/models/llama.cpp +0 -175
  824. data/ext/sources/examples/talk-llama/models/maincoder.cpp +0 -117
  825. data/ext/sources/examples/talk-llama/models/mamba-base.cpp +0 -289
  826. data/ext/sources/examples/talk-llama/models/mamba.cpp +0 -54
  827. data/ext/sources/examples/talk-llama/models/mimo2-iswa.cpp +0 -129
  828. data/ext/sources/examples/talk-llama/models/minicpm3.cpp +0 -200
  829. data/ext/sources/examples/talk-llama/models/minimax-m2.cpp +0 -123
  830. data/ext/sources/examples/talk-llama/models/mistral3.cpp +0 -160
  831. data/ext/sources/examples/talk-llama/models/models.h +0 -704
  832. data/ext/sources/examples/talk-llama/models/modern-bert.cpp +0 -109
  833. data/ext/sources/examples/talk-llama/models/mpt.cpp +0 -126
  834. data/ext/sources/examples/talk-llama/models/nemotron-h.cpp +0 -162
  835. data/ext/sources/examples/talk-llama/models/nemotron.cpp +0 -122
  836. data/ext/sources/examples/talk-llama/models/neo-bert.cpp +0 -104
  837. data/ext/sources/examples/talk-llama/models/olmo.cpp +0 -121
  838. data/ext/sources/examples/talk-llama/models/olmo2.cpp +0 -150
  839. data/ext/sources/examples/talk-llama/models/olmoe.cpp +0 -124
  840. data/ext/sources/examples/talk-llama/models/openai-moe-iswa.cpp +0 -127
  841. data/ext/sources/examples/talk-llama/models/openelm.cpp +0 -124
  842. data/ext/sources/examples/talk-llama/models/orion.cpp +0 -123
  843. data/ext/sources/examples/talk-llama/models/paddleocr.cpp +0 -122
  844. data/ext/sources/examples/talk-llama/models/pangu-embedded.cpp +0 -121
  845. data/ext/sources/examples/talk-llama/models/phi2.cpp +0 -121
  846. data/ext/sources/examples/talk-llama/models/phi3.cpp +0 -152
  847. data/ext/sources/examples/talk-llama/models/plamo.cpp +0 -110
  848. data/ext/sources/examples/talk-llama/models/plamo2.cpp +0 -320
  849. data/ext/sources/examples/talk-llama/models/plamo3.cpp +0 -128
  850. data/ext/sources/examples/talk-llama/models/plm.cpp +0 -169
  851. data/ext/sources/examples/talk-llama/models/qwen.cpp +0 -108
  852. data/ext/sources/examples/talk-llama/models/qwen2.cpp +0 -126
  853. data/ext/sources/examples/talk-llama/models/qwen2moe.cpp +0 -151
  854. data/ext/sources/examples/talk-llama/models/qwen2vl.cpp +0 -117
  855. data/ext/sources/examples/talk-llama/models/qwen3.cpp +0 -120
  856. data/ext/sources/examples/talk-llama/models/qwen35.cpp +0 -381
  857. data/ext/sources/examples/talk-llama/models/qwen35moe.cpp +0 -422
  858. data/ext/sources/examples/talk-llama/models/qwen3moe.cpp +0 -131
  859. data/ext/sources/examples/talk-llama/models/qwen3next.cpp +0 -525
  860. data/ext/sources/examples/talk-llama/models/qwen3vl-moe.cpp +0 -140
  861. data/ext/sources/examples/talk-llama/models/qwen3vl.cpp +0 -132
  862. data/ext/sources/examples/talk-llama/models/refact.cpp +0 -94
  863. data/ext/sources/examples/talk-llama/models/rnd1.cpp +0 -126
  864. data/ext/sources/examples/talk-llama/models/rwkv6-base.cpp +0 -164
  865. data/ext/sources/examples/talk-llama/models/rwkv6.cpp +0 -94
  866. data/ext/sources/examples/talk-llama/models/rwkv6qwen2.cpp +0 -86
  867. data/ext/sources/examples/talk-llama/models/rwkv7-base.cpp +0 -137
  868. data/ext/sources/examples/talk-llama/models/rwkv7.cpp +0 -90
  869. data/ext/sources/examples/talk-llama/models/seed-oss.cpp +0 -124
  870. data/ext/sources/examples/talk-llama/models/smallthinker.cpp +0 -126
  871. data/ext/sources/examples/talk-llama/models/smollm3.cpp +0 -128
  872. data/ext/sources/examples/talk-llama/models/stablelm.cpp +0 -146
  873. data/ext/sources/examples/talk-llama/models/starcoder.cpp +0 -100
  874. data/ext/sources/examples/talk-llama/models/starcoder2.cpp +0 -121
  875. data/ext/sources/examples/talk-llama/models/step35-iswa.cpp +0 -165
  876. data/ext/sources/examples/talk-llama/models/t5-dec.cpp +0 -166
  877. data/ext/sources/examples/talk-llama/models/t5-enc.cpp +0 -96
  878. data/ext/sources/examples/talk-llama/models/wavtokenizer-dec.cpp +0 -149
  879. data/ext/sources/examples/talk-llama/models/xverse.cpp +0 -108
  880. data/ext/sources/examples/talk-llama/prompts/talk-alpaca.txt +0 -23
  881. data/ext/sources/examples/talk-llama/speak +0 -40
  882. data/ext/sources/examples/talk-llama/speak.bat +0 -1
  883. data/ext/sources/examples/talk-llama/speak.ps1 +0 -14
  884. data/ext/sources/examples/talk-llama/talk-llama.cpp +0 -813
  885. data/ext/sources/examples/talk-llama/unicode-data.cpp +0 -7034
  886. data/ext/sources/examples/talk-llama/unicode-data.h +0 -20
  887. data/ext/sources/examples/talk-llama/unicode.cpp +0 -1103
  888. data/ext/sources/examples/talk-llama/unicode.h +0 -111
  889. data/ext/sources/examples/wchess/CMakeLists.txt +0 -10
  890. data/ext/sources/examples/wchess/libwchess/CMakeLists.txt +0 -19
  891. data/ext/sources/examples/wchess/libwchess/Chessboard.cpp +0 -803
  892. data/ext/sources/examples/wchess/libwchess/Chessboard.h +0 -33
  893. data/ext/sources/examples/wchess/libwchess/WChess.cpp +0 -193
  894. data/ext/sources/examples/wchess/libwchess/WChess.h +0 -63
  895. data/ext/sources/examples/wchess/libwchess/test-chessboard.cpp +0 -117
  896. data/ext/sources/examples/wchess/wchess.cmd/CMakeLists.txt +0 -8
  897. data/ext/sources/examples/wchess/wchess.cmd/wchess.cmd.cpp +0 -253
  898. data/ext/sources/examples/whisper.wasm/CMakeLists.txt +0 -50
  899. data/ext/sources/examples/whisper.wasm/emscripten.cpp +0 -118
  900. data/ext/sources/examples/whisper.wasm/index-tmpl.html +0 -659
  901. data/ext/sources/ggml/src/ggml-cuda/template-instances/generate_cu_files.py +0 -99
  902. data/ext/sources/ggml/src/ggml-hexagon/htp/htp-msg.h +0 -155
  903. data/ext/sources/ggml/src/ggml-hexagon/op-desc.h +0 -153
  904. data/ext/sources/ggml/src/ggml-opencl/kernels/embed_kernel.py +0 -26
  905. data/ext/sources/ggml/src/ggml-openvino/openvino/pass/eliminate_zp.cpp +0 -123
  906. data/ext/sources/ggml/src/ggml-openvino/openvino/pass/eliminate_zp.h +0 -17
  907. data/ext/sources/ggml/src/ggml-virtgpu/regenerate_remoting.py +0 -333
  908. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/abs.comp +0 -21
  909. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/ceil.comp +0 -22
  910. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/clamp.comp +0 -17
  911. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/cos.comp +0 -17
  912. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/elu.comp +0 -27
  913. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/exp.comp +0 -21
  914. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/floor.comp +0 -22
  915. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/gelu.comp +0 -25
  916. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/gelu_erf.comp +0 -39
  917. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/gelu_quick.comp +0 -23
  918. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/hardsigmoid.comp +0 -22
  919. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/hardswish.comp +0 -22
  920. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/leaky_relu.comp +0 -22
  921. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/neg.comp +0 -20
  922. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/relu.comp +0 -21
  923. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/round.comp +0 -29
  924. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/rte.glsl +0 -5
  925. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sgn.comp +0 -21
  926. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sigmoid.comp +0 -20
  927. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/silu.comp +0 -22
  928. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sin.comp +0 -17
  929. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/softplus.comp +0 -23
  930. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sqrt.comp +0 -17
  931. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/square.comp +0 -17
  932. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/step.comp +0 -22
  933. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/tanh.comp +0 -20
  934. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/trunc.comp +0 -22
  935. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/xielu.comp +0 -35
  936. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/embed_wgsl.py +0 -182
  937. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/glu.tmpl.wgsl +0 -323
  938. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat.wgsl +0 -718
  939. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/rms_norm.wgsl +0 -123
  940. data/ext/sources/tests/CMakeLists.txt +0 -112
  941. data/ext/sources/tests/earnings21/eval.mk +0 -58
  942. data/ext/sources/tests/earnings21/eval.py +0 -68
  943. data/ext/sources/tests/earnings21/normalizers/__init__.py +0 -2
  944. data/ext/sources/tests/earnings21/normalizers/basic.py +0 -80
  945. data/ext/sources/tests/earnings21/normalizers/english.json +0 -1741
  946. data/ext/sources/tests/earnings21/normalizers/english.py +0 -550
  947. data/ext/sources/tests/earnings21/requirements.txt +0 -6
  948. data/ext/sources/tests/en-0-ref.txt +0 -1
  949. data/ext/sources/tests/en-1-ref.txt +0 -1
  950. data/ext/sources/tests/en-2-ref.txt +0 -1
  951. data/ext/sources/tests/es-0-ref.txt +0 -1
  952. data/ext/sources/tests/librispeech/eval.mk +0 -39
  953. data/ext/sources/tests/librispeech/eval.py +0 -47
  954. data/ext/sources/tests/librispeech/normalizers/__init__.py +0 -2
  955. data/ext/sources/tests/librispeech/normalizers/basic.py +0 -80
  956. data/ext/sources/tests/librispeech/normalizers/english.json +0 -1741
  957. data/ext/sources/tests/librispeech/normalizers/english.py +0 -550
  958. data/ext/sources/tests/librispeech/requirements.txt +0 -6
  959. data/ext/sources/tests/run-tests.sh +0 -130
  960. data/ext/sources/tests/test-c.c +0 -3
  961. data/ext/sources/tests/test-vad-full.cpp +0 -56
  962. data/ext/sources/tests/test-vad.cpp +0 -83
  963. data/ext/sources/tests/test-whisper.js +0 -58
  964. data/lib/whisper/context.rb +0 -15
  965. data/lib/whisper/segment.rb +0 -58
@@ -1,25 +1,21 @@
1
1
  #include "ggml-decoder.h"
2
2
 
3
- #include "ggml-backend-impl.h"
4
- #include "ggml-backend.h"
3
+ #include "ggml-impl.h"
5
4
  #include "ggml-openvino-extra.h"
6
5
  #include "ggml-openvino.h"
7
6
  #include "ggml-quants.h"
8
-
9
- #include <ggml-impl.h>
10
- #include <ggml.h>
7
+ #include "ggml.h"
8
+ #include "utils.h"
11
9
 
12
10
  #include <algorithm>
13
11
  #include <cassert>
14
12
  #include <cstddef>
15
13
  #include <cstdint>
16
14
  #include <cstdlib>
17
- #include <execution>
18
15
  #include <fstream>
19
16
  #include <iomanip>
20
17
  #include <map>
21
18
  #include <memory>
22
- #include <mutex>
23
19
  #include <openvino/core/dimension.hpp>
24
20
  #include <openvino/core/except.hpp>
25
21
  #include <openvino/core/node.hpp>
@@ -31,12 +27,10 @@
31
27
  #include <openvino/op/convert.hpp>
32
28
  #include <openvino/op/parameter.hpp>
33
29
  #include <openvino/runtime/tensor.hpp>
34
- #include <optional>
35
30
  #include <ostream>
36
31
  #include <set>
37
32
  #include <stdexcept>
38
33
  #include <string>
39
- #include <unordered_map>
40
34
  #include <vector>
41
35
 
42
36
  GgmlOvDecoder::GgmlOvDecoder(ggml_cgraph * cgraph,
@@ -45,6 +39,7 @@ GgmlOvDecoder::GgmlOvDecoder(ggml_cgraph * cgraph,
45
39
  std::map<std::string, std::shared_ptr<ov::Node>> & model_weights,
46
40
  bool is_static,
47
41
  bool is_stateful,
42
+ bool model_is_splitted,
48
43
  bool is_prefill,
49
44
  int prefill_chunk_size) :
50
45
  m_is_static(is_static),
@@ -52,22 +47,23 @@ GgmlOvDecoder::GgmlOvDecoder(ggml_cgraph * cgraph,
52
47
  m_is_prefill(is_prefill),
53
48
  m_naive(false),
54
49
  m_prefill_chunk_size(prefill_chunk_size),
50
+ m_model_is_splitted(model_is_splitted),
55
51
  m_cgraph(cgraph),
56
52
  m_model_weights(model_weights),
57
53
  m_model_params(model_params),
58
54
  m_compute_params(compute_params) {
59
- if (auto * env = getenv("GGML_OPENVINO_PRINT_CGRAPH_TENSOR_ADDRESS"); env && std::string(env) != "0") {
60
- #ifdef _WIN32
61
- _putenv_s("GGML_OPENVINO_PRINT_CGRAPH_TENSOR_ADDRESS", "");
62
- #else
63
- unsetenv("GGML_OPENVINO_PRINT_CGRAPH_TENSOR_ADDRESS");
64
- #endif
65
- print_tensor_address_map(cgraph);
55
+ static bool printed_address_map = false;
56
+ if (!printed_address_map) {
57
+ if (ggml_openvino_getenv_int("GGML_OPENVINO_PRINT_CGRAPH_TENSOR_ADDRESS")) {
58
+ printed_address_map = true;
59
+ print_tensor_address_map(cgraph);
60
+ }
66
61
  }
67
62
 
68
63
  validate_cgraph();
69
64
 
70
65
  set_input_output();
66
+ compute_node_dynamic_dims();
71
67
  compute_model_inputs();
72
68
  compute_model_outputs();
73
69
 
@@ -137,6 +133,29 @@ void GgmlOvDecoder::set_input_output() {
137
133
  }
138
134
  current_node_info.node_inputs[src_name] = src;
139
135
  current_node_info.node_inputs_names.push_back(src_name);
136
+
137
+ if (src->op == GGML_OP_VIEW) {
138
+ // Traverse upward through nested VIEW operations
139
+ std::remove_reference_t<decltype(current_node_info.node_inputs_views[src_name])> view_chain;
140
+ auto current = src;
141
+
142
+ while (current != nullptr) {
143
+ auto current_name = std::string(current->name);
144
+ if (current->flags & GGML_TENSOR_FLAG_INPUT) {
145
+ current_name = get_graph_input_ov_name(current, node);
146
+ }
147
+ view_chain.emplace_back(current_name, current);
148
+ // If current src is also a VIEW, continue traversing
149
+ if (current->src[0] != nullptr && current->src[0]->op == GGML_OP_VIEW) {
150
+ current = current->src[0];
151
+ } else {
152
+ break;
153
+ }
154
+ }
155
+
156
+ // Assign all collected view inputs to node_inputs_views
157
+ current_node_info.node_inputs_views[src_name] = view_chain;
158
+ }
140
159
  }
141
160
 
142
161
  m_node_info_list.push_back(current_node_info);
@@ -157,20 +176,13 @@ int GgmlOvDecoder::compute_op_case(const ggml_tensor * node) const {
157
176
  if (src->ne[2] * src->ne[3] == node->ne[1]) {
158
177
  op_case = 5;
159
178
  }
160
- } else if (src->ne[0] * src->ne[1] == node->ne[1]) {
179
+ } else if (src->ne[0] * src->ne[1] * src->ne[2] == node->ne[1]) {
161
180
  op_case = 3;
162
181
  } else if (src->ne[1] * src->ne[2] == node->ne[1]) {
163
182
  op_case = 6;
164
183
  }
165
- break;
166
- }
167
- case GGML_OP_CONT: {
168
- if (node->src[0]->op == GGML_OP_PERMUTE) {
169
- op_case = 1;
170
- } else if (node->src[0]->op == GGML_OP_TRANSPOSE) {
171
- op_case = 2;
172
- } else if (node->src[0]->op == GGML_OP_VIEW) {
173
- op_case = 3;
184
+ if (op_case == 0 && ggml_nelements(node) == ggml_nelements(src)) {
185
+ op_case = 6;
174
186
  }
175
187
  break;
176
188
  }
@@ -180,23 +192,41 @@ int GgmlOvDecoder::compute_op_case(const ggml_tensor * node) const {
180
192
  } else if (node->src[0]->src[0]->op == GGML_OP_NONE) {
181
193
  // kv cache tensor
182
194
  std::string src_name(node->view_src->name);
183
- int layer = extract_layer_from_name(src_name);
184
- if (!is_swa_layer(layer)) {
185
- op_case = 2;
195
+ int layer = extract_layer_from_name(src_name).value();
196
+ if (ggml_is_contiguous(node->src[0])) {
197
+ // - 19: [ 64, 8, 256, 1] VIEW cache_k_l0 (view) [ 2, 128, 1024, 1048576]
198
+ // [ 512, 1024, 1, 1] 0: NONE cache_k_l0 [ 2, 1024, 1048576, 1048576]
199
+ // - 20: [ 64, 256, 8, 1] PERMUTE cache_k_l0 (view) (permuted) [ 2, 1024, 128, 1048576]
200
+ // [ 64, 8, 256, 1] 0: VIEW cache_k_l0 (view) [ 2, 128, 1024, 1048576]
201
+ if (!is_swa_layer(layer)) {
202
+ op_case = 3;
203
+ } else {
204
+ op_case = 4;
205
+ }
186
206
  } else {
187
- op_case = 3;
207
+ // special case of cache v when `-fa off`
208
+ // - 17: [ 256, 8, 64, 1] VIEW cache_v_l0 (view) [ 2, 131072, 2048, 1048576]
209
+ // [ 512, 1024, 1, 1] 0: NONE cache_v_l0 [ 2, 1024, 1048576, 1048576]
210
+ // - 18: [ 256, 64, 8, 1] PERMUTE cache_v_l0 (view) (permuted) [ 2, 2048, 131072, 1048576]
211
+ // [ 256, 8, 64, 1] 0: VIEW cache_v_l0 (view) [ 2, 131072, 2048, 1048576]
212
+ if (!is_swa_layer(layer)) {
213
+ op_case = 5;
214
+ } else {
215
+ op_case = 6;
216
+ }
188
217
  }
189
218
  } else {
190
219
  // rope'ed query tensor
191
- op_case = 4;
220
+ op_case = 2;
192
221
  }
193
222
  break;
194
223
  }
195
224
  case GGML_OP_MUL_MAT: {
196
- if (node->src[0]->op == GGML_OP_CONT && node->src[0]->src[0]->op == GGML_OP_TRANSPOSE) {
197
- op_case = 2;
198
- } else if (node->src[0]->op == GGML_OP_VIEW && node->src[1]->op == GGML_OP_VIEW) {
225
+ if (node->src[0]->op == GGML_OP_VIEW && node->src[1]->op == GGML_OP_VIEW) {
199
226
  op_case = 3;
227
+ } else if (node->src[1]->op == GGML_OP_SOFT_MAX) {
228
+ // In the case of `-fa off`, softmax is used, v_trans=true, the dynamic dim is ne[0] for cache_v
229
+ op_case = 2;
200
230
  }
201
231
  break;
202
232
  }
@@ -207,8 +237,19 @@ int GgmlOvDecoder::compute_op_case(const ggml_tensor * node) const {
207
237
  break;
208
238
  }
209
239
  case GGML_OP_ROPE: {
210
- if (node->src[0]->op == GGML_OP_VIEW) {
240
+ const int mode = node->op_params[2];
241
+ switch (mode) {
242
+ case GGML_ROPE_TYPE_NEOX: {
243
+ op_case = 1;
244
+ break;
245
+ }
246
+ case GGML_ROPE_TYPE_IMROPE: {
211
247
  op_case = 2;
248
+ break;
249
+ }
250
+ default:
251
+ op_case = 0;
252
+ break;
212
253
  }
213
254
  break;
214
255
  }
@@ -216,22 +257,39 @@ int GgmlOvDecoder::compute_op_case(const ggml_tensor * node) const {
216
257
  if (node->src[0]->op == GGML_OP_VIEW) {
217
258
  auto * src = node->src[0];
218
259
  if (ggml_nelements(node) != ggml_nelements(src)) {
219
- throw std::runtime_error("Unsupported VIEW case");
260
+ // throw std::runtime_error("Unsupported VIEW case");
261
+ }
262
+ op_case = 0;
263
+ if (m_model_is_splitted && m_model_inputs.find(std::string(src->name)) != m_model_inputs.end()) {
264
+ op_case = 0;
220
265
  }
221
- op_case = 2;
222
266
  }
223
267
  {
224
268
  auto * src = node->src[0];
225
- if ((ggml_nelements(node) != ggml_nelements(src)) && m_naive) {
226
- // Compare each dimension of node and src, if only one dimension differs then op_case=3
269
+ if (ggml_nelements(node) != ggml_nelements(src)) {
270
+ // Case 4: select one slice on src dim1 (via view offset), keep src dim2 as output dim1.
271
+ // Typical pattern:
272
+ // src: ne=[N, M, K, 1], nb=[b0, b1, b2, b3]
273
+ // dst: ne=[N, K, 1, 1], nb=[b0, b2, b3, b3]
274
+ if (node->ne[0] == src->ne[0] && node->ne[1] == src->ne[2] && node->ne[2] == 1 &&
275
+ node->nb[0] == src->nb[0] && node->nb[1] == src->nb[2] && src->ne[1] > 1) {
276
+ op_case = 0;
277
+ break;
278
+ }
279
+
280
+ // General case 3: shape differs from source (one or more dims) and is handled as VIEW slicing.
227
281
  int diff_count = 0;
228
282
  for (int i = 0; i < GGML_MAX_DIMS; i++) {
229
283
  if (node->ne[i] != src->ne[i]) {
230
284
  diff_count++;
231
285
  }
286
+ // if node ne[i] > src ne[i], case = 0
287
+ if (node->ne[i] > src->ne[i]) {
288
+ return 0;
289
+ }
232
290
  }
233
- if (diff_count == 1) {
234
- op_case = 3;
291
+ if (diff_count >= 1) {
292
+ op_case = 0;
235
293
  }
236
294
  }
237
295
  }
@@ -243,9 +301,11 @@ int GgmlOvDecoder::compute_op_case(const ggml_tensor * node) const {
243
301
  return op_case;
244
302
  }
245
303
 
246
- int extract_layer_from_name(const std::string & name) {
304
+ std::optional<int> extract_layer_from_name(const std::string & name) {
247
305
  size_t pos1 = name.find("_l");
248
- assert(pos1 != std::string::npos);
306
+ if (pos1 == std::string::npos) {
307
+ return std::nullopt;
308
+ }
249
309
  pos1 += 2;
250
310
  size_t pos2 = name.find(' ', pos1);
251
311
  if (pos2 == std::string::npos) {
@@ -259,26 +319,101 @@ int extract_layer_from_name(const std::string & name) {
259
319
  std::pair<ModelParams, ComputeParams> GgmlOvDecoder::compute_llm_params(ggml_cgraph * cgraph, bool is_static) {
260
320
  ModelParams model_params;
261
321
  ComputeParams compute_params;
322
+ auto get_attention_pattern_case = [](const ggml_tensor * node) -> int {
323
+ if (node == nullptr) {
324
+ return -1;
325
+ }
326
+
327
+ switch (node->op) {
328
+ case GGML_OP_FLASH_ATTN_EXT:
329
+ if (node->src[0] == nullptr || node->src[1] == nullptr || node->src[3] == nullptr) {
330
+ return -1;
331
+ }
332
+ switch (node->src[1]->op) {
333
+ case GGML_OP_PERMUTE:
334
+ // case 0: node op is FLASH_ATTN_EXT, src 1 not null & op is PERMUTE & the permuted tensor src is the view of cache k
335
+ if (node->src[1]->src[0] != nullptr && node->src[1]->src[0]->op == GGML_OP_VIEW) {
336
+ return 0;
337
+ }
338
+ break;
339
+ case GGML_OP_CPY:
340
+ // case 1: node op is FLASH_ATTN_EXT, src 1 not null & op is CPY & the copied tensor src is PERMUTE & the permuted tensor src is the view of cache k
341
+ if (node->src[1]->src[0] != nullptr && node->src[1]->src[0]->op == GGML_OP_PERMUTE &&
342
+ node->src[1]->src[0]->src[0] != nullptr && node->src[1]->src[0]->src[0]->op == GGML_OP_VIEW) {
343
+ return 1;
344
+ }
345
+ break;
346
+ default:
347
+ break;
348
+ }
349
+ break;
350
+ case GGML_OP_SOFT_MAX:
351
+ // case 2: node op is SOFT_MAX, src 0 not null & op is MUL_MAT & the src 0 of MUL_MAT is PERMUTE & the permuted tensor src is the view of cache k
352
+ if (node->src[0] != nullptr && node->src[1] != nullptr && node->src[0]->op == GGML_OP_MUL_MAT &&
353
+ node->src[0]->src[0] != nullptr && node->src[0]->src[1] != nullptr &&
354
+ node->src[0]->src[0]->op == GGML_OP_PERMUTE && node->src[0]->src[0]->src[0] != nullptr &&
355
+ node->src[0]->src[0]->src[0]->op == GGML_OP_VIEW) {
356
+ return 2;
357
+ }
358
+ // case 3: node op is SOFT_MAX, src 0 not null & op is ADD & the src 0 of ADD is MUL_MAT & the src 0 of MUL_MAT is PERMUTE
359
+ if (node->src[0]->op == GGML_OP_ADD && node->src[0]->src[0] != nullptr &&
360
+ node->src[0]->src[0]->op == GGML_OP_MUL_MAT && node->src[0]->src[0]->src[0] != nullptr &&
361
+ node->src[0]->src[0]->src[0]->op == GGML_OP_PERMUTE) {
362
+ return 3;
363
+ }
364
+ break;
365
+ default:
366
+ break;
367
+ }
368
+
369
+ return -1;
370
+ };
371
+
372
+ bool rope_seen = false;
262
373
  for (int i = 0; i < cgraph->n_nodes; i++) {
263
374
  auto * node = cgraph->nodes[i];
264
375
  std::string name = std::string(node->name);
265
- if (node->op == GGML_OP_FLASH_ATTN_EXT) {
266
- model_params.n_heads = node->src[0]->ne[2];
267
- model_params.n_heads_kv = node->src[1]->ne[2];
268
- model_params.head_size = node->src[0]->ne[0];
376
+ const int attention_pattern_case = get_attention_pattern_case(node);
377
+ if (attention_pattern_case != -1) {
378
+ ggml_tensor * cache_k_permute = nullptr;
379
+ ggml_tensor * mask = nullptr;
380
+
381
+ switch (attention_pattern_case) {
382
+ case 0:
383
+ cache_k_permute = node->src[1];
384
+ mask = node->src[3];
385
+ break;
386
+ case 1:
387
+ cache_k_permute = node->src[1]->src[0];
388
+ mask = node->src[3];
389
+ break;
390
+ case 2:
391
+ cache_k_permute = node->src[0]->src[0];
392
+ mask = node->src[1];
393
+ break;
394
+ case 3:
395
+ cache_k_permute = node->src[0]->src[0]->src[0];
396
+ mask = node->src[1];
397
+ break;
398
+ default:
399
+ break;
400
+ }
401
+
402
+ assert(cache_k_permute != nullptr);
403
+
404
+ model_params.head_size = cache_k_permute->ne[0];
405
+ model_params.n_heads_kv = cache_k_permute->ne[2];
269
406
  compute_params.input_len = node->src[0]->ne[1];
407
+ compute_params.token_len_per_seq = node->src[0]->ne[1];
270
408
 
271
- auto * cache_k_perm = node->src[1];
272
- if (cache_k_perm->op == GGML_OP_CPY) {
273
- cache_k_perm = cache_k_perm->src[0];
409
+ auto * cache_k_view = cache_k_permute->src[0];
410
+ if (cache_k_view->op != GGML_OP_VIEW || mask == nullptr) {
411
+ continue;
274
412
  }
275
- assert(cache_k_perm->op == GGML_OP_PERMUTE);
276
- auto * cache_k_view = cache_k_perm->src[0];
277
- assert(cache_k_view->op == GGML_OP_VIEW);
278
413
 
279
- auto * cache_k = cache_k_view->src[0];
280
- int layer = extract_layer_from_name(cache_k->name);
281
- auto * mask = node->src[3];
414
+ ggml_tensor * cache_k = cache_k_view->src[0];
415
+ int layer = extract_layer_from_name(cache_k->name).value();
416
+
282
417
  std::string mask_name(mask->name);
283
418
 
284
419
  model_params.kv_buffer_ctx_id = ggml_backend_openvino_buffer_get_ctx_id(cache_k->buffer);
@@ -295,7 +430,6 @@ std::pair<ModelParams, ComputeParams> GgmlOvDecoder::compute_llm_params(ggml_cgr
295
430
  size_t offset;
296
431
  memcpy(&offset, cache_k_view->op_params, sizeof(size_t));
297
432
  compute_params.seq_active_start = offset / seq_size;
298
- compute_params.token_len_per_seq = node->ne[2];
299
433
 
300
434
  if (mask_name.find("swa") != std::string::npos) {
301
435
  compute_params.attention_size_swa = mask->ne[0];
@@ -307,10 +441,40 @@ std::pair<ModelParams, ComputeParams> GgmlOvDecoder::compute_llm_params(ggml_cgr
307
441
  compute_params.attention_size_swa = model_params.ctx_per_seq_swa;
308
442
  compute_params.token_len_per_seq = 1;
309
443
  }
310
- break;
444
+ }
445
+
446
+ if (node->op == GGML_OP_MUL_MAT && node->src[0]->op == GGML_OP_PERMUTE &&
447
+ node->src[0]->src[0]->op == GGML_OP_VIEW && is_kvcache(node->src[0]->view_src, node->view_src)) {
448
+ if (node->src[1]->op == GGML_OP_PERMUTE && node->src[1]->src[0]->op == GGML_OP_VIEW &&
449
+ node->src[1]->src[0]->src[0]->op == GGML_OP_ROPE) {
450
+ compute_params.attention_size = node->ne[0];
451
+ }
452
+ }
453
+
454
+ // if the node op is TRANSPOSE and its input is PERMUTE and the source of the PERMUTE is VIEW, then get the attention size with the TRANSPOSE node ne[0] (in case no GGML_OP_FLASH_ATTN_EXT)
455
+ if (node->op == GGML_OP_TRANSPOSE && node->src[0]->op == GGML_OP_PERMUTE &&
456
+ node->src[0]->src[0]->op == GGML_OP_VIEW) {
457
+ compute_params.attention_size = node->ne[0];
458
+ if (is_static) {
459
+ compute_params.attention_size = model_params.ctx_per_seq;
460
+ }
311
461
  }
312
462
  if (node->op == GGML_OP_ROPE) {
313
- memcpy(model_params.rope_params, node->op_params, sizeof(int32_t) * 15);
463
+ if (compute_params.token_len_per_seq == -1 && node->src[1] != nullptr) {
464
+ compute_params.token_len_per_seq = ggml_nelements(node->src[1]);
465
+ }
466
+
467
+ // When multiple ROPE ops in the graph disagree on op_params (e.g. gemma4's
468
+ // mixed SWA/non-SWA layers with different n_dims or freq_base), we cannot
469
+ // share a single precomputed rope_sin/rope_cos. Track divergence so the
470
+ // translator falls back to per-op make_sin_cos in that case.
471
+ static_assert(sizeof(model_params.rope_params) == sizeof(int32_t) * 15, "rope_params size");
472
+ if (!rope_seen) {
473
+ memcpy(model_params.rope_params, node->op_params, sizeof(int32_t) * 15);
474
+ rope_seen = true;
475
+ } else if (memcmp(model_params.rope_params, node->op_params, sizeof(int32_t) * 15) != 0) {
476
+ model_params.mixed_rope_params = true;
477
+ }
314
478
  }
315
479
  }
316
480
  auto * output_tensor = cgraph->nodes[cgraph->n_nodes - 1];
@@ -320,7 +484,6 @@ std::pair<ModelParams, ComputeParams> GgmlOvDecoder::compute_llm_params(ggml_cgr
320
484
  compute_params.output_len = 1;
321
485
  }
322
486
  model_params.ctx = model_params.ctx_per_seq * model_params.n_seq;
323
- model_params.ctx_swa = model_params.ctx_per_seq_swa * model_params.n_seq;
324
487
  return {model_params, compute_params};
325
488
  }
326
489
 
@@ -330,9 +493,11 @@ void GgmlOvDecoder::validate_cgraph() const {
330
493
  }
331
494
  }
332
495
 
333
- ov::PartialShape GgmlOvDecoder::get_graph_input_shape(const ggml_tensor * op, const ggml_tensor * input) const {
496
+ ov::PartialShape GgmlOvDecoder::get_graph_input_shape(const ggml_tensor * op,
497
+ const ggml_tensor * input,
498
+ int dynamic_dim_index) const {
334
499
  if (m_naive) {
335
- return input!= nullptr ? ov::PartialShape{get_shape(input)} : ov::PartialShape{get_shape(op)};
500
+ return input != nullptr ? ov::PartialShape{get_shape(input)} : ov::PartialShape{get_shape(op)};
336
501
  }
337
502
  auto name = std::string(input->name);
338
503
  ov::PartialShape input_shape;
@@ -381,6 +546,15 @@ ov::PartialShape GgmlOvDecoder::get_graph_input_shape(const ggml_tensor * op, co
381
546
  } else {
382
547
  input_shape = ov::PartialShape{get_shape(input)};
383
548
  }
549
+ if (dynamic_dim_index != -1 && m_model_is_splitted) {
550
+ input_shape[3 - dynamic_dim_index] = -1;
551
+ }
552
+ if (op->op == GGML_OP_SOFT_MAX && op->src[1] != nullptr && op->src[1]->op == GGML_OP_NONE &&
553
+ op->src[1]->flags & GGML_TENSOR_FLAG_INPUT && op->src[1] == input) {
554
+ // for softmax input mask, the shape is [1, 1, seq_active, seq_active], where seq_active is determined by the input active sequence length instead of the kv cache sequence length
555
+ input_shape[2] = -1;
556
+ input_shape[3] = -1;
557
+ }
384
558
  return input_shape;
385
559
  }
386
560
 
@@ -408,15 +582,19 @@ void GgmlOvDecoder::add_extra_inputs() {
408
582
  }
409
583
  };
410
584
 
411
- create_1d_input("attention_size", m_compute_params.attention_size);
585
+ if (m_compute_params.attention_size != -1) {
586
+ create_1d_input("attention_size", m_compute_params.attention_size);
587
+ }
412
588
  if (m_compute_params.attention_size_swa != -1) {
413
589
  create_1d_input("attention_size_swa", m_compute_params.attention_size_swa);
414
590
  }
415
591
  create_1d_input("n_seq_active", m_compute_params.n_seq_active);
416
592
  create_1d_input("seq_active_start", m_compute_params.seq_active_start);
417
593
  create_1d_input("seq_active_end", m_compute_params.seq_active_start + m_compute_params.n_seq_active);
418
- create_1d_input("token_len_per_seq", m_compute_params.token_len_per_seq);
419
- // create_1d_input("token_len", m_token_len_per_seq * m_n_seq_active);
594
+ if (m_compute_params.token_len_per_seq != -1) {
595
+ create_1d_input("token_len_per_seq", m_compute_params.token_len_per_seq);
596
+ }
597
+ // create_1d_input("token_len", m_compute_params.token_len_per_seq * m_compute_params.n_seq_active);
420
598
  }
421
599
 
422
600
  bool GgmlOvDecoder::node_is_used_as_src(const int node_idx) {
@@ -442,8 +620,8 @@ void GgmlOvDecoder::compute_model_inputs() {
442
620
  std::string node_name(node->name);
443
621
  if (m_model_weights.find(node_name) == m_model_weights.end()) {
444
622
  m_inputs[node_name] = node;
445
- auto param_node =
446
- std::make_shared<ov::op::v0::Parameter>(get_ov_type(node), get_graph_input_shape(node, nullptr));
623
+ auto param_node = std::make_shared<ov::op::v0::Parameter>(
624
+ get_ov_type(node), get_graph_input_shape(node, nullptr, m_node_dynamic_dims[node]));
447
625
  param_node->set_friendly_name(node_name);
448
626
  param_node->output(0).get_tensor().set_names({node_name});
449
627
  m_model_inputs[node_name] = param_node;
@@ -487,7 +665,13 @@ void GgmlOvDecoder::compute_model_inputs() {
487
665
  m_model_params.kv_names.push_back(src_name);
488
666
  }
489
667
  }
490
- ov::PartialShape param_shape = get_graph_input_shape(node, src);
668
+ // Resolve nested VIEW nodes by following src[0] until the first non-VIEW tensor.
669
+ while (src->op == GGML_OP_VIEW && src->src[0] != nullptr) {
670
+ src = src->src[0];
671
+ src_name = std::string(src->name);
672
+ }
673
+ m_inputs[src_name] = src;
674
+ ov::PartialShape param_shape = get_graph_input_shape(node, src, m_node_dynamic_dims[src]);
491
675
  auto param_node = std::make_shared<ov::op::v0::Parameter>(get_ov_type(src), param_shape);
492
676
  param_node->set_friendly_name(src_name);
493
677
  param_node->output(0).get_tensor().set_names({src_name});
@@ -502,7 +686,7 @@ void GgmlOvDecoder::compute_model_outputs() {
502
686
  for (int node_n = 0; node_n < m_cgraph->n_nodes; node_n++) {
503
687
  auto * cur_node = m_cgraph->nodes[node_n];
504
688
  // if the node op is NONE means this node is not used at all, we can skip it directly without adding to model outputs.
505
- if (cur_node->op == GGML_OP_NONE) {
689
+ if (cur_node->op == GGML_OP_NONE || cur_node->op == GGML_OP_VIEW || cur_node->op == GGML_OP_RESHAPE) {
506
690
  continue;
507
691
  }
508
692
  auto cur_node_use_count = m_cgraph->use_counts[ggml_hash_find(&m_cgraph->visited_hash_set, cur_node)];
@@ -573,9 +757,6 @@ std::map<std::string, std::string> GgmlOvDecoder::get_kv_param_res_names() const
573
757
  }
574
758
 
575
759
  std::map<std::string, std::shared_ptr<ov::Node>> GgmlOvDecoder::create_weight_nodes(ggml_cgraph * cgraph, bool naive) {
576
- static std::mutex weights_mutex;
577
- std::lock_guard<std::mutex> lock(weights_mutex);
578
-
579
760
  std::map<std::string, std::shared_ptr<ov::Node>> model_weights;
580
761
  auto * nodes = cgraph->nodes;
581
762
  auto n_nodes = cgraph->n_nodes;
@@ -634,15 +815,26 @@ std::shared_ptr<ov::Node> GgmlOvDecoder::create_weight_node(ggml_tensor * tensor
634
815
  }
635
816
  }
636
817
 
818
+ // MUL_MAT_ID expert weights are 3D GGML tensors [k, m, n_expert].
819
+ // Keep the full reversed 4D shape when materializing non-quantized constants,
820
+ // otherwise the expert dimension is collapsed and later Gather/MatMul logic
821
+ // only sees a single expert slice.
822
+ if (!ggml_is_quantized(tensor->type) && (tensor->ne[2] > 1 || tensor->ne[3] > 1)) {
823
+ auto weight_tensor = ov::Tensor(get_ov_type(tensor), get_shape(tensor), tensor->data);
824
+ auto weight_node = std::make_shared<ov::op::v0::Constant>(weight_tensor);
825
+ weight_node->set_friendly_name(tensor->name);
826
+ return weight_node;
827
+ }
828
+
637
829
  // There are three cases where we need to create a new weight node:
638
830
  // 1. weights are in openvino_host_buffer. Weight loading to host buffer will not trigger backend_buffer_set_tensor
639
831
  // 2. weights are in cpu/cpu_mapped buffer. On token_embd.weight goes to case 1 or 2, depending on whether mmap or direct_io is used
640
832
  // 3. test-backend-ops. buffers in test-backend-ops does not set USAGE_WEIGHT so backend_buffer_set_tensor will not create weight node
641
833
 
642
834
  // GGML_LOG_DEBUG("%s: creating new weight node for %s\n", __func__, tensor->name);
643
- static const std::set<ggml_type> weight_types = {GGML_TYPE_F32, GGML_TYPE_F16, GGML_TYPE_BF16,
644
- GGML_TYPE_Q8_0, GGML_TYPE_Q4_0, GGML_TYPE_Q4_1,
645
- GGML_TYPE_Q4_K, GGML_TYPE_Q5_K, GGML_TYPE_Q6_K};
835
+ static const std::set<ggml_type> weight_types = {GGML_TYPE_F32, GGML_TYPE_F16, GGML_TYPE_BF16, GGML_TYPE_Q8_0,
836
+ GGML_TYPE_Q4_0, GGML_TYPE_Q4_1, GGML_TYPE_Q5_1, GGML_TYPE_Q4_K,
837
+ GGML_TYPE_Q5_K, GGML_TYPE_Q6_K};
646
838
  if (weight_types.find(tensor->type) == weight_types.end()) {
647
839
  throw std::runtime_error("Unexpected weight tensor type: " + std::string(tensor->name) + " with type " +
648
840
  ggml_type_name(tensor->type));
@@ -850,6 +1042,161 @@ std::vector<size_t> GgmlOvDecoder::get_input_stride(int node_idx, const std::str
850
1042
  return get_stride(m_node_info_list[node_idx].node_inputs.at(name));
851
1043
  }
852
1044
 
1045
+ size_t GgmlOvDecoder::get_view_input_size(int node_idx, const std::string & name) const {
1046
+ auto it = m_node_info_list[node_idx].node_inputs_views.find(name);
1047
+ if (it != m_node_info_list[node_idx].node_inputs_views.end()) {
1048
+ return it->second.size();
1049
+ }
1050
+ return 0;
1051
+ }
1052
+
1053
+ size_t GgmlOvDecoder::get_view_input_offset(int node_idx, const std::string & name, size_t view_index) const {
1054
+ auto it = m_node_info_list[node_idx].node_inputs_views.find(name);
1055
+ if (it != m_node_info_list[node_idx].node_inputs_views.end()) {
1056
+ if (view_index < it->second.size()) {
1057
+ return it->second[view_index].second->view_offs;
1058
+ }
1059
+ }
1060
+ return 0;
1061
+ }
1062
+
1063
+ size_t GgmlOvDecoder::get_view_input_src_offset(int node_idx, const std::string & name, size_t view_index) const {
1064
+ auto it = m_node_info_list[node_idx].node_inputs_views.find(name);
1065
+ if (it != m_node_info_list[node_idx].node_inputs_views.end()) {
1066
+ if (view_index < it->second.size()) {
1067
+ auto * view_tensor = it->second[view_index].second;
1068
+ if (view_tensor && view_tensor->src[0]) {
1069
+ return view_tensor->src[0]->view_offs;
1070
+ }
1071
+ }
1072
+ }
1073
+ return 0;
1074
+ }
1075
+
1076
+ std::vector<size_t> GgmlOvDecoder::get_view_input_stride(int node_idx,
1077
+ const std::string & name,
1078
+ size_t view_index) const {
1079
+ auto it = m_node_info_list[node_idx].node_inputs_views.find(name);
1080
+ if (it != m_node_info_list[node_idx].node_inputs_views.end()) {
1081
+ if (view_index < it->second.size()) {
1082
+ return get_stride(it->second[view_index].second);
1083
+ }
1084
+ }
1085
+ return {};
1086
+ }
1087
+
1088
+ std::vector<size_t> GgmlOvDecoder::get_view_input_src_stride(int node_idx,
1089
+ const std::string & name,
1090
+ size_t view_index) const {
1091
+ auto it = m_node_info_list[node_idx].node_inputs_views.find(name);
1092
+ if (it != m_node_info_list[node_idx].node_inputs_views.end()) {
1093
+ if (view_index < it->second.size()) {
1094
+ auto * view_tensor = it->second[view_index].second;
1095
+ if (view_tensor && view_tensor->src[0]) {
1096
+ return get_stride(view_tensor->src[0]);
1097
+ }
1098
+ }
1099
+ }
1100
+ return {};
1101
+ }
1102
+
1103
+ ov::Shape GgmlOvDecoder::get_view_input_ggml_shape(int node_idx, const std::string & name, size_t view_index) const {
1104
+ auto it = m_node_info_list[node_idx].node_inputs_views.find(name);
1105
+ if (it != m_node_info_list[node_idx].node_inputs_views.end()) {
1106
+ if (view_index < it->second.size()) {
1107
+ return get_shape(it->second[view_index].second);
1108
+ }
1109
+ }
1110
+ return {};
1111
+ }
1112
+
1113
+ ov::Shape GgmlOvDecoder::get_view_input_src_ggml_shape(int node_idx,
1114
+ const std::string & name,
1115
+ size_t view_index) const {
1116
+ auto it = m_node_info_list[node_idx].node_inputs_views.find(name);
1117
+ if (it != m_node_info_list[node_idx].node_inputs_views.end()) {
1118
+ if (view_index < it->second.size()) {
1119
+ auto * view_tensor = it->second[view_index].second;
1120
+ if (view_tensor && view_tensor->src[0]) {
1121
+ return get_shape(view_tensor->src[0]);
1122
+ }
1123
+ }
1124
+ }
1125
+ return {};
1126
+ }
1127
+
1128
+ ov::PartialShape GgmlOvDecoder::get_view_input_ov_shape(int node_idx,
1129
+ const std::string & name,
1130
+ size_t view_index) const {
1131
+ auto it = m_node_info_list[node_idx].node_inputs_views.find(name);
1132
+ if (it != m_node_info_list[node_idx].node_inputs_views.end()) {
1133
+ if (view_index < it->second.size()) {
1134
+ auto * tensor = it->second[view_index].second;
1135
+ ov::PartialShape shape = ov::PartialShape{get_shape(tensor)};
1136
+
1137
+ // Check if this tensor has a dynamic dimension
1138
+ auto dynamic_it = m_node_dynamic_dims.find(tensor);
1139
+ if (dynamic_it != m_node_dynamic_dims.end() && dynamic_it->second != -1) {
1140
+ int dynamic_dim_index = dynamic_it->second;
1141
+ // GGML uses reverse indexing, so convert to OpenVINO indexing
1142
+ shape[3 - dynamic_dim_index] = m_is_static ? get_static_n_tokens() : -1;
1143
+ }
1144
+
1145
+ return shape;
1146
+ }
1147
+ }
1148
+ return {};
1149
+ }
1150
+
1151
+ ov::PartialShape GgmlOvDecoder::get_view_input_src_ov_shape(int node_idx,
1152
+ const std::string & name,
1153
+ size_t view_index) const {
1154
+ auto it = m_node_info_list[node_idx].node_inputs_views.find(name);
1155
+ if (it != m_node_info_list[node_idx].node_inputs_views.end()) {
1156
+ if (view_index < it->second.size()) {
1157
+ auto * view_tensor = it->second[view_index].second;
1158
+ if (view_tensor && view_tensor->src[0]) {
1159
+ auto * src_tensor = view_tensor->src[0];
1160
+ ov::PartialShape shape = ov::PartialShape{get_shape(src_tensor)};
1161
+
1162
+ // Check if this tensor has a dynamic dimension
1163
+ auto dynamic_it = m_node_dynamic_dims.find(src_tensor);
1164
+ if (dynamic_it != m_node_dynamic_dims.end() && dynamic_it->second != -1) {
1165
+ int dynamic_dim_index = dynamic_it->second;
1166
+ // GGML uses reverse indexing, so convert to OpenVINO indexing
1167
+ shape[3 - dynamic_dim_index] = m_is_static ? get_static_n_tokens() : -1;
1168
+ }
1169
+
1170
+ return shape;
1171
+ }
1172
+ }
1173
+ }
1174
+ return {};
1175
+ }
1176
+
1177
+ std::string GgmlOvDecoder::get_view_input_name(int node_idx, const std::string & name, size_t view_index) const {
1178
+ auto it = m_node_info_list[node_idx].node_inputs_views.find(name);
1179
+ if (it != m_node_info_list[node_idx].node_inputs_views.end()) {
1180
+ if (view_index < it->second.size()) {
1181
+ return it->second[view_index].second->name;
1182
+ }
1183
+ }
1184
+ return "";
1185
+ }
1186
+
1187
+ std::string GgmlOvDecoder::get_view_input_src_name(int node_idx, const std::string & name, size_t view_index) const {
1188
+ auto it = m_node_info_list[node_idx].node_inputs_views.find(name);
1189
+ if (it != m_node_info_list[node_idx].node_inputs_views.end()) {
1190
+ if (view_index < it->second.size()) {
1191
+ auto * view_tensor = it->second[view_index].second;
1192
+ if (view_tensor && view_tensor->src[0]) {
1193
+ return view_tensor->src[0]->name;
1194
+ }
1195
+ }
1196
+ }
1197
+ return "";
1198
+ }
1199
+
853
1200
  ov::element::Type GgmlOvDecoder::get_input_type(int node_idx, const std::string & name) const {
854
1201
  return get_ov_type(m_node_info_list[node_idx].node_inputs.at(name));
855
1202
  }
@@ -875,6 +1222,11 @@ ov::element::Type GgmlOvDecoder::get_output_type(const int node_idx) const {
875
1222
  return get_ov_type(m_node_info_list[node_idx].node);
876
1223
  }
877
1224
 
1225
+ std::vector<size_t> GgmlOvDecoder::get_output_stride(int node_idx) const {
1226
+ auto * ggml_tensor = m_node_info_list[node_idx].node;
1227
+ return get_stride(ggml_tensor);
1228
+ }
1229
+
878
1230
  std::vector<std::string> GgmlOvDecoder::get_output_names(int node_idx) const {
879
1231
  return {m_node_info_list[node_idx].node_output_name};
880
1232
  }
@@ -884,6 +1236,14 @@ const std::string & GgmlOvDecoder::get_op_name() const {
884
1236
  return unknown_name;
885
1237
  }
886
1238
 
1239
+ int32_t GgmlOvDecoder::get_op_dynamic_dim(int node_idx) const {
1240
+ auto it = m_node_dynamic_dims.find(m_node_info_list[node_idx].node);
1241
+ if (it == m_node_dynamic_dims.end()) {
1242
+ return -1;
1243
+ }
1244
+ return it->second;
1245
+ }
1246
+
887
1247
  const std::string & GgmlOvDecoder::get_op_name(int node_idx) const {
888
1248
  return m_node_info_list[node_idx].node_name;
889
1249
  }
@@ -896,6 +1256,10 @@ int32_t * GgmlOvDecoder::get_output_op_params(int node_idx) const {
896
1256
  return m_node_info_list[node_idx].node->op_params;
897
1257
  }
898
1258
 
1259
+ size_t GgmlOvDecoder::get_output_op_offset(int node_idx) const {
1260
+ return m_node_info_list[node_idx].node->view_offs;
1261
+ }
1262
+
899
1263
  void GgmlOvDecoder::visit_subgraph(std::function<void(std::shared_ptr<GgmlDecoder>, int node_idx)> node_visitor) const {
900
1264
  for (int node_idx = 0; node_idx < m_cgraph->n_nodes; node_idx++) {
901
1265
  if (m_cgraph->nodes[node_idx]->op == GGML_OP_NONE) {
@@ -906,63 +1270,14 @@ void GgmlOvDecoder::visit_subgraph(std::function<void(std::shared_ptr<GgmlDecode
906
1270
  }
907
1271
 
908
1272
  std::string GgmlOvDecoder::compute_op_type(const ggml_tensor * node) {
909
- static const std::map<ggml_op, std::string> ops = {
910
- {GGML_OP_NONE, "GGML_OP_NONE" },
911
- {GGML_OP_ACC, "GGML_OP_ACC" },
912
- {GGML_OP_ADD, "GGML_OP_ADD" },
913
- {GGML_OP_ADD1, "GGML_OP_ADD1" },
914
- {GGML_OP_CONT, "GGML_OP_CONT" },
915
- {GGML_OP_DIV, "GGML_OP_DIV" },
916
- {GGML_OP_DUP, "GGML_OP_DUP" },
917
- {GGML_OP_GET_ROWS, "GGML_OP_GET_ROWS" },
918
- {GGML_OP_MUL, "GGML_OP_MUL" },
919
- {GGML_OP_MUL_MAT, "GGML_OP_MUL_MAT" },
920
- {GGML_OP_PERMUTE, "GGML_OP_PERMUTE" },
921
- {GGML_OP_RESHAPE, "GGML_OP_RESHAPE" },
922
- {GGML_OP_RMS_NORM, "GGML_OP_RMS_NORM" },
923
- {GGML_OP_ROPE, "GGML_OP_ROPE" },
924
- {GGML_OP_SCALE, "GGML_OP_SCALE" },
925
- {GGML_OP_SOFT_MAX, "GGML_OP_SOFT_MAX" },
926
- {GGML_OP_SUB, "GGML_OP_SUB" },
927
- {GGML_OP_TRANSPOSE, "GGML_OP_TRANSPOSE" },
928
- {GGML_OP_VIEW, "GGML_OP_VIEW" },
929
- {GGML_OP_SET_ROWS, "GGML_OP_SET_ROWS" },
930
- {GGML_OP_CPY, "GGML_OP_CPY" },
931
- {GGML_OP_FLASH_ATTN_EXT, "GGML_OP_FLASH_ATTN_EXT"},
932
- };
933
- static const std::map<ggml_unary_op, std::string> unary_ops = {
934
- {GGML_UNARY_OP_ABS, "GGML_UNARY_OP_ABS" },
935
- {GGML_UNARY_OP_SGN, "GGML_UNARY_OP_SGN" },
936
- {GGML_UNARY_OP_NEG, "GGML_UNARY_OP_NEG" },
937
- {GGML_UNARY_OP_STEP, "GGML_UNARY_OP_STEP" },
938
- {GGML_UNARY_OP_TANH, "GGML_UNARY_OP_TANH" },
939
- {GGML_UNARY_OP_ELU, "GGML_UNARY_OP_ELU" },
940
- {GGML_UNARY_OP_RELU, "GGML_UNARY_OP_RELU" },
941
- {GGML_UNARY_OP_SIGMOID, "GGML_UNARY_OP_SIGMOID" },
942
- {GGML_UNARY_OP_GELU, "GGML_UNARY_OP_GELU" },
943
- {GGML_UNARY_OP_GELU_QUICK, "GGML_UNARY_OP_GELU_QUICK" },
944
- {GGML_UNARY_OP_SILU, "GGML_UNARY_OP_SILU" },
945
- {GGML_UNARY_OP_HARDSWISH, "GGML_UNARY_OP_HARDSWISH" },
946
- {GGML_UNARY_OP_HARDSIGMOID, "GGML_UNARY_OP_HARDSIGMOID"},
947
- {GGML_UNARY_OP_EXP, "GGML_UNARY_OP_EXP" },
948
- {GGML_UNARY_OP_COUNT, "GGML_UNARY_OP_COUNT" }
949
- };
950
- static const std::map<ggml_glu_op, std::string> glu_ops = {
951
- {GGML_GLU_OP_SWIGLU, "GGML_GLU_OP_SWIGLU"},
952
- {GGML_GLU_OP_GEGLU, "GGML_GLU_OP_GEGLU" },
953
- {GGML_GLU_OP_REGLU, "GGML_GLU_OP_REGLU" }
954
- };
955
-
956
1273
  switch (node->op) {
957
1274
  case GGML_OP_UNARY:
958
- return unary_ops.at(ggml_get_unary_op(node));
1275
+ return std::string("GGML_UNARY_OP_") + ggml_unary_op_name(ggml_get_unary_op(node));
959
1276
  case GGML_OP_GLU:
960
- return glu_ops.at(ggml_get_glu_op(node));
1277
+ return std::string("GGML_GLU_OP_") + ggml_glu_op_name(ggml_get_glu_op(node));
961
1278
  default:
962
- return ops.at(node->op);
1279
+ return std::string("GGML_OP_") + ggml_op_name(node->op);
963
1280
  }
964
- static const std::string unknown_op = "UNKNOWN_GGML_OP";
965
- return unknown_op;
966
1281
  }
967
1282
 
968
1283
  const std::string & GgmlOvDecoder::get_op_type(int node_idx) const {
@@ -973,3 +1288,301 @@ const std::string & GgmlOvDecoder::get_op_type() const {
973
1288
  static const std::string unknown_op = "UNKNOWN_GGML_OP";
974
1289
  return unknown_op;
975
1290
  }
1291
+
1292
+ void GgmlOvDecoder::compute_node_dynamic_dims() {
1293
+ auto visit_node = [&](auto && self, ggml_tensor * node) -> void {
1294
+ if (!node) {
1295
+ return;
1296
+ }
1297
+
1298
+ if (node->op == GGML_OP_CPY) {
1299
+ m_node_dynamic_dims[node] = -1;
1300
+ }
1301
+
1302
+ if (m_node_dynamic_dims.count(node)) {
1303
+ return;
1304
+ }
1305
+ for (int i = 0; i < GGML_MAX_SRC; i++) {
1306
+ ggml_tensor * src = node->src[i];
1307
+ if (src == nullptr) {
1308
+ continue;
1309
+ }
1310
+ struct ggml_tensor * root_src = nullptr;
1311
+ // if (src->org_src) {
1312
+ // root_src = src->org_src;
1313
+ // }
1314
+ if (root_src) {
1315
+ if (is_inp_tok(root_src, node) || is_inp_pos(root_src, node) || is_output_idx(root_src, node)) {
1316
+ m_node_dynamic_dims[root_src] = 0;
1317
+ m_node_dynamic_dims[src] = m_node_dynamic_dims[root_src];
1318
+ continue;
1319
+ }
1320
+ self(self, root_src);
1321
+ m_node_dynamic_dims[src] = m_node_dynamic_dims[root_src];
1322
+ } else {
1323
+ if (is_inp_tok(src, node) || is_inp_pos(src, node) || is_output_idx(src, node)) {
1324
+ m_node_dynamic_dims[src] = 0;
1325
+ continue;
1326
+ }
1327
+ if (node->op == GGML_OP_VIEW && src->op == GGML_OP_NONE && !is_stateful() && !m_model_is_splitted) {
1328
+ m_node_dynamic_dims[src] = 1;
1329
+ continue;
1330
+ }
1331
+ self(self, src);
1332
+ }
1333
+ }
1334
+ switch (node->op) {
1335
+ case GGML_OP_NONE:
1336
+ m_node_dynamic_dims[node] = -1;
1337
+ break;
1338
+ case GGML_OP_GET_ROWS:
1339
+ m_node_dynamic_dims[node] = -1;
1340
+ if (m_node_dynamic_dims[node->src[1]] != -1) {
1341
+ auto dynamic_dim_idx = m_node_dynamic_dims[node->src[1]];
1342
+ if (dynamic_dim_idx == 0) {
1343
+ m_node_dynamic_dims[node] = 1;
1344
+ } else {
1345
+ auto dynamic_dim_stride = node->src[1]->nb[dynamic_dim_idx] / ggml_type_size(node->src[1]->type) *
1346
+ ggml_type_size(node->src[0]->type);
1347
+ for (int i = 0; i < GGML_MAX_DIMS; i++) {
1348
+ if (dynamic_dim_stride == node->src[0]->nb[i]) {
1349
+ m_node_dynamic_dims[node] = i;
1350
+ break;
1351
+ }
1352
+ }
1353
+ }
1354
+ // OPENVINO_ASSERT(dynamic_dim_value == node->ne[m_node_dynamic_dims[node]],
1355
+ // "Dynamic dim value mismatch for node: " + std::string(node->name) +
1356
+ // " and its src[1]: " + std::string(node->src[1]->name));
1357
+ }
1358
+ break;
1359
+ case GGML_OP_MUL:
1360
+ case GGML_OP_MUL_MAT:
1361
+ m_node_dynamic_dims[node] = -1;
1362
+ if (m_node_dynamic_dims[node->src[0]] != -1) {
1363
+ m_node_dynamic_dims[node] = m_node_dynamic_dims[node->src[0]];
1364
+ }
1365
+ if (m_node_dynamic_dims[node->src[1]] != -1) {
1366
+ m_node_dynamic_dims[node] = m_node_dynamic_dims[node->src[1]];
1367
+ }
1368
+ break;
1369
+ case GGML_OP_PERMUTE:
1370
+ m_node_dynamic_dims[node] = -1;
1371
+ if (m_node_dynamic_dims[node->src[0]] != -1) {
1372
+ auto dynamic_dim_idx = m_node_dynamic_dims[node->src[0]];
1373
+ // auto dynamic_dim_value = node->src[0]->ne[dynamic_dim_idx];
1374
+ for (int i = 0; i < GGML_MAX_DIMS; i++) {
1375
+ if (node->op_params[i] == dynamic_dim_idx) {
1376
+ m_node_dynamic_dims[node] = i;
1377
+ break;
1378
+ }
1379
+ }
1380
+ // OPENVINO_ASSERT(dynamic_dim_value == node->ne[m_node_dynamic_dims[node]],
1381
+ // "Dynamic dim value mismatch for node: " + std::string(node->name) +
1382
+ // " and its src[0]: " + std::string(node->src[0]->name));
1383
+ }
1384
+ break;
1385
+ case GGML_OP_VIEW: {
1386
+ // Use stride-based matching: the stride of a VIEW dimension directly
1387
+ // encodes which source dimension it indexes into, so it uniquely
1388
+ // identifies the dynamic dim even when two dims share the same size.
1389
+ m_node_dynamic_dims[node] = -1;
1390
+ if (m_node_dynamic_dims[node->src[0]] != -1) {
1391
+ if (node->src[0]->op == GGML_OP_NONE) {
1392
+ m_node_dynamic_dims[node] = m_node_dynamic_dims[node->src[0]];
1393
+ break;
1394
+ }
1395
+ auto dynamic_dim_idx = m_node_dynamic_dims[node->src[0]];
1396
+ auto dynamic_dim_value = node->src[0]->ne[dynamic_dim_idx];
1397
+ auto dynamic_dim_stride =
1398
+ node->src[0]->nb[dynamic_dim_idx] / ggml_type_size(node->src[0]->type) * ggml_type_size(node->type);
1399
+ for (int i = 0; i < GGML_MAX_DIMS; i++) {
1400
+ if (node->nb[i] == dynamic_dim_stride) {
1401
+ m_node_dynamic_dims[node] = i;
1402
+ break;
1403
+ }
1404
+ }
1405
+ if (m_node_dynamic_dims[node] != -1 && dynamic_dim_value != node->ne[m_node_dynamic_dims[node]]) {
1406
+ m_node_dynamic_dims[node] = -1;
1407
+ // std::cout << "Warning: Dynamic dim value mismatch for node: " << node->name
1408
+ // << " and its src[0]: " << node->src[0]->name << std::endl;
1409
+ }
1410
+ }
1411
+ break;
1412
+ }
1413
+ case GGML_OP_TRANSPOSE:
1414
+ case GGML_OP_RESHAPE: {
1415
+ // RESHAPE requires src[0] to be contiguous, so both src and result
1416
+ // have standard compact strides: nb[i] = type_size * prod(ne[0..i-1]).
1417
+ // Match src->nb[dynamic_dim] against result->nb[i] to find the output
1418
+ // dimension whose flat-memory boundary aligns with the source dynamic
1419
+ // boundary. This is unambiguous (result strides are strictly monotone)
1420
+ // and handles merged-lower-dim cases that ne-value matching misses.
1421
+ m_node_dynamic_dims[node] = -1;
1422
+ if (m_node_dynamic_dims[node->src[0]] != -1) {
1423
+ auto dynamic_dim_idx = m_node_dynamic_dims[node->src[0]];
1424
+ auto dynamic_dim_stride = node->src[0]->nb[dynamic_dim_idx];
1425
+ for (int i = 0; i < GGML_MAX_DIMS; i++) {
1426
+ if (node->nb[i] == dynamic_dim_stride && node->ne[i] == node->src[0]->ne[dynamic_dim_idx]) {
1427
+ m_node_dynamic_dims[node] = i;
1428
+ break;
1429
+ }
1430
+ }
1431
+ if (m_node_dynamic_dims[node] == -1) {
1432
+ // std::cout << "Cannot determine dynamic dim for RESHAPE node: " << node->name << std::endl;
1433
+ }
1434
+ }
1435
+ break;
1436
+ }
1437
+ case GGML_OP_FLASH_ATTN_EXT: {
1438
+ // Output shape is hard-coded in ggml_flash_attn_ext as:
1439
+ // ne = { v->ne[0], q->ne[2], q->ne[1], q->ne[3] }
1440
+ // i.e. output dim 0 <- v dim 0 (head_size, static)
1441
+ // output dim 1 <- q dim 2 (n_heads, static)
1442
+ // output dim 2 <- q dim 1 (n_tokens, potentially dynamic)
1443
+ // output dim 3 <- q dim 3 (batch, static)
1444
+ // Using the fixed q-dim -> output-dim mapping table.
1445
+ // q is src[0]; the mapping from q's dynamic dim to the output dim is:
1446
+ // q dim 1 -> output dim 2
1447
+ // q dim 2 -> output dim 1
1448
+ // q dim 3 -> output dim 3
1449
+ // q dim 0 -> output dim 0 (head_size axis, unlikely to be dynamic)
1450
+ constexpr int q_to_out[GGML_MAX_DIMS] = {0, 2, 1, 3};
1451
+ m_node_dynamic_dims[node] = -1;
1452
+ if (m_node_dynamic_dims[node->src[0]] != -1) {
1453
+ auto q_dynamic_dim = m_node_dynamic_dims[node->src[0]];
1454
+ m_node_dynamic_dims[node] = q_to_out[q_dynamic_dim];
1455
+ }
1456
+ break;
1457
+ }
1458
+ case GGML_OP_CONT:
1459
+ m_node_dynamic_dims[node] = -1;
1460
+ if (m_node_dynamic_dims[node->src[0]] != -1) {
1461
+ auto dynamic_dim_idx = m_node_dynamic_dims[node->src[0]];
1462
+ if (ggml_are_same_shape(node, node->src[0])) {
1463
+ m_node_dynamic_dims[node] = dynamic_dim_idx;
1464
+ } else {
1465
+ size_t src_logical_nb[GGML_MAX_DIMS];
1466
+ src_logical_nb[0] = ggml_type_size(node->src[0]->type);
1467
+ src_logical_nb[1] = src_logical_nb[0] * (node->src[0]->ne[0] / ggml_blck_size(node->src[0]->type));
1468
+ for (int i = 2; i < GGML_MAX_DIMS; i++) {
1469
+ src_logical_nb[i] = src_logical_nb[i - 1] * node->src[0]->ne[i - 1];
1470
+ }
1471
+
1472
+ auto dynamic_dim_stride = src_logical_nb[dynamic_dim_idx] / ggml_type_size(node->src[0]->type) *
1473
+ ggml_type_size(node->type);
1474
+ int matched_dim_count = 0;
1475
+ for (int i = 0; i < GGML_MAX_DIMS; i++) {
1476
+ if (node->nb[i] == dynamic_dim_stride && node->ne[i] == node->src[0]->ne[dynamic_dim_idx]) {
1477
+ m_node_dynamic_dims[node] = i;
1478
+ matched_dim_count++;
1479
+ }
1480
+ }
1481
+ if (matched_dim_count != 1) {
1482
+ m_node_dynamic_dims[node] = -1;
1483
+ // std::cout << "Warning: Cannot determine dynamic dim for CONT node: " << node->name
1484
+ // << " and its src[0]: " << node->src[0]->name << std::endl;
1485
+ }
1486
+ }
1487
+ }
1488
+ break;
1489
+ case GGML_OP_RMS_NORM:
1490
+ case GGML_OP_NORM:
1491
+ case GGML_OP_ADD:
1492
+ case GGML_OP_GLU:
1493
+ case GGML_OP_ROPE:
1494
+ case GGML_OP_SCALE:
1495
+ case GGML_OP_SOFT_MAX:
1496
+ case GGML_OP_ARGSORT:
1497
+ case GGML_OP_ADD_ID:
1498
+ case GGML_OP_UNARY:
1499
+ m_node_dynamic_dims[node] = m_node_dynamic_dims[node->src[0]];
1500
+ break;
1501
+ case GGML_OP_MUL_MAT_ID:
1502
+ m_node_dynamic_dims[node] = m_node_dynamic_dims[node->src[1]];
1503
+ break;
1504
+ case GGML_OP_CPY:
1505
+ case GGML_OP_SET_ROWS:
1506
+ m_node_dynamic_dims[node] = -1;
1507
+ break;
1508
+ case GGML_OP_IM2COL: {
1509
+ m_node_dynamic_dims[node] = -1;
1510
+ if (m_node_dynamic_dims[node->src[1]] != -1) {
1511
+ const bool is_2D = node->op_params[6] == 1;
1512
+ const int src_dyn = m_node_dynamic_dims[node->src[1]];
1513
+ if (is_2D) {
1514
+ if (src_dyn == 0) {
1515
+ m_node_dynamic_dims[node] = 1; // IW -> OW
1516
+ } else if (src_dyn == 1) {
1517
+ m_node_dynamic_dims[node] = 2; // IH -> OH
1518
+ } else if (src_dyn == 3) {
1519
+ m_node_dynamic_dims[node] = 3; // N -> N
1520
+ }
1521
+ } else {
1522
+ if (src_dyn == 0) {
1523
+ m_node_dynamic_dims[node] = 1; // IW -> OW
1524
+ } else if (src_dyn == 2) {
1525
+ m_node_dynamic_dims[node] = 2; // N -> N (1D: b->ne[2] is the batch/channel dim)
1526
+ }
1527
+ }
1528
+ if (m_node_dynamic_dims[node] != -1) {
1529
+ OPENVINO_ASSERT(node->src[1]->ne[src_dyn] == node->ne[m_node_dynamic_dims[node]],
1530
+ "Dynamic dim value mismatch for IM2COL node: " + std::string(node->name) +
1531
+ " and its src[1]: " + std::string(node->src[1]->name));
1532
+ }
1533
+ }
1534
+ break;
1535
+ }
1536
+ default:
1537
+ // std::cout << "Doesn't handle node name: " << node->name << " op: " << ggml_op_name(node->op) << std::endl;
1538
+ break;
1539
+ }
1540
+ };
1541
+
1542
+ for (int i = 0; i < m_cgraph->n_nodes; i++) {
1543
+ ggml_tensor * node = m_cgraph->nodes[i];
1544
+ visit_node(visit_node, node);
1545
+ }
1546
+
1547
+ // print the nodes in m_cgraph name & shape with the dynamic dim (the dynamic dim is the dimension with -1 in m_node_dynamic_dims) for debugging
1548
+ if (0) {
1549
+ for (int i = 0; i < m_cgraph->n_nodes; i++) {
1550
+ ggml_tensor * node = m_cgraph->nodes[i];
1551
+ int dynamic_dim = m_node_dynamic_dims[node];
1552
+ std::cout << "[" << i << "] " << "node_name: " << node->name << " op: " << ggml_op_name(node->op)
1553
+ << " shape: [";
1554
+ for (int j = 0; j < 4; j++) {
1555
+ if (j == dynamic_dim) {
1556
+ std::cout << "*";
1557
+ } else {
1558
+ std::cout << node->ne[j];
1559
+ }
1560
+ if (j < 3) {
1561
+ std::cout << ", ";
1562
+ }
1563
+ }
1564
+ std::cout << "]" << std::endl;
1565
+ // print the src name & shape with the dynamic dim for debugging
1566
+ for (int j = 0; j < GGML_MAX_SRC; j++) {
1567
+ ggml_tensor * src = node->src[j];
1568
+ if (src == nullptr) {
1569
+ continue;
1570
+ }
1571
+ int src_dynamic_dim = m_node_dynamic_dims[src];
1572
+ std::cout << " [" << j << "] src_name: " << src->name << " [";
1573
+ for (int k = 0; k < 4; k++) {
1574
+ if (k == src_dynamic_dim) {
1575
+ std::cout << "*";
1576
+ } else {
1577
+ std::cout << src->ne[k];
1578
+ }
1579
+ if (k < 3) {
1580
+ std::cout << ", ";
1581
+ }
1582
+ }
1583
+ std::cout << "]" << std::endl;
1584
+ }
1585
+ std::cout << std::endl;
1586
+ }
1587
+ }
1588
+ }