whispercpp 1.3.7 → 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 (308) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -4
  3. data/ext/options.rb +1 -1
  4. data/ext/ruby_whisper.c +0 -1
  5. data/ext/ruby_whisper.h +7 -1
  6. data/ext/ruby_whisper_context.c +50 -1
  7. data/ext/ruby_whisper_log_settable.h +1 -2
  8. data/ext/ruby_whisper_params.c +9 -8
  9. data/ext/ruby_whisper_transcribe.cpp +0 -19
  10. data/ext/ruby_whisper_vad_context.c +30 -10
  11. data/ext/ruby_whisper_vad_context_detect.cpp +8 -9
  12. data/ext/ruby_whisper_vad_params.c +4 -4
  13. data/ext/ruby_whisper_vad_segment.c +2 -2
  14. data/ext/sources/CMakeLists.txt +2 -1
  15. data/ext/sources/cmake/parakeet.pc.in +2 -2
  16. data/ext/sources/cmake/whisper.pc.in +2 -2
  17. data/ext/sources/examples/cli/cli.cpp +9 -1
  18. data/ext/sources/examples/common-ggml.cpp +2 -0
  19. data/ext/sources/examples/vad-speech-segments/speech.cpp +3 -2
  20. data/ext/sources/ggml/CMakeLists.txt +3 -4
  21. data/ext/sources/ggml/include/ggml-cuda.h +0 -3
  22. data/ext/sources/ggml/include/ggml-sycl.h +8 -0
  23. data/ext/sources/ggml/include/ggml.h +3 -1
  24. data/ext/sources/ggml/src/CMakeLists.txt +8 -1
  25. data/ext/sources/ggml/src/ggml-backend-meta.cpp +7 -4
  26. data/ext/sources/ggml/src/ggml-common.h +13 -2
  27. data/ext/sources/ggml/src/ggml-cpu/CMakeLists.txt +1 -1
  28. data/ext/sources/ggml/src/ggml-cpu/amx/mmq.cpp +5 -6
  29. data/ext/sources/ggml/src/ggml-cpu/arch/arm/quants.c +78 -4
  30. data/ext/sources/ggml/src/ggml-cpu/arch/x86/quants.c +142 -4
  31. data/ext/sources/ggml/src/ggml-cpu/arch-fallback.h +7 -2
  32. data/ext/sources/ggml/src/ggml-cpu/ggml-cpu.c +14 -0
  33. data/ext/sources/ggml/src/ggml-cpu/llamafile/sgemm.cpp +26 -19
  34. data/ext/sources/ggml/src/ggml-cpu/ops.cpp +129 -46
  35. data/ext/sources/ggml/src/ggml-cpu/quants.c +51 -0
  36. data/ext/sources/ggml/src/ggml-cpu/quants.h +3 -0
  37. data/ext/sources/ggml/src/ggml-cpu/simd-gemm.h +1 -1
  38. data/ext/sources/ggml/src/ggml-cpu/simd-mappings.h +11 -0
  39. data/ext/sources/ggml/src/ggml-cpu/vec.cpp +2 -2
  40. data/ext/sources/ggml/src/ggml-cuda/binbcast.cu +90 -46
  41. data/ext/sources/ggml/src/ggml-cuda/col2im-1d.cu +81 -0
  42. data/ext/sources/ggml/src/ggml-cuda/col2im-1d.cuh +3 -0
  43. data/ext/sources/ggml/src/ggml-cuda/common.cuh +4 -0
  44. data/ext/sources/ggml/src/ggml-cuda/concat.cu +33 -21
  45. data/ext/sources/ggml/src/ggml-cuda/conv-transpose-1d.cu +14 -12
  46. data/ext/sources/ggml/src/ggml-cuda/convert.cu +86 -34
  47. data/ext/sources/ggml/src/ggml-cuda/cpy.cu +80 -29
  48. data/ext/sources/ggml/src/ggml-cuda/fattn-common.cuh +9 -5
  49. data/ext/sources/ggml/src/ggml-cuda/fattn-mma-f16.cuh +4 -0
  50. data/ext/sources/ggml/src/ggml-cuda/fattn-tile.cuh +9 -5
  51. data/ext/sources/ggml/src/ggml-cuda/fattn.cu +27 -21
  52. data/ext/sources/ggml/src/ggml-cuda/gated_delta_net.cu +40 -25
  53. data/ext/sources/ggml/src/ggml-cuda/gated_delta_net.cuh +10 -0
  54. data/ext/sources/ggml/src/ggml-cuda/getrows.cu +15 -12
  55. data/ext/sources/ggml/src/ggml-cuda/ggml-cuda.cu +718 -1248
  56. data/ext/sources/ggml/src/ggml-cuda/mmq.cu +7 -0
  57. data/ext/sources/ggml/src/ggml-cuda/mmvq.cu +77 -40
  58. data/ext/sources/ggml/src/ggml-cuda/out-prod.cu +55 -12
  59. data/ext/sources/ggml/src/ggml-cuda/set-rows.cu +64 -4
  60. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_16-ncols2_2.cu +1 -0
  61. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_32-ncols2_2.cu +1 -0
  62. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_2.cu +1 -0
  63. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_8-ncols2_2.cu +1 -0
  64. data/ext/sources/ggml/src/ggml-cuda/topk-moe.cu +7 -1
  65. data/ext/sources/ggml/src/ggml-cuda/vendors/hip.h +1 -0
  66. data/ext/sources/ggml/src/ggml-cuda/vendors/musa.h +1 -0
  67. data/ext/sources/ggml/src/ggml-hexagon/CMakeLists.txt +0 -5
  68. data/ext/sources/ggml/src/ggml-hexagon/ggml-hexagon.cpp +1634 -1293
  69. data/ext/sources/ggml/src/ggml-hexagon/htp/CMakeLists.txt +11 -40
  70. data/ext/sources/ggml/src/ggml-hexagon/htp/cmake-toolchain.cmake +13 -15
  71. data/ext/sources/ggml/src/ggml-hexagon/htp/concat-ops.c +1 -1
  72. data/ext/sources/ggml/src/ggml-hexagon/htp/flash-attn-ops.c +1749 -399
  73. data/ext/sources/ggml/src/ggml-hexagon/htp/flash-attn-ops.h +303 -0
  74. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-common.h +80 -0
  75. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-dma.h +26 -23
  76. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-profile.h +64 -0
  77. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-utils.h +1 -83
  78. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-fa-kernels.h +555 -0
  79. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-mm-kernels-tiled.h +1303 -0
  80. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-queue.c +9 -0
  81. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-queue.h +27 -4
  82. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-utils.h +59 -37
  83. data/ext/sources/ggml/src/ggml-hexagon/htp/htp-ctx.h +11 -3
  84. data/ext/sources/ggml/src/ggml-hexagon/htp/htp-ops.h +52 -12
  85. data/ext/sources/ggml/src/ggml-hexagon/htp/htp-vtcm.h +19 -0
  86. data/ext/sources/ggml/src/ggml-hexagon/htp/htp_iface.idl +2 -1
  87. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-base.h +14 -30
  88. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-exp.h +39 -0
  89. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-fa-kernels.h +232 -0
  90. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-mm-kernels-flat.h +1511 -0
  91. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-mm-kernels-tiled.h +1200 -0
  92. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-sigmoid.h +39 -0
  93. data/ext/sources/ggml/src/ggml-hexagon/htp/main.c +127 -32
  94. data/ext/sources/ggml/src/ggml-hexagon/htp/matmul-ops.c +3023 -4425
  95. data/ext/sources/ggml/src/ggml-hexagon/htp/matmul-ops.h +650 -0
  96. data/ext/sources/ggml/src/ggml-hexagon/htp/rope-ops.c +48 -13
  97. data/ext/sources/ggml/src/ggml-hexagon/htp/ssm-conv.c +10 -9
  98. data/ext/sources/ggml/src/ggml-hexagon/htp/worker-pool.c +15 -3
  99. data/ext/sources/ggml/src/ggml-hexagon/htp/worker-pool.h +8 -0
  100. data/ext/sources/ggml/src/ggml-hexagon/htp-opnode.h +168 -50
  101. data/ext/sources/ggml/src/ggml-hexagon/libggml-htp.inf +0 -4
  102. data/ext/sources/ggml/src/ggml-hip/CMakeLists.txt +5 -0
  103. data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.cpp +69 -5
  104. data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.h +4 -1
  105. data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.m +27 -6
  106. data/ext/sources/ggml/src/ggml-metal/ggml-metal-impl.h +38 -0
  107. data/ext/sources/ggml/src/ggml-metal/ggml-metal-ops.cpp +132 -2
  108. data/ext/sources/ggml/src/ggml-metal/ggml-metal-ops.h +2 -0
  109. data/ext/sources/ggml/src/ggml-metal/ggml-metal.metal +345 -87
  110. data/ext/sources/ggml/src/ggml-opencl/CMakeLists.txt +13 -0
  111. data/ext/sources/ggml/src/ggml-opencl/fa_tune.h +92 -0
  112. data/ext/sources/ggml/src/ggml-opencl/ggml-opencl.cpp +4060 -357
  113. data/ext/sources/ggml/src/ggml-opencl/kernels/cvt.cl +198 -0
  114. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f16.cl +81 -41
  115. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32.cl +88 -39
  116. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32_f16.cl +1995 -96
  117. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32_q4_0.cl +1615 -0
  118. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32_q8_0.cl +1486 -0
  119. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_pre_f16.cl +156 -0
  120. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_mxfp4_f32_ns.cl +74 -6
  121. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q4_0_f32_ns.cl +74 -6
  122. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q4_1_f32_ns.cl +74 -6
  123. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q4_k_f32_ns.cl +71 -6
  124. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q5_0_f32_ns.cl +74 -6
  125. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q5_1_f32_ns.cl +74 -6
  126. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q5_k_f32_ns.cl +74 -6
  127. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q6_k_f32_ns.cl +74 -6
  128. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q1_0_f32.cl +94 -0
  129. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q1_0_f32.cl +121 -0
  130. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q8_0_f32.cl +1 -1
  131. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_q1_0_f32_l4_lm.cl +156 -0
  132. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_f16_f32_l4.cl +1149 -0
  133. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q1_0_f32.cl +141 -0
  134. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q1_0_f32_flat.cl +190 -0
  135. data/ext/sources/ggml/src/ggml-opencl/kernels/norm.cl +5 -2
  136. data/ext/sources/ggml/src/ggml-opencl/kernels/set_rows.cl +500 -0
  137. data/ext/sources/ggml/src/ggml-opencl/libdl.h +79 -0
  138. data/ext/sources/ggml/src/ggml-openvino/.clang-format +0 -5
  139. data/ext/sources/ggml/src/ggml-openvino/CMakeLists.txt +2 -4
  140. data/ext/sources/ggml/src/ggml-openvino/ggml-decoder.cpp +733 -130
  141. data/ext/sources/ggml/src/ggml-openvino/ggml-decoder.h +76 -23
  142. data/ext/sources/ggml/src/ggml-openvino/ggml-openvino-extra.cpp +57 -3
  143. data/ext/sources/ggml/src/ggml-openvino/ggml-openvino-extra.h +29 -8
  144. data/ext/sources/ggml/src/ggml-openvino/ggml-openvino.cpp +307 -59
  145. data/ext/sources/ggml/src/ggml-openvino/ggml-quants.cpp +66 -0
  146. data/ext/sources/ggml/src/ggml-openvino/ggml-quants.h +10 -4
  147. data/ext/sources/ggml/src/ggml-openvino/openvino/decoder.h +56 -16
  148. data/ext/sources/ggml/src/ggml-openvino/openvino/frontend.h +1 -1
  149. data/ext/sources/ggml/src/ggml-openvino/openvino/input_model.h +4 -4
  150. data/ext/sources/ggml/src/ggml-openvino/openvino/node_context.h +94 -37
  151. data/ext/sources/ggml/src/ggml-openvino/openvino/op/add_id.cpp +76 -0
  152. data/ext/sources/ggml/src/ggml-openvino/openvino/op/argsort.cpp +47 -0
  153. data/ext/sources/ggml/src/ggml-openvino/openvino/op/clamp.cpp +33 -0
  154. data/ext/sources/ggml/src/ggml-openvino/openvino/op/concat.cpp +48 -0
  155. data/ext/sources/ggml/src/ggml-openvino/openvino/op/cont.cpp +8 -16
  156. data/ext/sources/ggml/src/ggml-openvino/openvino/op/cpy.cpp +14 -1
  157. data/ext/sources/ggml/src/ggml-openvino/openvino/op/div.cpp +146 -0
  158. data/ext/sources/ggml/src/ggml-openvino/openvino/op/flash_attn_ext.cpp +108 -21
  159. data/ext/sources/ggml/src/ggml-openvino/openvino/op/gated_delta_net.cpp +282 -0
  160. data/ext/sources/ggml/src/ggml-openvino/openvino/op/gated_delta_net.hpp +65 -0
  161. data/ext/sources/ggml/src/ggml-openvino/openvino/op/get_rows.cpp +2 -9
  162. data/ext/sources/ggml/src/ggml-openvino/openvino/op/glu_geglu.cpp +21 -7
  163. data/ext/sources/ggml/src/ggml-openvino/openvino/op/glu_swiglu.cpp +41 -8
  164. data/ext/sources/ggml/src/ggml-openvino/openvino/op/im2col.cpp +120 -0
  165. data/ext/sources/ggml/src/ggml-openvino/openvino/op/l2_norm.cpp +44 -0
  166. data/ext/sources/ggml/src/ggml-openvino/openvino/op/mul_mat_id.cpp +226 -0
  167. data/ext/sources/ggml/src/ggml-openvino/openvino/op/mulmat.cpp +19 -9
  168. data/ext/sources/ggml/src/ggml-openvino/openvino/op/norm.cpp +58 -0
  169. data/ext/sources/ggml/src/ggml-openvino/openvino/op/pad.cpp +95 -0
  170. data/ext/sources/ggml/src/ggml-openvino/openvino/op/permute.cpp +58 -13
  171. data/ext/sources/ggml/src/ggml-openvino/openvino/op/repeat.cpp +74 -0
  172. data/ext/sources/ggml/src/ggml-openvino/openvino/op/reshape.cpp +13 -6
  173. data/ext/sources/ggml/src/ggml-openvino/openvino/op/rms_norm.cpp +1 -1
  174. data/ext/sources/ggml/src/ggml-openvino/openvino/op/rope.cpp +134 -38
  175. data/ext/sources/ggml/src/ggml-openvino/openvino/op/set_rows.cpp +3 -3
  176. data/ext/sources/ggml/src/ggml-openvino/openvino/op/softmax.cpp +126 -49
  177. data/ext/sources/ggml/src/ggml-openvino/openvino/op/ssm_conv.cpp +59 -0
  178. data/ext/sources/ggml/src/ggml-openvino/openvino/op/sum_rows.cpp +27 -0
  179. data/ext/sources/ggml/src/ggml-openvino/openvino/op/transpose.cpp +32 -1
  180. data/ext/sources/ggml/src/ggml-openvino/openvino/op/unary_silu.cpp +1 -1
  181. data/ext/sources/ggml/src/ggml-openvino/openvino/op/unary_softplus.cpp +38 -0
  182. data/ext/sources/ggml/src/ggml-openvino/openvino/op/view.cpp +90 -25
  183. data/ext/sources/ggml/src/ggml-openvino/openvino/op_table.cpp +41 -23
  184. data/ext/sources/ggml/src/ggml-openvino/openvino/op_table.h +18 -5
  185. data/ext/sources/ggml/src/ggml-openvino/openvino/pass/mark_decompression_convert_constant_folding.h +1 -1
  186. data/ext/sources/ggml/src/ggml-openvino/openvino/translate_session.cpp +43 -40
  187. data/ext/sources/ggml/src/ggml-openvino/openvino/translate_session.h +5 -4
  188. data/ext/sources/ggml/src/ggml-openvino/openvino/utils.cpp +548 -3
  189. data/ext/sources/ggml/src/ggml-openvino/openvino/utils.h +28 -26
  190. data/ext/sources/ggml/src/ggml-openvino/utils.cpp +383 -94
  191. data/ext/sources/ggml/src/ggml-openvino/utils.h +11 -8
  192. data/ext/sources/ggml/src/ggml-quants.c +76 -0
  193. data/ext/sources/ggml/src/ggml-quants.h +3 -0
  194. data/ext/sources/ggml/src/ggml-sycl/CMakeLists.txt +5 -5
  195. data/ext/sources/ggml/src/ggml-sycl/backend.hpp +2 -0
  196. data/ext/sources/ggml/src/ggml-sycl/binbcast.cpp +12 -0
  197. data/ext/sources/ggml/src/ggml-sycl/col2im-1d.cpp +102 -0
  198. data/ext/sources/ggml/src/ggml-sycl/col2im-1d.hpp +8 -0
  199. data/ext/sources/ggml/src/ggml-sycl/common.cpp +6 -8
  200. data/ext/sources/ggml/src/ggml-sycl/common.hpp +19 -2
  201. data/ext/sources/ggml/src/ggml-sycl/concat.cpp +21 -1
  202. data/ext/sources/ggml/src/ggml-sycl/conv2d-dw.cpp +158 -0
  203. data/ext/sources/ggml/src/ggml-sycl/conv2d-dw.hpp +10 -0
  204. data/ext/sources/ggml/src/ggml-sycl/conv2d-transpose.cpp +125 -0
  205. data/ext/sources/ggml/src/ggml-sycl/conv2d-transpose.hpp +10 -0
  206. data/ext/sources/ggml/src/ggml-sycl/conv2d.cpp +150 -0
  207. data/ext/sources/ggml/src/ggml-sycl/conv2d.hpp +10 -0
  208. data/ext/sources/ggml/src/ggml-sycl/conv3d.cpp +224 -0
  209. data/ext/sources/ggml/src/ggml-sycl/conv3d.hpp +8 -0
  210. data/ext/sources/ggml/src/ggml-sycl/convert.cpp +6 -0
  211. data/ext/sources/ggml/src/ggml-sycl/cpy.cpp +706 -0
  212. data/ext/sources/ggml/src/ggml-sycl/cpy.hpp +281 -0
  213. data/ext/sources/ggml/src/ggml-sycl/cross_entropy_loss.cpp +255 -0
  214. data/ext/sources/ggml/src/ggml-sycl/cross_entropy_loss.hpp +7 -0
  215. data/ext/sources/ggml/src/ggml-sycl/dequantize.hpp +15 -0
  216. data/ext/sources/ggml/src/ggml-sycl/dmmv.cpp +492 -319
  217. data/ext/sources/ggml/src/ggml-sycl/dpct/helper.hpp +15 -7
  218. data/ext/sources/ggml/src/ggml-sycl/element_wise.cpp +215 -115
  219. data/ext/sources/ggml/src/ggml-sycl/element_wise.hpp +2 -0
  220. data/ext/sources/ggml/src/ggml-sycl/ggml-sycl.cpp +1006 -336
  221. data/ext/sources/ggml/src/ggml-sycl/mmvq.cpp +252 -67
  222. data/ext/sources/ggml/src/ggml-sycl/mmvq.hpp +17 -0
  223. data/ext/sources/ggml/src/ggml-sycl/norm.cpp +103 -49
  224. data/ext/sources/ggml/src/ggml-sycl/outprod.cpp +45 -9
  225. data/ext/sources/ggml/src/ggml-sycl/pool.cpp +185 -0
  226. data/ext/sources/ggml/src/ggml-sycl/pool.hpp +22 -0
  227. data/ext/sources/ggml/src/ggml-sycl/presets.hpp +3 -1
  228. data/ext/sources/ggml/src/ggml-sycl/set_rows.cpp +10 -2
  229. data/ext/sources/ggml/src/ggml-sycl/softmax.cpp +9 -10
  230. data/ext/sources/ggml/src/ggml-sycl/vecdotq.hpp +35 -0
  231. data/ext/sources/ggml/src/ggml-vulkan/CMakeLists.txt +5 -0
  232. data/ext/sources/ggml/src/ggml-vulkan/ggml-vulkan.cpp +833 -215
  233. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/col2im_1d.comp +61 -0
  234. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/conv2d_mm.comp +1 -1
  235. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/conv3d_mm.comp +431 -0
  236. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/diag.comp +3 -3
  237. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn.comp +1 -0
  238. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_cm1.comp +1 -0
  239. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/generic_unary_head.glsl +21 -19
  240. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/get_rows_back.comp +25 -0
  241. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/glu_head.glsl +23 -4
  242. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/glu_main.glsl +14 -18
  243. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/l2_norm.comp +4 -7
  244. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vecq.comp +21 -24
  245. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm.comp +31 -23
  246. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_cm2.comp +6 -5
  247. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_funcs.glsl +84 -67
  248. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/norm.comp +10 -10
  249. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/repeat_back.comp +3 -3
  250. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/roll.comp +3 -3
  251. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/tri.comp +3 -3
  252. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/unary.comp +168 -0
  253. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp +121 -74
  254. data/ext/sources/ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp +26 -19
  255. data/ext/sources/ggml/src/ggml-webgpu/ggml-webgpu.cpp +31 -36
  256. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/common_decls.tmpl +16 -2
  257. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn_vec_split.wgsl +7 -7
  258. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/get_rows.wgsl +21 -0
  259. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_decls.tmpl +439 -320
  260. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_id_vec.wgsl +2 -2
  261. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec.wgsl +45 -39
  262. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_acc.tmpl +586 -465
  263. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_q_acc.tmpl +63 -69
  264. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/quantize_q8.wgsl +14 -9
  265. data/ext/sources/ggml/src/ggml.c +36 -14
  266. data/ext/sources/include/whisper.h +21 -0
  267. data/ext/sources/src/whisper.cpp +164 -14
  268. data/lib/whisper/log_settable.rb +5 -8
  269. data/lib/whisper/model/uri.rb +0 -7
  270. data/sig/whisper.rbs +6 -0
  271. data/test/test_vad.rb +9 -0
  272. data/test/test_vad_context.rb +2 -2
  273. data/whispercpp.gemspec +1 -1
  274. metadata +62 -37
  275. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-flash-attn-ops.c +0 -1878
  276. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-matmul-ops.c +0 -2066
  277. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-ops.c +0 -6
  278. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-ops.h +0 -88
  279. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-profile.h +0 -34
  280. data/ext/sources/ggml/src/ggml-hexagon/htp/vtcm-utils.h +0 -16
  281. data/ext/sources/ggml/src/ggml-openvino/openvino/op/unary_gelu.cpp +0 -25
  282. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/abs.comp +0 -21
  283. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/ceil.comp +0 -22
  284. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/clamp.comp +0 -17
  285. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/cos.comp +0 -17
  286. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/elu.comp +0 -27
  287. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/exp.comp +0 -20
  288. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/floor.comp +0 -22
  289. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/gelu.comp +0 -25
  290. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/gelu_erf.comp +0 -39
  291. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/gelu_quick.comp +0 -23
  292. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/hardsigmoid.comp +0 -22
  293. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/hardswish.comp +0 -22
  294. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/leaky_relu.comp +0 -22
  295. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/neg.comp +0 -20
  296. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/relu.comp +0 -21
  297. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/round.comp +0 -29
  298. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sgn.comp +0 -21
  299. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sigmoid.comp +0 -20
  300. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/silu.comp +0 -22
  301. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sin.comp +0 -17
  302. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/softplus.comp +0 -23
  303. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sqrt.comp +0 -17
  304. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/square.comp +0 -17
  305. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/step.comp +0 -22
  306. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/tanh.comp +0 -20
  307. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/trunc.comp +0 -22
  308. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/xielu.comp +0 -35
