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
@@ -1,6 +1,7 @@
1
1
  #pragma once
2
2
 
3
- #include "ggml-quants.h"
3
+ #include "ggml-backend-impl.h"
4
+ #include "ggml-backend.h"
4
5
  #include "ggml.h"
5
6
  #include "openvino/decoder.h"
6
7
 
@@ -14,21 +15,21 @@
14
15
 
15
16
  struct ModelParams {
16
17
  int ctx = -1;
17
- int ctx_swa = -1;
18
18
  int ctx_per_seq = -1;
19
19
  int ctx_per_seq_swa = -1;
20
20
  int n_seq = 1;
21
- int n_heads = -1;
22
21
  int n_heads_kv = -1;
23
22
  int head_size = -1;
24
23
  int32_t rope_params[15];
24
+ bool mixed_rope_params = false;
25
25
  std::vector<int> swa_layers;
26
26
 
27
27
  std::vector<std::string> kv_names;
28
28
  size_t kv_buffer_ctx_id = 0;
29
29
 
30
30
  bool same_rope_params(const ModelParams & other) const {
31
- return memcmp(rope_params, other.rope_params, sizeof(int32_t) * 15) == 0;
31
+ return mixed_rope_params == other.mixed_rope_params &&
32
+ memcmp(rope_params, other.rope_params, sizeof(int32_t) * 15) == 0;
32
33
  }
33
34
 
34
35
  bool can_reuse_dynamically(const ModelParams & other) const { return same_rope_params(other); }
@@ -56,12 +57,14 @@ public:
56
57
  std::string node_name;
57
58
  std::string node_op_type;
58
59
  std::map<std::string, ggml_tensor *> node_inputs;
60
+ std::map<std::string, std::vector<std::pair<std::string, ggml_tensor *>>> node_inputs_views;
59
61
  std::vector<std::string> node_inputs_names;
60
62
  ggml_tensor * node_output;
61
63
  std::string node_output_name;
62
64
  int node_op_case = 0;
63
65
  void * data_addr;
64
66
  };
67
+
65
68
  // Graph decoder
66
69
  GgmlOvDecoder(ggml_cgraph * cgraph,
67
70
  ModelParams & model_params,
@@ -69,6 +72,7 @@ public:
69
72
  std::map<std::string, std::shared_ptr<ov::Node>> & model_weights,
70
73
  bool is_static,
71
74
  bool is_stateful = false,
75
+ bool model_is_splitted = false,
72
76
  bool is_prefill = false,
73
77
  int prefill_chunk_size = 256);
74
78
 
@@ -84,6 +88,42 @@ public:
84
88
 
85
89
  virtual std::vector<size_t> get_input_stride(int node_idx, const std::string & name) const override;
86
90
 
91
+ virtual size_t get_view_input_size(int node_idx, const std::string & name) const override;
92
+
93
+ virtual size_t get_view_input_offset(int node_idx, const std::string & name, size_t view_index) const override;
94
+
95
+ virtual size_t get_view_input_src_offset(int node_idx, const std::string & name, size_t view_index) const override;
96
+
97
+ virtual std::vector<size_t> get_view_input_stride(int node_idx,
98
+ const std::string & name,
99
+ size_t view_index) const override;
100
+
101
+ virtual std::vector<size_t> get_view_input_src_stride(int node_idx,
102
+ const std::string & name,
103
+ size_t view_index) const override;
104
+
105
+ virtual ov::Shape get_view_input_ggml_shape(int node_idx,
106
+ const std::string & name,
107
+ size_t view_index) const override;
108
+
109
+ virtual ov::Shape get_view_input_src_ggml_shape(int node_idx,
110
+ const std::string & name,
111
+ size_t view_index) const override;
112
+
113
+ virtual ov::PartialShape get_view_input_ov_shape(int node_idx,
114
+ const std::string & name,
115
+ size_t view_index) const override;
116
+
117
+ virtual ov::PartialShape get_view_input_src_ov_shape(int node_idx,
118
+ const std::string & name,
119
+ size_t view_index) const override;
120
+
121
+ virtual std::string get_view_input_name(int node_idx, const std::string & name, size_t view_index) const override;
122
+
123
+ virtual std::string get_view_input_src_name(int node_idx,
124
+ const std::string & name,
125
+ size_t view_index) const override;
126
+
87
127
  virtual ov::element::Type get_input_type(int node_idx, const std::string & name) const override;