@@ -17,6 +17,7 @@
17
17
  #include <openvino/op/reshape.hpp>
18
18
  #include <openvino/op/shape_of.hpp>
19
19
  #include <openvino/op/sin.hpp>
20
+ #include <openvino/op/split.hpp>
20
21
  #include <openvino/op/squeeze.hpp>
21
22
  #include <openvino/op/subtract.hpp>
22
23
  #include <openvino/op/transpose.hpp>
@@ -123,7 +124,8 @@ std::pair<ov::Output<Node>, ov::Output<Node>> make_sin_cos(int32_t * rope_params
123
124
  bool imrope,
124
125
  bool stateful) {
125
126
  if (stateful) {
126
- inp_pos = std::make_shared<ov::op::v0::Squeeze>(inp_pos, ov::op::v0::Constant::create(ov::element::i64, {1}, {0}));
127
+ inp_pos =
128
+ std::make_shared<ov::op::v0::Squeeze>(inp_pos, ov::op::v0::Constant::create(ov::element::i64, {1}, {0}));
127
129
  inp_pos = std::make_shared<ov::op::v0::Convert>(inp_pos, ov::element::f32);
128
130
  auto pos_perm =
129
131
  std::make_shared<ov::op::v0::Constant>(ov::element::i64, ov::Shape{3}, std::vector<int64_t>{2, 1, 0});
@@ -212,8 +214,9 @@ std::pair<ov::Output<Node>, ov::Output<Node>> make_sin_cos(int32_t * rope_params
212
214
  }
213
215
  auto one_minus_ramp = std::make_shared<ov::op::v1::Subtract>(one, ramp_mix);
214
216
 
215
- theta = std::make_shared<ov::op::v1::Add>(std::make_shared<ov::op::v1::Multiply>(theta_interp, one_minus_ramp),
216
- std::make_shared<ov::op::v1::Multiply>(theta_extrap, ramp_mix));
217
+ theta =
218
+ std::make_shared<ov::op::v1::Add>(std::make_shared<ov::op::v1::Multiply>(theta_interp, one_minus_ramp),
219
+ std::make_shared<ov::op::v1::Multiply>(theta_extrap, ramp_mix));
217
220
  mscale *= (1.0f + 0.1f * std::log(1.0f / freq_scale));
218
221
  }
219
222
  }