88
128
 
89
129
  virtual size_t get_input_size() const override;
@@ -106,10 +146,14 @@ public:
106
146
 
107
147
  virtual ov::element::Type get_output_type(int node_idx) const override;
108
148
 
149
+ virtual std::vector<size_t> get_output_stride(int node_idx) const override;
150
+
109
151
  virtual int32_t * get_input_op_params(int node_idx, const std::string & name) const override;
110
152
 
111
153
  virtual int32_t * get_output_op_params(int node_idx) const override;
112
154
 
155
+ virtual size_t get_output_op_offset(int node_idx) const override;
156
+
113
157
  virtual std::vector<std::string> get_output_names(int node_idx) const override;
114
158
 
115
159
  virtual const std::string & get_op_type() const override;
@@ -120,7 +164,10 @@ public:
120
164
 
121
165
  virtual const std::string & get_op_name(int node_idx) const override;
122
166
 
123
- virtual void visit_subgraph(std::function<void(std::shared_ptr<GgmlDecoder>, int node_idx)> node_visitor) const override;
167
+ virtual int32_t get_op_dynamic_dim(int node_idx) const override;
168
+
169
+ virtual void visit_subgraph(
170
+ std::function<void(std::shared_ptr<GgmlDecoder>, int node_idx)> node_visitor) const override;
124
171
 
125
172
  ggml_tensor * get_input_ggml_tensor(const std::string & name) const { return m_inputs.at(name); }
126
173
 
@@ -142,16 +189,12 @@ public:
142
189
  return m_model_weights;
143
190
  }
144
191
 
145
- virtual std::vector<std::string> get_model_output_names() const override {
146
- return m_model_output_names;
147
- }
192
+ virtual std::vector<std::string> get_model_output_names() const override { return m_model_output_names; }
148
193
 
149
194
  const std::map<std::string, ggml_tensor *> & get_model_outputs() const { return m_model_outputs; }
150
195
 
151
196
  virtual int get_ctx_size() const { return m_model_params.ctx; }
152
197
 
153
- virtual int get_ctx_swa_size() const { return m_model_params.ctx_swa; }
154
-
155
198
  virtual int get_ctx_per_seq() const { return m_model_params.ctx_per_seq; }
156
199
 
157
200
  virtual int get_ctx_per_seq_swa() const { return m_model_params.ctx_per_seq_swa; }
@@ -169,13 +212,21 @@ public:
169
212
 
170
213
  virtual int32_t * get_rope_params() const override { return const_cast<int32_t *>(m_model_params.rope_params); }
171
214
 
215
+ virtual bool has_mixed_rope_params() const override { return m_model_params.mixed_rope_params; }
216
+
172
217
  virtual std::map<std::string, std::string> get_kv_param_res_names() const override;
173
218
 
174
219
  virtual bool is_static() const override { return m_is_static; }
175
220
 
176
221
  virtual bool is_stateful() const override { return m_is_stateful; }
177
222
 
178
- ov::PartialShape get_graph_input_shape(const ggml_tensor * op, const ggml_tensor * input) const;
223
+ int get_static_n_tokens() const { return m_is_prefill ? m_prefill_chunk_size : 1; }
224
+
225
+ virtual bool is_splited_model() const override { return m_model_is_splitted; }
226
+
227
+ ov::PartialShape get_graph_input_shape(const ggml_tensor * op,
228
+ const ggml_tensor * input,
229
+ int dynamic_dim_index = -1) const;
179
230
 
180
231
  static void dump_cgraph(const ggml_cgraph * cgraph, std::string & filename);
181
232
 