@@ -252,6 +255,548 @@ ov::Output<ov::Node> process_view_input(const NodeContext & context, int input_i
252
255
  return sliced;
253
256
  }
254
257
 
258
+ ov::Output<ov::Node> process_view_input_new(const NodeContext & context, int input_index) {
259
+ auto input = context.get_input(input_index);
260
+
261
+ // Check if this input has view inputs
262
+ size_t view_input_size = context.get_view_input_size(input_index);
263
+ if (view_input_size == 0) {
264
+ // No view inputs, return the input as is
265
+ return input;
266
+ }
267
+
268
+ // If translate_view already resolved this VIEW (produced a Slice), the input
269
+ // will already have the expected shape — skip re-slicing.
270
+ auto expected_ov_shape = context.get_view_input_ov_shape(input_index, 0);
271
+ auto actual_shape = input.get_partial_shape();
272
+ if (expected_ov_shape.rank().is_static() && actual_shape.rank().is_static() &&
273
+ expected_ov_shape.rank() == actual_shape.rank()) {
274
+ bool shapes_match = true;
275
+ for (int64_t i = 0; i < expected_ov_shape.rank().get_length(); ++i) {
276
+ if (!expected_ov_shape[i].is_static() || !actual_shape[i].is_static()) {
277
+ shapes_match = false;
278
+ break;
279
+ }
280
+ if (expected_ov_shape[i] != actual_shape[i]) {
281
+ shapes_match = false;
282
+ break;
283
+ }
284
+ }
285
+ if (shapes_match) {
286
+ return input;
287
+ }
288
+ }
289
+
290
+ // In static mode, use Split instead of Slice for single-dimension reductions.
291
+ // This ensures NPUW's FOLD doesn't parametrize per-layer slice indices (which
292
+ // would introduce dynamic shapes). A shared Split node sits outside the repeated
293
+ // subgraph boundary; each layer receives one of its output ports.
294
+ if (context.is_static() && view_input_size == 1) {
295
+ auto view_stride_v = context.get_view_input_stride(input_index, 0);
296
+ auto view_src_stride_v = context.get_view_input_src_stride(input_index, 0);
297
+ auto view_ggml_shape = context.get_view_input_ggml_shape(input_index, 0);
298
+ auto view_src_ggml_shape = context.get_view_input_src_ggml_shape(input_index, 0);
299
+ auto view_offset = context.get_view_input_offset(input_index, 0);
300
+ auto view_src_offset = context.get_view_input_src_offset(input_index, 0);
301
+
302
+ size_t ndims = view_ggml_shape.size();
303
+ std::vector<int> diff_dims;
304
+ if (view_src_ggml_shape.size() == ndims) {
305
+ for (size_t i = 0; i < ndims; ++i) {
306
+ if (view_ggml_shape[i] != view_src_ggml_shape[i]) {
307
+ diff_dims.push_back(static_cast<int>(i));
308
+ }
309
+ }
310
+ }
311
+
312
+ if (diff_dims.size() == 1) {
313
+ int split_dim = diff_dims[0];
314
+ int64_t num_splits = static_cast<int64_t>(view_src_ggml_shape[split_dim]);
315
+ int64_t chunk_size = static_cast<int64_t>(view_ggml_shape[split_dim]);
316
+
317
+ // Only apply when slicing exactly 1 element from a multi-element dimension
318
+ if (chunk_size == 1 && num_splits > 1) {
319
+ // Check suffix strides match (dimensions after split_dim)
320
+ bool suffix_ok = view_stride_v.size() == view_src_stride_v.size();
321
+ if (suffix_ok) {
322
+ for (size_t i = static_cast<size_t>(split_dim) + 1; i < ndims; ++i) {
323
+ if (view_stride_v[i] != view_src_stride_v[i]) {
324
+ suffix_ok = false;
325
+ break;
326
+ }
327
+ }
328
+ }
329
+
330
+ if (suffix_ok && view_src_stride_v[split_dim] > 0) {
331
+ size_t relative_offset = view_offset >= view_src_offset ? view_offset - view_src_offset : 0;
332
+ int64_t split_index = static_cast<int64_t>(relative_offset / view_src_stride_v[split_dim]);
333
+
334
+ if (split_index >= 0 && split_index < num_splits) {
335
+ auto src_node = input.get_node_shared_ptr();
336
+ std::string rt_key = "split_dim_" + std::to_string(split_dim);
337
+ auto & rt_info = src_node->get_rt_info();
338
+
339
+ if (rt_info.find(rt_key) == rt_info.end()) {
340
+ auto axis_const =
341
+ ov::op::v0::Constant::create(ov::element::i64, {}, {static_cast<int64_t>(split_dim)});
342
+ auto split_node =
343
+ std::make_shared<ov::op::v1::Split>(input, axis_const, static_cast<size_t>(num_splits));
344
+ split_node->set_friendly_name(src_node->get_friendly_name() + "_split");
345
+ rt_info[rt_key] = split_node;
346
+ }
347
+
348
+ auto split_node = rt_info[rt_key].as<std::shared_ptr<ov::op::v1::Split>>();
349
+ return split_node->output(static_cast<size_t>(split_index));
350
+ }
351
+ }
352
+ }
353
+ }
354
+ }
355
+
356
+ // Lambda function to process a single view operation
357
+ auto process_single_view =
358
+ [](ov::Output<ov::Node> current, size_t view_offset, const std::vector<size_t> & view_stride,
359
+ const ov::Shape & view_ggml_shape, const ov::PartialShape & view_ov_shape, const std::string & view_name,
360
+ size_t view_src_offset, const std::vector<size_t> & view_src_stride, const ov::Shape & view_src_ggml_shape,
361
+ const ov::PartialShape & view_src_ov_shape, const std::string & view_src_name) -> ov::Output<ov::Node> {
362
+ auto build_reshape_pattern = [](const ov::PartialShape & target_ov_shape,
363
+ const ov::Shape & target_ggml_shape) -> std::vector<int64_t> {
364
+ const size_t ndims = target_ggml_shape.size();
365
+ std::vector<int64_t> reshape_pattern(ndims);
366
+ size_t dynamic_dims = 0;
367
+
368
+ if (target_ov_shape.rank().is_static() &&
369
+ target_ov_shape.rank().get_length() == static_cast<int64_t>(ndims)) {
370
+ for (size_t i = 0; i < ndims; ++i) {
371
+ if (target_ov_shape[i].is_static()) {
372
+ reshape_pattern[i] = target_ov_shape[i].get_length();
373
+ } else {
374
+ reshape_pattern[i] = -1;
375
+ ++dynamic_dims;
376
+ }
377
+ }
378
+ } else {
379
+ dynamic_dims = 2;
380
+ }
381
+
382
+ if (dynamic_dims > 1) {
383
+ for (size_t i = 0; i < ndims; ++i) {
384
+ reshape_pattern[i] = static_cast<int64_t>(target_ggml_shape[i]);
385
+ }
386
+ }
387
+
388
+ return reshape_pattern;
389
+ };
390
+
391
+ auto build_prefix_tail_reshape_pattern = [](const ov::PartialShape & target_ov_shape,
392
+ const ov::Shape & target_ggml_shape, size_t prefix_dims,
393
+ int64_t tail_dim) -> std::vector<int64_t> {
394
+ std::vector<int64_t> reshape_pattern(prefix_dims + 1);
395
+ size_t dynamic_dims = 0;
396
+
397
+ if (target_ov_shape.rank().is_static() &&
398
+ target_ov_shape.rank().get_length() == static_cast<int64_t>(target_ggml_shape.size())) {
399
+ for (size_t i = 0; i < prefix_dims; ++i) {
400
+ if (target_ov_shape[i].is_static()) {
401
+ reshape_pattern[i] = target_ov_shape[i].get_length();
402
+ } else {
403
+ reshape_pattern[i] = -1;
404
+ ++dynamic_dims;
405
+ }
406
+ }
407
+ } else {
408
+ dynamic_dims = 2;
409
+ }
410
+
411
+ if (dynamic_dims > 1) {
412
+ for (size_t i = 0; i < prefix_dims; ++i) {
413
+ reshape_pattern[i] = static_cast<int64_t>(target_ggml_shape[i]);
414
+ }
415
+ }
416
+
417
+ reshape_pattern[prefix_dims] = tail_dim;
418
+ return reshape_pattern;
419
+ };
420
+
421
+ bool same_stride = view_stride.size() == view_src_stride.size();
422
+ if (same_stride) {
423
+ for (size_t i = 0; i < view_stride.size(); ++i) {
424
+ if (view_stride[i] != view_src_stride[i]) {
425
+ same_stride = false;
426
+ break;
427
+ }
428
+ }
429
+ }
430
+
431
+ bool same_ggml_shape = view_ggml_shape.size() == view_src_ggml_shape.size();
432
+ if (same_ggml_shape) {
433
+ for (size_t i = 0; i < view_ggml_shape.size(); ++i) {
434
+ if (view_ggml_shape[i] != view_src_ggml_shape[i]) {
435
+ same_ggml_shape = false;
436
+ break;
437
+ }
438
+ }
439
+ }
440
+
441
+ if (same_stride && same_ggml_shape) {
442
+ return current;
443
+ }
444
+
445
+ if (same_stride) {
446
+ const size_t relative_offset = view_offset >= view_src_offset ? view_offset - view_src_offset : 0;
447
+ const size_t ndims = view_stride.size();
448
+
449
+ std::vector<int> diff_dims;
450
+ if (view_ggml_shape.size() == ndims && view_src_ggml_shape.size() == ndims) {
451
+ for (size_t i = 0; i < ndims; ++i) {
452
+ if (view_ggml_shape[i] != view_src_ggml_shape[i]) {
453
+ diff_dims.push_back(static_cast<int>(i));
454
+ }
455
+ }
456
+ }
457
+
458
+ if (diff_dims.size() == 1) {
459
+ const int slice_dim = diff_dims[0];
460
+ const int64_t dim_size = static_cast<int64_t>(view_src_ggml_shape[slice_dim]);
461
+
462
+ if (view_stride[slice_dim] > 0 && relative_offset % view_stride[slice_dim] == 0) {
463
+ const int64_t begin_val = static_cast<int64_t>((relative_offset / view_stride[slice_dim]) %
464
+ static_cast<size_t>(dim_size));
465
+ const int64_t end_val = begin_val + static_cast<int64_t>(view_ggml_shape[slice_dim]);
466
+
467
+ if (begin_val >= 0 && end_val <= dim_size) {
468
+ auto sliced = std::make_shared<ov::op::v8::Slice>(
469
+ current, ov::op::v0::Constant::create(ov::element::i64, {1}, {begin_val}),
470
+ ov::op::v0::Constant::create(ov::element::i64, {1}, {end_val}),
471
+ ov::op::v0::Constant::create(ov::element::i64, {1}, {1}),
472
+ ov::op::v0::Constant::create(ov::element::i64, {1}, {slice_dim}));
473
+
474
+ if (view_ov_shape.is_static()) {
475
+ auto reshaped = std::make_shared<ov::op::v1::Reshape>(
476
+ sliced,
477
+ ov::op::v0::Constant::create(ov::element::i64, {ndims}, view_ov_shape.to_shape()),
478
+ false);
479
+ reshaped->set_friendly_name(view_name);
480
+ return reshaped;
481
+ }
482
+
483
+ sliced->set_friendly_name(view_name);
484
+ return sliced;
485
+ }
486
+ }
487
+
488
+ int64_t tail_src_elems = 1;
489
+ int64_t tail_dst_elems = 1;
490
+ for (size_t i = slice_dim; i < ndims; ++i) {
491
+ tail_src_elems *= static_cast<int64_t>(view_src_ggml_shape[i]);
492
+ tail_dst_elems *= static_cast<int64_t>(view_ggml_shape[i]);
493
+ }
494
+
495
+ const size_t elem_stride = view_stride[ndims - 1];
496
+ int64_t tail_begin = 0;
497
+ if (elem_stride > 0) {
498
+ tail_begin =
499
+ static_cast<int64_t>((relative_offset / elem_stride) % static_cast<size_t>(tail_src_elems));
500
+ }
501
+ const int64_t tail_end = tail_begin + tail_dst_elems;
502
+
503
+ if (tail_begin >= 0 && tail_end <= tail_src_elems) {
504
+ std::vector<int64_t> flat_shape;
505
+ for (int i = 0; i < slice_dim; ++i) {
506
+ flat_shape.push_back(static_cast<int64_t>(view_src_ggml_shape[i]));
507
+ }
508
+ flat_shape.push_back(tail_src_elems);
509
+ const size_t flat_ndims = flat_shape.size();
510
+
511
+ auto flat = std::make_shared<ov::op::v1::Reshape>(
512
+ current, ov::op::v0::Constant::create(ov::element::i64, {flat_ndims}, flat_shape), false);
513
+
514
+ auto sliced = std::make_shared<ov::op::v8::Slice>(
515
+ flat, ov::op::v0::Constant::create(ov::element::i64, {1}, {tail_begin}),
516
+ ov::op::v0::Constant::create(ov::element::i64, {1}, {tail_end}),
517
+ ov::op::v0::Constant::create(ov::element::i64, {1}, {1}),
518
+ ov::op::v0::Constant::create(ov::element::i64, {1}, {slice_dim}));
519
+
520
+ if (view_ov_shape.is_static()) {
521
+ auto reshaped = std::make_shared<ov::op::v1::Reshape>(
522
+ sliced, ov::op::v0::Constant::create(ov::element::i64, {ndims}, view_ov_shape.to_shape()),
523
+ false);
524
+ reshaped->set_friendly_name(view_name);
525
+ return reshaped;
526
+ }
527
+
528
+ sliced->set_friendly_name(view_name);
529
+ return sliced;
530
+ }
531
+ }
532
+
533
+ std::vector<int64_t> begin(ndims, 0);
534
+ std::vector<int64_t> end(ndims, 0);
535
+ std::vector<int64_t> step(ndims, 1);
536
+ std::vector<int64_t> axes(ndims, 0);
537
+
538
+ size_t remaining_offset = relative_offset;
539
+ for (size_t i = 0; i < ndims; ++i) {
540
+ axes[i] = static_cast<int64_t>(i);
541
+ if (view_stride[i] > 0) {
542
+ begin[i] = static_cast<int64_t>(remaining_offset / view_stride[i]);
543
+ remaining_offset %= view_stride[i];
544
+ }
545
+ end[i] = begin[i] + static_cast<int64_t>(view_ggml_shape[i]);
546
+ }
547
+
548
+ bool in_bounds = view_src_ggml_shape.size() == ndims && view_ggml_shape.size() == ndims;
549
+ if (in_bounds) {
550
+ for (size_t i = 0; i < ndims; ++i) {
551
+ if (end[i] > static_cast<int64_t>(view_src_ggml_shape[i])) {
552
+ in_bounds = false;
553
+ break;
554
+ }
555
+ }
556
+ }
557
+
558
+ if (in_bounds && remaining_offset == 0) {
559
+ auto sliced = std::make_shared<ov::op::v8::Slice>(
560
+ current, ov::op::v0::Constant::create(ov::element::i64, {ndims}, begin),
561
+ ov::op::v0::Constant::create(ov::element::i64, {ndims}, end),
562
+ ov::op::v0::Constant::create(ov::element::i64, {ndims}, step),
563
+ ov::op::v0::Constant::create(ov::element::i64, {ndims}, axes));
564
+
565
+ sliced->set_friendly_name(view_name);
566
+ return sliced;
567
+ }
568
+ } else {
569
+ bool same_rank = view_stride.size() == view_src_stride.size() &&
570
+ view_ggml_shape.size() == view_src_ggml_shape.size() &&
571
+ view_stride.size() == view_ggml_shape.size();
572
+ const size_t relative_offset = view_offset >= view_src_offset ? view_offset - view_src_offset : 0;
573
+
574
+ if (same_rank) {
575
+ const size_t ndims = view_ggml_shape.size();
576
+ std::vector<int> diff_dims;
577
+ for (size_t i = 0; i < ndims; ++i) {
578
+ if (view_ggml_shape[i] != view_src_ggml_shape[i]) {
579
+ diff_dims.push_back(static_cast<int>(i));
580
+ }
581
+ }
582
+
583
+ if (diff_dims.size() == 1) {
584
+ const size_t slice_dim = static_cast<size_t>(diff_dims[0]);
585
+ bool suffix_stride_match = true;
586
+ for (size_t i = slice_dim + 1; i < ndims; ++i) {
587
+ if (view_stride[i] != view_src_stride[i]) {
588
+ suffix_stride_match = false;
589
+ break;
590
+ }
591
+ }
592
+
593
+ if (suffix_stride_match && view_src_stride[slice_dim] > 0 &&
594
+ relative_offset % view_src_stride[slice_dim] == 0) {
595
+ const int64_t begin_val = static_cast<int64_t>(relative_offset / view_src_stride[slice_dim]);
596
+ const int64_t end_val = begin_val + static_cast<int64_t>(view_ggml_shape[slice_dim]);
597
+ const int64_t dim_size = static_cast<int64_t>(view_src_ggml_shape[slice_dim]);
598
+
599
+ if (begin_val >= 0 && end_val <= dim_size) {
600
+ auto sliced = std::make_shared<ov::op::v8::Slice>(
601
+ current, ov::op::v0::Constant::create(ov::element::i64, {1}, {begin_val}),
602
+ ov::op::v0::Constant::create(ov::element::i64, {1}, {end_val}),
603
+ ov::op::v0::Constant::create(ov::element::i64, {1}, {1}),
604
+ ov::op::v0::Constant::create(ov::element::i64, {1}, {static_cast<int64_t>(slice_dim)}));
605
+ sliced->set_friendly_name(view_name);
606
+ return sliced;
607
+ }
608
+ }
609
+ }
610
+ }
611
+
612
+ size_t view_elems = 1;
613
+ size_t src_elems = 1;
614
+ if (same_rank) {
615
+ for (size_t i = 0; i < view_ggml_shape.size(); ++i) {
616
+ view_elems *= view_ggml_shape[i];
617
+ src_elems *= view_src_ggml_shape[i];
618
+ }
619
+ }
620
+
621
+ bool same_num_elements = same_rank && view_elems == src_elems;
622
+
623
+ if (same_rank && relative_offset == 0 && same_num_elements) {
624
+ auto reshape_pattern = build_reshape_pattern(view_ov_shape, view_ggml_shape);
625
+
626
+ auto reshaped = std::make_shared<ov::op::v1::Reshape>(
627
+ current, ov::op::v0::Constant::create(ov::element::i64, {reshape_pattern.size()}, reshape_pattern),
628
+ false);
629
+ reshaped->set_friendly_name(view_name);
630
+ return reshaped;
631
+ }
632
+
633
+ if (same_rank) {
634
+ const size_t ndims = view_ggml_shape.size();
635
+
636
+ // Match views that can be expressed as a regular strided slice over the
637
+ // already reconstructed source tensor, e.g. offset on one axis plus step > 1
638
+ // on another axis.
639
+ bool is_regular_slice = view_src_ggml_shape.size() == ndims;
640
+ std::vector<int64_t> begin(ndims, 0);
641
+ std::vector<int64_t> end(ndims, 0);
642
+ std::vector<int64_t> step(ndims, 1);
643
+ std::vector<int64_t> axes(ndims, 0);
644
+ size_t remaining_offset = relative_offset;
645
+
646
+ if (is_regular_slice) {
647
+ for (size_t i = 0; i < ndims; ++i) {
648
+ axes[i] = static_cast<int64_t>(i);
649
+
650
+ if (view_src_stride[i] == 0 || view_stride[i] == 0 ||
651
+ view_stride[i] % view_src_stride[i] != 0) {
652
+ is_regular_slice = false;
653
+ break;
654
+ }
655
+
656
+ step[i] = static_cast<int64_t>(view_stride[i] / view_src_stride[i]);
657
+ if (step[i] <= 0) {
658
+ is_regular_slice = false;
659
+ break;
660
+ }
661
+
662
+ begin[i] = static_cast<int64_t>(remaining_offset / view_src_stride[i]);
663
+ remaining_offset %= view_src_stride[i];
664
+
665
+ if (view_ggml_shape[i] == 0) {
666
+ end[i] = begin[i];
667
+ continue;
668
+ }
669
+
670
+ end[i] = begin[i] + step[i] * static_cast<int64_t>(view_ggml_shape[i] - 1) + 1;
671
+
672
+ if (begin[i] < 0 || end[i] > static_cast<int64_t>(view_src_ggml_shape[i])) {
673
+ is_regular_slice = false;
674
+ break;
675
+ }
676
+ }
677
+ }
678
+
679
+ if (is_regular_slice && remaining_offset == 0) {
680
+ auto sliced = std::make_shared<ov::op::v8::Slice>(
681
+ current, ov::op::v0::Constant::create(ov::element::i64, {ndims}, begin),
682
+ ov::op::v0::Constant::create(ov::element::i64, {ndims}, end),
683
+ ov::op::v0::Constant::create(ov::element::i64, {ndims}, step),
684
+ ov::op::v0::Constant::create(ov::element::i64, {ndims}, axes));
685
+
686
+ sliced->set_friendly_name(view_name);
687
+ return sliced;
688
+ }
689
+
690
+ const size_t elem_stride = view_src_stride.back();
691
+ const bool aligned_offset = elem_stride > 0 && relative_offset % elem_stride == 0;
692
+
693
+ if (aligned_offset) {
694
+ size_t suffix_start = 0;
695
+ size_t expected_stride = elem_stride;
696
+ for (int i = static_cast<int>(ndims) - 1; i >= 0; --i) {
697
+ if (view_stride[i] != expected_stride) {
698
+ suffix_start = static_cast<size_t>(i + 1);
699
+ break;
700
+ }
701
+ expected_stride *= view_ggml_shape[i];
702
+ }
703
+
704
+ size_t prefix_elems = 1;
705
+ size_t suffix_elems = 1;
706
+ for (size_t i = 0; i < suffix_start; ++i) {
707
+ prefix_elems *= view_ggml_shape[i];
708
+ }
709
+ for (size_t i = suffix_start; i < ndims; ++i) {
710
+ suffix_elems *= view_ggml_shape[i];
711
+ }
712
+
713
+ if (prefix_elems > 0 && src_elems % prefix_elems == 0) {
714
+ const size_t src_tail_elems = src_elems / prefix_elems;
715
+ const int64_t tail_begin = static_cast<int64_t>(relative_offset / elem_stride);
716
+ const int64_t tail_end = tail_begin + static_cast<int64_t>(suffix_elems);
717
+
718
+ if (tail_begin >= 0 && tail_end <= static_cast<int64_t>(src_tail_elems)) {
719
+ auto prefix_tail_pattern = build_prefix_tail_reshape_pattern(
720
+ view_ov_shape, view_ggml_shape, suffix_start, static_cast<int64_t>(src_tail_elems));
721
+
722
+ auto prefix_tail = std::make_shared<ov::op::v1::Reshape>(
723
+ current,
724
+ ov::op::v0::Constant::create(ov::element::i64, {prefix_tail_pattern.size()},
725
+ prefix_tail_pattern),
726
+ false);
727
+
728
+ ov::Output<ov::Node> selected = prefix_tail;
729
+ if (tail_begin != 0 || tail_end != static_cast<int64_t>(src_tail_elems)) {
730
+ selected = std::make_shared<ov::op::v8::Slice>(
731
+ prefix_tail, ov::op::v0::Constant::create(ov::element::i64, {1}, {tail_begin}),
732
+ ov::op::v0::Constant::create(ov::element::i64, {1}, {tail_end}),
733
+ ov::op::v0::Constant::create(ov::element::i64, {1}, {1}),
734
+ ov::op::v0::Constant::create(ov::element::i64, {1},
735
+ {static_cast<int64_t>(suffix_start)}));
736
+ }
737
+
738
+ auto reshape_pattern = build_reshape_pattern(view_ov_shape, view_ggml_shape);
739
+ auto reshaped = std::make_shared<ov::op::v1::Reshape>(
740
+ selected,
741
+ ov::op::v0::Constant::create(ov::element::i64, {reshape_pattern.size()},
742
+ reshape_pattern),
743
+ false);
744
+ reshaped->set_friendly_name(view_name);
745
+ return reshaped;
746
+ }
747
+ }
748
+ }
749
+ }
750
+
751
+ return current;
752
+ }
753
+
754
+ (void) view_name;
755
+ (void) view_src_ov_shape;
756
+ (void) view_src_name;
757
+
758
+ return current;
759
+ };
760
+
761
+ // Process views from the base tensor (last) to the current view (first)
762
+ // Start with the base tensor
763
+ ov::Output<ov::Node> current = input;
764
+
765
+ // Process each view in reverse order (from base to current)
766
+ for (int view_idx = view_input_size - 1; view_idx >= 0; view_idx--) {
767
+ auto view_offset = context.get_view_input_offset(input_index, view_idx);
768
+ auto view_stride = context.get_view_input_stride(input_index, view_idx);
769
+ auto view_ggml_shape = context.get_view_input_ggml_shape(input_index, view_idx);
770
+ auto view_ov_shape = context.get_view_input_ov_shape(input_index, view_idx);
771
+ auto view_name = context.get_view_input_name(input_index, view_idx);
772
+
773
+ // print view info
774
+ // std::cout << "View " << view_idx << ": name = " << view_name << ", offset = " << view_offset << ", stride = ["
775
+ // << view_stride[0] << "," << view_stride[1] << "," << view_stride[2] << "," << view_stride[3]
776
+ // << "], ggml shape = [" << view_ggml_shape[0] << "," << view_ggml_shape[1] << ","
777
+ // << view_ggml_shape[2] << "," << view_ggml_shape[3] << "], ov shape = " << view_ov_shape << std::endl;
778
+
779
+ auto view_src_offset = context.get_view_input_src_offset(input_index, view_idx);
780
+ auto view_src_stride = context.get_view_input_src_stride(input_index, view_idx);
781
+ auto view_src_ggml_shape = context.get_view_input_src_ggml_shape(input_index, view_idx);
782
+ auto view_src_ov_shape = context.get_view_input_src_ov_shape(input_index, view_idx);
783
+ auto view_src_name = context.get_view_input_src_name(input_index, view_idx);
784
+ // print source view info
785
+ // std::cout << "View " << view_idx << ": source name = " << view_src_name
786
+ // << ", source offset = " << view_src_offset << ", source stride = [" << view_src_stride[0] << ","
787
+ // << view_src_stride[1] << "," << view_src_stride[2] << "," << view_src_stride[3]
788
+ // << "], source ggml shape = [" << view_src_ggml_shape[0] << "," << view_src_ggml_shape[1] << ","
789
+ // << view_src_ggml_shape[2] << "," << view_src_ggml_shape[3]
790
+ // << "], source ov shape = " << view_src_ov_shape << std::endl;
791
+
792
+ current = process_single_view(current, view_offset, view_stride, view_ggml_shape, view_ov_shape, view_name,
793
+ view_src_offset, view_src_stride, view_src_ggml_shape, view_src_ov_shape,
794
+ view_src_name);
795
+ }
796
+
797
+ return current;
798
+ }
799
+
255
800
  } // namespace ggml
256
801
  } // namespace frontend
257
802
  } // namespace ov