@@ -205,6 +256,7 @@ public:
205
256
  bool m_is_prefill = false;
206
257
  bool m_naive = false;
207
258
  int m_prefill_chunk_size = 0;
259
+ bool m_model_is_splitted = false; // label the cgraph is splited or not
208
260
 
209
261
  static ov::Shape get_shape(const ggml_tensor * tensor);
210
262
  static std::vector<size_t> get_stride(const ggml_tensor * tensor);
@@ -227,7 +279,8 @@ public:
227
279
  }
228
280
 
229
281
  inline static bool is_inp_mask(const ggml_tensor * tensor, const ggml_tensor * op) {
230
- return op->op == GGML_OP_CPY || (op->op == GGML_OP_FLASH_ATTN_EXT && tensor == op->src[3]);
282
+ return op->op == GGML_OP_CPY || (op->op == GGML_OP_FLASH_ATTN_EXT && tensor == op->src[3]) ||
283
+ (op->op == GGML_OP_SOFT_MAX && tensor == op->src[1]);
231
284
  }
232
285
 
233
286
  inline static bool is_rope_freqs_weight(const ggml_tensor * tensor, const ggml_tensor * op) {
@@ -235,7 +288,8 @@ public:
235
288
  }
236
289
 
237
290
  inline static bool is_kvcache(const ggml_tensor * tensor, const ggml_tensor * op) {
238
- return op->op == GGML_OP_SET_ROWS && op->src[2] == tensor;
291
+ return tensor->buffer->usage == GGML_BACKEND_BUFFER_USAGE_ANY ||
292
+ (op != nullptr && op->op == GGML_OP_SET_ROWS && op->src[2] == tensor);
239
293
  }
240
294
 
241
295
  inline static bool is_kv_idx(const ggml_tensor * tensor, const ggml_tensor * op) {
@@ -243,23 +297,18 @@ public:
243
297
  }
244
298
 
245
299
  inline static bool is_output_idx(const ggml_tensor * tensor, const ggml_tensor * op) {
246
- return op->op == GGML_OP_GET_ROWS && tensor == op->src[1] && op->src[0]->op != GGML_OP_NONE;
300
+ return op->op == GGML_OP_GET_ROWS && tensor == op->src[1] && op->src[0]->op != GGML_OP_NONE &&
301
+ op->src[1]->op == GGML_OP_NONE;
247
302
  }
248
303
 
249
- static std::string get_graph_input_ov_name(const ggml_tensor * tensor, const ggml_tensor * op) {
250
- if (is_inp_tok(tensor, op)) {
251
- return "inp_tokens";
252
- }
304
+ std::string get_graph_input_ov_name(const ggml_tensor * tensor, const ggml_tensor * op) {
253
305
  if (is_inp_pos(tensor, op)) {
254
306
  return "inp_pos";
255
307
  }
256
308
  if (is_inp_emb(tensor, op)) {
257
309
  return "embd";
258
310
  }
259
- if (is_output_idx(tensor, op)) {
260
- return "inp_out_ids";
261
- }
262
- if (is_inp_mask(tensor, op)) {
311
+ if (is_stateful() && is_inp_mask(tensor, op)) {
263
312
  return std::string(tensor->name).find("swa") == std::string::npos ? "self_kq_mask" : "self_kq_mask_swa";
264
313
  }
265
314
  return tensor->name;
@@ -272,6 +321,9 @@ private:
272
321
  void compute_model_inputs();
273
322
  void compute_model_outputs();
274
323
 
324
+ // Infer and propagate dynamic-dimension indices for all tensors in the GGML graph.
325
+ void compute_node_dynamic_dims();
326
+
275
327
  void validate_cgraph() const;
276
328
 
277
329
  ggml_cgraph * m_cgraph = nullptr;
@@ -284,6 +336,7 @@ private:
284
336
  std::map<std::string, ggml_tensor *> m_model_outputs;
285
337
  std::vector<std::string> m_model_output_names;
286
338
  std::vector<NodeInfo> m_node_info_list;
339
+ std::map<ggml_tensor *, int> m_node_dynamic_dims;
287
340
 
288
341
  ModelParams m_model_params;
289
342
  ComputeParams m_compute_params;
@@ -291,4 +344,4 @@ private:
291
344
 
292
345
  void print_tensor_address_map(const ggml_cgraph * cgraph);
293
346
 
294
- int extract_layer_from_name(const std::string & name);
347
+ std::optional<int> extract_layer_from_name(const std::string & name);
@@ -3,6 +3,7 @@
3
3
  #include "ggml-impl.h"
4
4
  #include "ggml.h"
5
5
 
6
+ #include <cstdlib>
6
7
  #include <cstring>
7
8
  #include <openvino/runtime/intel_gpu/ocl/ocl.hpp>
8
9
  #include <openvino/runtime/intel_npu/level_zero/level_zero.hpp>
@@ -22,7 +23,38 @@ void ggml_openvino_device_config::init() {
22
23
  if (initialized) {
23
24
  return;
24
25
  }
25
- device_name = getenv("GGML_OPENVINO_DEVICE") ? getenv("GGML_OPENVINO_DEVICE") : "CPU";
26
+
27
+ // All recognized GGML_OPENVINO_* env vars. Their values are cached here
28
+ // once at backend init time and read back via ggml_openvino_getenv_str()
29
+ // (raw string) or ggml_openvino_getenv_int() (integer / boolean toggle).
30
+ static constexpr const char * env_var_names[] = {
31
+ // String values (use ggml_openvino_getenv_str)
32
+ "GGML_OPENVINO_DEVICE",
33
+ "GGML_OPENVINO_CACHE_DIR",
34
+ // Integer values (use ggml_openvino_getenv_int)
35
+ "GGML_OPENVINO_PREFILL_CHUNK_SIZE",
36
+ // Boolean toggles (treated as int flags via ggml_openvino_getenv_int)
37
+ "GGML_OPENVINO_STATEFUL_EXECUTION",
38
+ "GGML_OPENVINO_PROFILING",
39
+ "GGML_OPENVINO_DUMP_CGRAPH",
40
+ "GGML_OPENVINO_DUMP_IR",
41
+ "GGML_OPENVINO_DEBUG_INPUT",
42
+ "GGML_OPENVINO_DEBUG_OUTPUT",
43
+ "GGML_OPENVINO_PRINT_CGRAPH_TENSOR_ADDRESS",
44
+ "GGML_OPENVINO_ENABLE_CACHE",
45
+ "GGML_OPENVINO_DISABLE_CACHE",
46
+ "GGML_OPENVINO_DISABLE_KV_SLICE",
47
+ "GGML_OPENVINO_MANUAL_GQA_ATTN",
48
+ };
49
+
50
+ for (const char * const & env_var : env_var_names) {
51
+ auto * env = getenv(env_var);
52
+ if (env) {
53
+ environment_variables[env_var] = env;
54
+ }
55
+ }
56
+
57
+ device_name = ggml_openvino_getenv_str("GGML_OPENVINO_DEVICE", "CPU");
26
58
  auto available_devices = ov_singleton_core().get_available_devices();
27
59
  if (std::find(available_devices.begin(), available_devices.end(), device_name) == available_devices.end()) {
28
60
  GGML_LOG_WARN("GGML OpenVINO Backend: device %s is not available, fallback to CPU\n", device_name.c_str());
@@ -30,7 +62,7 @@ void ggml_openvino_device_config::init() {
30
62
  }
31
63
  is_npu = (device_name == "NPU");
32
64
 
33
- auto * cache_dir = getenv("GGML_OPENVINO_CACHE_DIR");
65
+ const char * cache_dir = ggml_openvino_getenv_str("GGML_OPENVINO_CACHE_DIR");
34
66
  if (device_name == "NPU") {
35
67
  compile_config = {
36
68
  {"NPU_COMPILER_DYNAMIC_QUANTIZATION", "YES" },
@@ -119,6 +151,23 @@ const std::string & ggml_openvino_get_device_name() {
119
151
  return ggml_openvino_get_device_config().device_name;
120
152
  }
121
153
 
154
+ // Get the value of a GGML_OPENVINO_* env var as a string. Returns
155
+ // default_value when the var is unset or set to an empty string.
156
+ const char * ggml_openvino_getenv_str(const char * var, const char * default_value) {
157
+ auto & env_map = ggml_openvino_get_device_config().environment_variables;
158
+ auto it = env_map.find(var);
159
+ return (it == env_map.end() || it->second.empty()) ? default_value : it->second.c_str();
160
+ }
161
+
162
+ // Get the value of a GGML_OPENVINO_* env var as an int (via std::atoi).
163
+ // Returns default_value (0) when the var is unset or empty. Used for both
164
+ // integer settings (e.g. GGML_OPENVINO_PREFILL_CHUNK_SIZE) and boolean
165
+ // toggles: "0" disables, any non-zero integer enables.
166
+ int ggml_openvino_getenv_int(const char * var, int default_value) {
167
+ const char * v = ggml_openvino_getenv_str(var, nullptr);
168
+ return v ? std::atoi(v) : default_value;
169
+ }
170
+
122
171
  // Check if running on NPU
123
172
  bool ggml_openvino_is_npu() {
124
173
  return ggml_openvino_get_device_config().is_npu;
@@ -173,7 +222,8 @@ std::optional<ExtraQuantType> ggml_openvino_get_requant_type(const ggml_tensor *
173
222
  return std::nullopt;
174
223
  }
175
224
  if (strncmp(tensor->name, "token_embd.weight", 17) == 0) {
176
- return ((ggml_openvino_is_npu() && tensor->type == GGML_TYPE_Q6_K) ? ExtraQuantType::F16 : ExtraQuantType::Q8_0_C);
225
+ return ((ggml_openvino_is_npu() && tensor->type == GGML_TYPE_Q6_K) ? ExtraQuantType::F16 :
226
+ ExtraQuantType::Q8_0_C);
177
227
  }
178
228
  if (strncmp(tensor->name, "output.weight", 13) == 0) {
179
229
  return ExtraQuantType::Q8_0_C;
@@ -298,6 +348,10 @@ ggml_openvino_extracted_layout ggml_openvino_get_extracted_layout(const ggml_ten
298
348
  layout.is_symmetric = true;
299
349
  break;
300
350
 
351
+ case GGML_TYPE_Q5_1:
352
+ // u8 weights (5-bit values), asymmetric (scale + zero point)
353
+ break;
354
+
301
355
  case GGML_TYPE_Q6_K:
302
356
  layout.weights_per_block = 16;
303
357
  layout.is_symmetric = true;
@@ -64,6 +64,7 @@ struct ggml_openvino_device_config {
64
64
  bool initialized = false;
65
65
  std::optional<ov::RemoteContext> remote_context;
66
66
  ov::AnyMap compile_config;
67
+ std::unordered_map<std::string, std::string> environment_variables;
67
68
  cl_command_queue cl_queue = nullptr;
68
69
 
69
70
  void init();
@@ -79,6 +80,22 @@ void ggml_openvino_init_device_config();
79
80
  // Get the device name
80
81
  const std::string & ggml_openvino_get_device_name();
81
82
 
83
+ // Environment variable accessors. All GGML_OPENVINO_* env vars are read once
84
+ // during backend init and cached on the device config; consumers must go
85
+ // through these helpers (never call ::getenv directly) so behavior stays
86
+ // consistent and centralized.
87
+ //
88
+ // Use ggml_openvino_getenv_str() for string / path values
89
+ // (e.g. GGML_OPENVINO_DEVICE, GGML_OPENVINO_CACHE_DIR). The optional
90
+ // default_value is returned when the var is unset or empty.
91
+ //
92
+ // Use ggml_openvino_getenv_int() for boolean toggles and integer settings.
93
+ // It returns std::atoi(value) when set, otherwise default_value. For
94
+ // boolean use, `if (ggml_openvino_getenv_int(name))` is true iff the value
95
+ // is a non-zero integer (so "0" disables, "1" enables).
96
+ const char * ggml_openvino_getenv_str(const char * var, const char * default_value = nullptr);
97
+ int ggml_openvino_getenv_int(const char * var, int default_value = 0);
98
+
82
99
  // Check if running on NPU
83
100
  bool ggml_openvino_is_npu();
84
101
 
@@ -115,9 +132,9 @@ struct ggml_openvino_weight_extra : public ggml_openvino_extra_base {
115
132
 
116
133
  // Extra data for quantized weight tensors - stores extracted weights/scales/zp and weight node
117
134
  struct ggml_openvino_quantized_weight_extra : public ggml_openvino_extra_base {
118
- ov::Tensor weights; // U4 or U8 extracted weights
119
- ov::Tensor scales; // F16 scales
120
- ov::Tensor zp; // U4 or U8 zero points (same type as weights)
135
+ ov::Tensor weights; // U4 or U8 extracted weights
136
+ ov::Tensor scales; // F16 scales
137
+ ov::Tensor zp; // U4 or U8 zero points (same type as weights)
121
138
  std::shared_ptr<ov::Node> weight_node; // Pre-built OpenVINO weight subgraph
122
139
 
123
140
  ggml_openvino_quantized_weight_extra(ov::Tensor w, ov::Tensor s, ov::Tensor z, std::shared_ptr<ov::Node> n) :
@@ -132,8 +149,9 @@ struct ggml_openvino_quantized_weight_extra : public ggml_openvino_extra_base {
132
149
  struct ggml_openvino_tensor_extra : public ggml_openvino_extra_base {
133
150
  std::shared_ptr<ov::Tensor> tensor; // For direct use with infer_request
134
151
 
135
- explicit ggml_openvino_tensor_extra(std::shared_ptr<ov::Tensor> t)
136
- : ggml_openvino_extra_base(Type::TENSOR), tensor(std::move(t)) {}
152
+ explicit ggml_openvino_tensor_extra(std::shared_ptr<ov::Tensor> t) :
153
+ ggml_openvino_extra_base(Type::TENSOR),
154
+ tensor(std::move(t)) {}
137
155
  };
138
156
 
139
157
  // =====================================================
@@ -152,11 +170,11 @@ struct ggml_openvino_extracted_layout {
152
170
  size_t zp_size = 0; // Size of zero points in bytes (U4 or U8)
153
171
  bool is_u4; // true for U4 weights, false for U8
154
172
  int64_t weights_per_block; // weights per scale/zp block
155
- bool is_symmetric; // true for symmetric quantization
173
+ bool is_symmetric; // true for symmetric quantization
156
174
 
157
175
  // Requantization info
158
- bool is_requant = false; // true if this tensor needs requantization
159
- std::optional<ExtraQuantType> requant_type; // target requant type if is_requant
176
+ bool is_requant = false; // true if this tensor needs requantization
177
+ std::optional<ExtraQuantType> requant_type; // target requant type if is_requant
160
178
  };
161
179
 
162
180
  // Calculate the buffer layout for extracted quantized data
@@ -164,6 +182,9 @@ ggml_openvino_extracted_layout ggml_openvino_get_extracted_layout(const ggml_ten
164
182
 
165
183
  ggml_openvino_tensor_extra * ggml_openvino_create_tensor_extra(const ggml_tensor * tensor, bool is_remote);
166
184
 
185
+ // Check if a tensor's buffer uses remote (device) memory (e.g. GPU USM)
186
+ bool ggml_openvino_buffer_is_remote(const ggml_tensor * tensor);
187
+
167
188
  // Register an extra with the tensor's OpenVINO buffer context for proper lifetime management.
168
189
  // This sets tensor->extra and tracks the extra in the buffer context for cleanup.
169
190
  void ggml_openvino_buffer_register_extra(ggml_tensor * tensor, ggml_openvino_extra_base * extra);