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
@@ -0,0 +1,10 @@
1
+ #ifndef GGML_SYCL_CONV2D_DW_HPP
2
+ #define GGML_SYCL_CONV2D_DW_HPP
3
+
4
+ #include "common.hpp"
5
+
6
+ #define SYCL_CONV2D_DW_BLOCK_SIZE 256
7
+
8
+ void ggml_sycl_op_conv2d_dw(ggml_backend_sycl_context & ctx, ggml_tensor * dst);
9
+
10
+ #endif // GGML_SYCL_CONV2D_DW_HPP
@@ -0,0 +1,125 @@
1
+ #include "conv2d-transpose.hpp"
2
+ #include "convert.hpp"
3
+
4
+ template <typename kernel_t>
5
+ static void conv2d_transpose_kernel(const float * input, const kernel_t * kernel, float * output,
6
+ const int in_w, const int in_h,
7
+ const int out_w, const int out_h,
8
+ const int kernel_w, const int kernel_h,
9
+ const int stride,
10
+ const int c_in, const int c_out, const int batches,
11
+ const sycl::nd_item<3> & item_ct1) {
12
+ const int global_idx = item_ct1.get_local_id(2) +
13
+ item_ct1.get_group(2) * item_ct1.get_local_range(2);
14
+ const int total_elements = out_w * out_h * c_out * batches;
15
+
16
+ if (global_idx >= total_elements) {
17
+ return;
18
+ }
19
+
20
+ const int out_x = global_idx % out_w;
21
+ const int out_y = (global_idx / out_w) % out_h;
22
+ const int c_idx = (global_idx / (out_w * out_h)) % c_out;
23
+ const int n_idx = global_idx / (out_w * out_h * c_out);
24
+
25
+ float acc = 0.0f;
26
+
27
+ for (int c_in_idx = 0; c_in_idx < c_in; ++c_in_idx) {
28
+ for (int kh = 0; kh < kernel_h; ++kh) {
29
+ int in_y = out_y - kh;
30
+ if (in_y < 0 || in_y % stride) {
31
+ continue;
32
+ }
33
+ in_y /= stride;
34
+ if (in_y >= in_h) {
35
+ continue;
36
+ }
37
+
38
+ for (int kw = 0; kw < kernel_w; ++kw) {
39
+ int in_x = out_x - kw;
40
+ if (in_x < 0 || in_x % stride) {
41
+ continue;
42
+ }
43
+ in_x /= stride;
44
+ if (in_x >= in_w) {
45
+ continue;
46
+ }
47
+
48
+ const int input_idx = (in_w * in_h * c_in) * n_idx + (in_w * in_h) * c_in_idx + in_w * in_y + in_x;
49
+ const int kernel_idx = (kernel_h * kernel_w * c_out) * c_in_idx + (kernel_h * kernel_w) * c_idx +
50
+ kernel_w * kh + kw;
51
+
52
+ acc += input[input_idx] * ggml_sycl_cast<float>(kernel[kernel_idx]);
53
+ }
54
+ }
55
+ }
56
+
57
+ output[(out_w * out_h * c_out) * n_idx + (out_w * out_h) * c_idx + out_w * out_y + out_x] = acc;
58
+ }
59
+
60
+ template <typename kernel_t>
61
+ static void conv2d_transpose_sycl(const float * input_d, const kernel_t * kernel_d, float * output_d,
62
+ const int in_w, const int in_h,
63
+ const int out_w, const int out_h,
64
+ const int kernel_w, const int kernel_h,
65
+ const int stride,
66
+ const int c_in, const int c_out, const int batches,
67
+ const queue_ptr & stream) {
68
+ const int total = out_w * out_h * c_out * batches;
69
+ const int num_blocks = (total + SYCL_CONV2D_TRANSPOSE_BLOCK_SIZE - 1) / SYCL_CONV2D_TRANSPOSE_BLOCK_SIZE;
70
+ const sycl::range<3> block_dims(1, 1, SYCL_CONV2D_TRANSPOSE_BLOCK_SIZE);
71
+ const sycl::range<3> block_nums(1, 1, num_blocks);
72
+ stream->parallel_for(sycl::nd_range<3>(block_nums * block_dims, block_dims),
73
+ [=](sycl::nd_item<3> item_ct1) {
74
+ conv2d_transpose_kernel<kernel_t>(input_d, kernel_d, output_d,
75
+ in_w, in_h, out_w, out_h, kernel_w, kernel_h,
76
+ stride, c_in, c_out, batches, item_ct1);
77
+ });
78
+ }
79
+
80
+ // input: (W, H, C_in, N)
81
+ // kernel: (W, H, C_out, C_in)
82
+ // output: (W, H, C_out, N)
83
+ void ggml_sycl_op_conv2d_transpose(ggml_backend_sycl_context & ctx, ggml_tensor * dst) {
84
+ scope_op_debug_print scope_dbg_print(__func__, dst, /*num_src=*/2);
85
+
86
+ const ggml_tensor * kernel = dst->src[0];
87
+ const ggml_tensor * input = dst->src[1];
88
+
89
+ GGML_ASSERT(kernel->type == GGML_TYPE_F16 || kernel->type == GGML_TYPE_F32);
90
+ GGML_ASSERT(input->type == GGML_TYPE_F32 && dst->type == GGML_TYPE_F32);
91
+
92
+ GGML_ASSERT(ggml_is_contiguous(input));
93
+ GGML_ASSERT(ggml_is_contiguous(kernel));
94
+ GGML_ASSERT(ggml_is_contiguous(dst));
95
+
96
+ const float * input_d = (const float *) input->data;
97
+ float * output_d = (float *) dst->data;
98
+ const void * kernel_d = kernel->data;
99
+
100
+ const int input_w = input->ne[0];
101
+ const int input_h = input->ne[1];
102
+ const int channels_in = input->ne[2];
103
+ const int batches = input->ne[3];
104
+ const int output_w = dst->ne[0];
105
+ const int output_h = dst->ne[1];
106
+ const int channels_out = kernel->ne[2];
107
+ const int kernel_w = kernel->ne[0];
108
+ const int kernel_h = kernel->ne[1];
109
+ const int stride = dst->op_params[0];
110
+
111
+ GGML_ASSERT(channels_in == kernel->ne[3]);
112
+ GGML_ASSERT(stride > 0);
113
+
114
+ const queue_ptr stream = ctx.stream();
115
+
116
+ if (kernel->type == GGML_TYPE_F16) {
117
+ conv2d_transpose_sycl<sycl::half>(input_d, (const sycl::half *) kernel_d, output_d,
118
+ input_w, input_h, output_w, output_h, kernel_w, kernel_h,
119
+ stride, channels_in, channels_out, batches, stream);
120
+ } else {
121
+ conv2d_transpose_sycl<float>(input_d, (const float *) kernel_d, output_d,
122
+ input_w, input_h, output_w, output_h, kernel_w, kernel_h,
123
+ stride, channels_in, channels_out, batches, stream);
124
+ }
125
+ }
@@ -0,0 +1,10 @@
1
+ #ifndef GGML_SYCL_CONV2D_TRANSPOSE_HPP
2
+ #define GGML_SYCL_CONV2D_TRANSPOSE_HPP
3
+
4
+ #include "common.hpp"
5
+
6
+ #define SYCL_CONV2D_TRANSPOSE_BLOCK_SIZE 256
7
+
8
+ void ggml_sycl_op_conv2d_transpose(ggml_backend_sycl_context & ctx, ggml_tensor * dst);
9
+
10
+ #endif // GGML_SYCL_CONV2D_TRANSPOSE_HPP
@@ -0,0 +1,150 @@
1
+ #include "conv2d.hpp"
2
+ #include "convert.hpp"
3
+
4
+ struct conv2d_params {
5
+ const int64_t IW, IH;
6
+ const int64_t OW, OH;
7
+ const int64_t KW, KH;
8
+ const int64_t ST_X, ST_Y;
9
+ const int64_t PD_X, PD_Y;
10
+ const int64_t DL_X, DL_Y;
11
+ const int64_t IC, OC;
12
+ const int64_t B;
13
+ const int64_t TOTAL;
14
+ };
15
+
16
+ struct conv2d_kernel_bounds {
17
+ int64_t y_min, y_max;
18
+ int64_t x_min, x_max;
19
+ };
20
+
21
+ static inline int64_t conv2d_max64(int64_t a, int64_t b) {
22
+ return (a > b) ? a : b;
23
+ }
24
+
25
+ static inline int64_t conv2d_min64(int64_t a, int64_t b) {
26
+ return (a < b) ? a : b;
27
+ }
28
+
29
+ static inline conv2d_kernel_bounds calculate_kernel_bounds(int64_t out_x, int64_t out_y, const conv2d_params & P) {
30
+ conv2d_kernel_bounds bounds;
31
+ bounds.y_min = conv2d_max64(0, (P.PD_Y - out_y * P.ST_Y + P.DL_Y - 1) / P.DL_Y);
32
+ bounds.y_max = conv2d_min64(P.KH, (P.IH + P.PD_Y - out_y * P.ST_Y + P.DL_Y - 1) / P.DL_Y);
33
+ bounds.x_min = conv2d_max64(0, (P.PD_X - out_x * P.ST_X + P.DL_X - 1) / P.DL_X);
34
+ bounds.x_max = conv2d_min64(P.KW, (P.IW + P.PD_X - out_x * P.ST_X + P.DL_X - 1) / P.DL_X);
35
+ return bounds;
36
+ }
37
+
38
+ static inline int calculate_input_coord(int64_t out_coord, int64_t kern_coord, int64_t stride,
39
+ int64_t dilation, int64_t padding) {
40
+ return out_coord * stride + kern_coord * dilation - padding;
41
+ }
42
+
43
+ // whcn layout helpers (matching ggml tensor memory order)
44
+ static inline int64_t whcn_input_index(int64_t n, int64_t c, int64_t y, int64_t x, const conv2d_params & P) {
45
+ return n * (P.IC * P.IW * P.IH) + c * P.IW * P.IH + y * P.IW + x;
46
+ }
47
+
48
+ static inline int64_t whcn_kernel_index(int64_t c_out, int64_t c_in, int64_t ky, int64_t kx, const conv2d_params & P) {
49
+ return c_out * (P.IC * P.KH * P.KW) + c_in * (P.KH * P.KW) + ky * P.KW + kx;
50
+ }
51
+
52
+ static inline int64_t whcn_output_index(int64_t n, int64_t c, int64_t y, int64_t x, const conv2d_params & P) {
53
+ return n * (P.OC * P.OW * P.OH) + c * P.OW * P.OH + y * P.OW + x;
54
+ }
55
+
56
+ template <typename T>
57
+ static void conv2d_kernel(const float * input, const T * kernel, float * output,
58
+ const conv2d_params P, const sycl::nd_item<3> & item_ct1) {
59
+ const int64_t global_idx = item_ct1.get_local_id(2) +
60
+ item_ct1.get_group(2) * item_ct1.get_local_range(2);
61
+
62
+ if (global_idx >= P.TOTAL) {
63
+ return;
64
+ }
65
+
66
+ const int64_t out_x = global_idx % P.OW;
67
+ const int64_t out_y = (global_idx / P.OW) % P.OH;
68
+ const int64_t c_out = (global_idx / (P.OW * P.OH)) % P.OC;
69
+ const int64_t n = global_idx / (P.OW * P.OH * P.OC);
70
+
71
+ float acc = 0.0f;
72
+
73
+ const conv2d_kernel_bounds bounds = calculate_kernel_bounds(out_x, out_y, P);
74
+
75
+ for (int64_t c_in = 0; c_in < P.IC; ++c_in) {
76
+ for (int64_t ky = bounds.y_min; ky < bounds.y_max; ++ky) {
77
+ const int64_t in_y = calculate_input_coord(out_y, ky, P.ST_Y, P.DL_Y, P.PD_Y);
78
+ for (int64_t kx = bounds.x_min; kx < bounds.x_max; ++kx) {
79
+ const int64_t in_x = calculate_input_coord(out_x, kx, P.ST_X, P.DL_X, P.PD_X);
80
+ const float input_val = input[whcn_input_index(n, c_in, in_y, in_x, P)];
81
+ const T kernel_val = kernel[whcn_kernel_index(c_out, c_in, ky, kx, P)];
82
+ acc += input_val * ggml_sycl_cast<float>(kernel_val);
83
+ }
84
+ }
85
+ }
86
+
87
+ output[whcn_output_index(n, c_out, out_y, out_x, P)] = acc;
88
+ }
89
+
90
+ template <typename T>
91
+ static void conv2d_sycl(const float * X_D, const T * K_D, float * Y_D,
92
+ const conv2d_params P, const queue_ptr & stream) {
93
+ const int num_blocks = (P.TOTAL + SYCL_CONV2D_BLOCK_SIZE - 1) / SYCL_CONV2D_BLOCK_SIZE;
94
+ const sycl::range<3> block_dims(1, 1, SYCL_CONV2D_BLOCK_SIZE);
95
+ const sycl::range<3> block_nums(1, 1, num_blocks);
96
+ stream->parallel_for(sycl::nd_range<3>(block_nums * block_dims, block_dims),
97
+ [=](sycl::nd_item<3> item_ct1) {
98
+ conv2d_kernel<T>(X_D, K_D, Y_D, P, item_ct1);
99
+ });
100
+ }
101
+
102
+ void ggml_sycl_op_conv2d(ggml_backend_sycl_context & ctx, ggml_tensor * dst) {
103
+ scope_op_debug_print scope_dbg_print(__func__, dst, /*num_src=*/2);
104
+
105
+ const ggml_tensor * kernel = dst->src[0];
106
+ const ggml_tensor * input = dst->src[1];
107
+ const float * K_D = (const float *) kernel->data;
108
+ const float * X_D = (const float *) input->data;
109
+ float * Y_D = (float *) dst->data;
110
+
111
+ GGML_ASSERT(ggml_is_contiguous(kernel));
112
+ GGML_ASSERT(kernel->type == GGML_TYPE_F16 || kernel->type == GGML_TYPE_F32);
113
+ GGML_ASSERT(input->type == GGML_TYPE_F32);
114
+ GGML_ASSERT(dst->type == GGML_TYPE_F32);
115
+
116
+ // same number of input channels
117
+ GGML_ASSERT(input->ne[2] == kernel->ne[2]);
118
+
119
+ const queue_ptr stream = ctx.stream();
120
+
121
+ const int32_t * p = (const int32_t *) dst->op_params;
122
+ const int ST_X = p[0];
123
+ const int ST_Y = p[1];
124
+ const int PD_X = p[2];
125
+ const int PD_Y = p[3];
126
+ const int DL_X = p[4];
127
+ const int DL_Y = p[5];
128
+
129
+ // no cwhn layout support
130
+ GGML_ASSERT(p[6] == 0);
131
+
132
+ const int IW = input->ne[0];
133
+ const int IH = input->ne[1];
134
+ const int OW = dst->ne[0];
135
+ const int OH = dst->ne[1];
136
+ const int KW = kernel->ne[0];
137
+ const int KH = kernel->ne[1];
138
+ const int IC = input->ne[2];
139
+ const int OC = kernel->ne[3];
140
+ const int B = input->ne[3];
141
+
142
+ const int64_t total = (int64_t) B * OC * OH * OW;
143
+ const conv2d_params params = { IW, IH, OW, OH, KW, KH, ST_X, ST_Y, PD_X, PD_Y, DL_X, DL_Y, IC, OC, B, total };
144
+
145
+ if (kernel->type == GGML_TYPE_F16) {
146
+ conv2d_sycl<sycl::half>(X_D, (const sycl::half *) K_D, Y_D, params, stream);
147
+ } else {
148
+ conv2d_sycl<float>(X_D, K_D, Y_D, params, stream);
149
+ }
150
+ }
@@ -0,0 +1,10 @@
1
+ #ifndef GGML_SYCL_CONV2D_HPP
2
+ #define GGML_SYCL_CONV2D_HPP
3
+
4
+ #include "common.hpp"
5
+
6
+ #define SYCL_CONV2D_BLOCK_SIZE 256
7
+
8
+ void ggml_sycl_op_conv2d(ggml_backend_sycl_context & ctx, ggml_tensor * dst);
9
+
10
+ #endif // GGML_SYCL_CONV2D_HPP
@@ -0,0 +1,224 @@
1
+ #include "conv3d.hpp"
2
+
3
+ static inline int64_t ggml_sycl_conv3d_calc_patch_total(const ggml_tensor * dst, int32_t n) {
4
+ return (int64_t) n * dst->ne[0] * dst->ne[1] * dst->ne[2];
5
+ }
6
+
7
+ static inline int64_t ggml_sycl_conv3d_calc_knl_n_total(const ggml_tensor * src0, int32_t c) {
8
+ return (int64_t) src0->ne[0] * src0->ne[1] * src0->ne[2] * c;
9
+ }
10
+
11
+ static inline void ggml_sycl_conv3d_write_output(
12
+ const ggml_tensor * dst,
13
+ const float * src, float * dst_data,
14
+ int64_t patch_total, int64_t oc,
15
+ int64_t dst_w, int64_t dst_h, int64_t dst_d,
16
+ dpct::queue_ptr stream) {
17
+ const int64_t dst_nb0 = dst->nb[0];
18
+ const int64_t dst_nb1 = dst->nb[1];
19
+ const int64_t dst_nb2 = dst->nb[2];
20
+ const int64_t dst_nb3 = dst->nb[3];
21
+ const int64_t total = patch_total * oc;
22
+ const int64_t block_size = 256;
23
+ const int64_t num_work_items = ((total + block_size - 1) / block_size) * block_size;
24
+
25
+ stream->parallel_for(sycl::range<1>(num_work_items), [=](sycl::id<1> id) {
26
+ const int64_t i = id[0];
27
+ if (i >= total) {
28
+ return;
29
+ }
30
+
31
+ const int64_t patch_idx = i / oc;
32
+ const int64_t out_ch = i % oc;
33
+ const int64_t p_in_batch = patch_idx % (dst_w * dst_h * dst_d);
34
+ const int64_t batch_idx = patch_idx / (dst_w * dst_h * dst_d);
35
+ const int64_t dst_z = p_in_batch / (dst_w * dst_h);
36
+ const int64_t dst_y = (p_in_batch % (dst_w * dst_h)) / dst_w;
37
+ const int64_t dst_x = p_in_batch % dst_w;
38
+ const int64_t ocn_idx = batch_idx * oc + out_ch;
39
+
40
+ const int64_t dst_offset = dst_x * dst_nb0 + dst_y * dst_nb1 + dst_z * dst_nb2 + ocn_idx * dst_nb3;
41
+ // `src` is a column-major (m x n) GEMM output where m == patch_total, n == oc.
42
+ // GEMM stores element (row, col) at index `row + col*m`, so compute index accordingly.
43
+ const int64_t src_index = patch_idx + out_ch * patch_total;
44
+ const float value = src[src_index];
45
+ *(float *)((char *)dst_data + dst_offset) = value;
46
+ });
47
+ }
48
+
49
+ void ggml_sycl_op_conv_3d(ggml_backend_sycl_context & ctx, ggml_tensor * dst) {
50
+ scope_op_debug_print scope_dbg_print(__func__, dst, /*num_src=*/2);
51
+
52
+ const ggml_tensor * src0 = dst->src[0];
53
+ const ggml_tensor * src1 = dst->src[1];
54
+
55
+ GGML_ASSERT(src0->type == GGML_TYPE_F16 || src0->type == GGML_TYPE_F32);
56
+ GGML_ASSERT(src1->type == GGML_TYPE_F32);
57
+ GGML_ASSERT(dst->type == GGML_TYPE_F32);
58
+ GGML_ASSERT(ggml_is_contiguous(src0));
59
+ GGML_ASSERT(ggml_is_contiguous(src1));
60
+
61
+ const int32_t * opts = (const int32_t *) dst->op_params;
62
+ const int32_t s0 = opts[0];
63
+ const int32_t s1 = opts[1];
64
+ const int32_t s2 = opts[2];
65
+ const int32_t p0 = opts[3];
66
+ const int32_t p1 = opts[4];
67
+ const int32_t p2 = opts[5];
68
+ const int32_t d0 = opts[6];
69
+ const int32_t d1 = opts[7];
70
+ const int32_t d2 = opts[8];
71
+ const int32_t c = opts[9];
72
+ const int32_t n = opts[10];
73
+ const int32_t oc = opts[11];
74
+
75
+ const int64_t knl_w = src0->ne[0];
76
+ const int64_t knl_h = src0->ne[1];
77
+ const int64_t knl_d = src0->ne[2];
78
+
79
+ const int64_t patch_total = ggml_sycl_conv3d_calc_patch_total(dst, n);
80
+ const int64_t knl_n_total = ggml_sycl_conv3d_calc_knl_n_total(src0, c);
81
+
82
+ const size_t kernel_type_size = ggml_element_size(src0);
83
+
84
+ ggml_sycl_pool_alloc<float> gemm_output(ctx.pool());
85
+ gemm_output.alloc((size_t) patch_total * oc);
86
+
87
+ ggml_tensor dst_mat = {};
88
+ dst_mat.type = GGML_TYPE_F32;
89
+ dst_mat.ne[0] = patch_total;
90
+ dst_mat.ne[1] = oc;
91
+ dst_mat.ne[2] = 1;
92
+ dst_mat.ne[3] = 1;
93
+ dst_mat.nb[0] = sizeof(float);
94
+ dst_mat.nb[1] = dst_mat.nb[0] * dst_mat.ne[0];
95
+ dst_mat.nb[2] = dst_mat.nb[1];
96
+ dst_mat.nb[3] = dst_mat.nb[2];
97
+ dst_mat.data = gemm_output.get();
98
+ dst_mat.buffer = dst->buffer;
99
+ dst_mat.extra = dst->extra;
100
+
101
+ dpct::queue_ptr stream = ctx.stream();
102
+
103
+ // allocate packed arrays: A_packed (k x m), B_packed (k x n)
104
+ ggml_sycl_pool_alloc<float> A_packed_alloc(ctx.pool());
105
+ ggml_sycl_pool_alloc<float> B_packed_alloc(ctx.pool());
106
+ A_packed_alloc.alloc((size_t) knl_n_total * patch_total);
107
+ B_packed_alloc.alloc((size_t) knl_n_total * oc);
108
+
109
+ float * A_packed = A_packed_alloc.get();
110
+ float * B_packed = B_packed_alloc.get();
111
+
112
+ const int m = (int) patch_total;
113
+ const int n_gemm = (int) oc;
114
+ const int k = (int) knl_n_total;
115
+
116
+ // Combined kernel: im2col -> pack A, and pack B simultaneously
117
+ const char * src1_base = (const char *) src1->data;
118
+ const char * src0_base = (const char *) src0->data;
119
+ const int64_t src1_nb0 = src1->nb[0];
120
+ const int64_t src1_nb1 = src1->nb[1];
121
+ const int64_t src1_nb2 = src1->nb[2];
122
+ const int64_t src1_nb3 = src1->nb[3];
123
+ const int64_t src1_w = src1->ne[0];
124
+ const int64_t src1_h = src1->ne[1];
125
+ const int64_t src1_d = src1->ne[2];
126
+
127
+ const bool src0_is_f32 = (src0->type == GGML_TYPE_F32);
128
+
129
+ // Compute correct strides for src0 as (knl_n_total, oc) matrix
130
+ const int64_t src0_packed_nb0 = kernel_type_size;
131
+ const int64_t src0_packed_nb1 = kernel_type_size * knl_n_total;
132
+
133
+ const int64_t KW = knl_w;
134
+ const int64_t KH = knl_h;
135
+ const int64_t KD = knl_d;
136
+ const int64_t PW = dst->ne[0];
137
+ const int64_t PH = dst->ne[1];
138
+ const int64_t PD = dst->ne[2];
139
+
140
+ // Pack A (with inline im2col): for each (row, col) in k x m matrix
141
+ const int64_t A_total = (int64_t)k * m;
142
+ const int64_t A_block_size = 256;
143
+ const int64_t A_num_work = ((A_total + A_block_size - 1) / A_block_size) * A_block_size;
144
+
145
+ stream->parallel_for(sycl::range<1>(A_num_work), [=](sycl::id<1> id) {
146
+ const int64_t t = id[0];
147
+ if (t >= A_total) return;
148
+
149
+ const int64_t row = t % k;
150
+ const int64_t col = t / k;
151
+
152
+ // Inline im2col for this element
153
+ const int64_t k_index = row;
154
+ const int64_t patch_idx = col;
155
+
156
+ const int64_t ic = k_index / (KD * KH * KW);
157
+ const int64_t rem = k_index - ic * (KD * KH * KW);
158
+ const int64_t kz = rem / (KH * KW);
159
+ const int64_t rem2 = rem - kz * (KH * KW);
160
+ const int64_t ky = rem2 / KW;
161
+ const int64_t kx = rem2 % KW;
162
+
163
+ const int64_t p_in_batch = patch_idx % (PW * PH * PD);
164
+ const int64_t batch_idx = patch_idx / (PW * PH * PD);
165
+ const int64_t dst_z = p_in_batch / (PW * PH);
166
+ const int64_t dst_y = (p_in_batch % (PW * PH)) / PW;
167
+ const int64_t dst_x = p_in_batch % PW;
168
+
169
+ const int64_t sx = dst_x * s0 + kx * d0 - p0;
170
+ const int64_t sy = dst_y * s1 + ky * d1 - p1;
171
+ const int64_t sz = dst_z * s2 + kz * d2 - p2;
172
+
173
+ float val = 0.0f;
174
+ if (sx >= 0 && sx < src1_w && sy >= 0 && sy < src1_h && sz >= 0 && sz < src1_d) {
175
+ const int64_t channel_idx = batch_idx * c + ic;
176
+ const char * ptr = src1_base + sx * src1_nb0 + sy * src1_nb1 + sz * src1_nb2 + channel_idx * src1_nb3;
177
+ val = *(const float *) ptr;
178
+ }
179
+ A_packed[row + col * (int64_t)k] = val;
180
+ });
181
+
182
+ // Pack B: for each (row, col) in k x n_gemm matrix
183
+ const int64_t B_total = (int64_t)k * n_gemm;
184
+ const int64_t B_block_size = 256;
185
+ const int64_t B_num_work = ((B_total + B_block_size - 1) / B_block_size) * B_block_size;
186
+
187
+ stream->parallel_for(sycl::range<1>(B_num_work), [=](sycl::id<1> id) {
188
+ const int64_t t = id[0];
189
+ if (t >= B_total) return;
190
+
191
+ const int64_t row = t % k;
192
+ const int64_t col = t / k;
193
+ const char * src_ptr = src0_base + row * src0_packed_nb0 + col * src0_packed_nb1;
194
+ float v;
195
+ if (src0_is_f32) {
196
+ v = *(const float *) src_ptr;
197
+ } else {
198
+ v = sycl::vec<sycl::half, 1>(*(const sycl::half *) src_ptr).convert<float, sycl::rounding_mode::automatic>()[0];
199
+ }
200
+ B_packed[row + col * (int64_t)k] = v;
201
+ });
202
+
203
+ // GEMM: C = A^T * B where A is (k x m), B is (k x n), C is (m x n)
204
+ const float alpha = 1.0f;
205
+ const float beta = 0.0f;
206
+ const int lda = k;
207
+ const int ldb = k;
208
+ const int ldc = m;
209
+
210
+ SYCL_CHECK(CHECK_TRY_ERROR(oneapi::mkl::blas::column_major::gemm(
211
+ *stream, oneapi::mkl::transpose::trans, oneapi::mkl::transpose::nontrans,
212
+ m, n_gemm, k,
213
+ dpct::get_value(&alpha, *stream),
214
+ (const float *) A_packed, lda,
215
+ (const float *) B_packed, ldb,
216
+ dpct::get_value(&beta, *stream),
217
+ (float *) dst_mat.data, ldc)));
218
+
219
+ const float * gemm_data = (const float *) dst_mat.data;
220
+ float * dst_data = (float *) dst->data;
221
+
222
+ ggml_sycl_conv3d_write_output(dst, gemm_data, dst_data, patch_total, oc,
223
+ dst->ne[0], dst->ne[1], dst->ne[2], stream);
224
+ }
@@ -0,0 +1,8 @@
1
+ #ifndef GGML_SYCL_CONV3D_HPP
2
+ #define GGML_SYCL_CONV3D_HPP
3
+
4
+ #include "common.hpp"
5
+
6
+ void ggml_sycl_op_conv_3d(ggml_backend_sycl_context & ctx, ggml_tensor * dst);
7
+
8
+ #endif // GGML_SYCL_CONV3D_HPP
@@ -642,6 +642,8 @@ static void convert_unary_sycl(const void * vx, dst_t * y, const int64_t k, dpct
642
642
 
643
643
  to_fp16_sycl_t ggml_get_to_fp16_sycl(ggml_type type, ggml_tensor * dst) {
644
644
  switch (type) {
645
+ case GGML_TYPE_Q1_0:
646
+ return dequantize_block_sycl<QK1_0, QR1_0, dequantize_q1_0>;
645
647
  case GGML_TYPE_Q4_0:
646
648
  if (dst->src[0]->extra &&
647
649
  ((ggml_tensor_extra_gpu*)dst->src[0]->extra)->optimized_feature.reorder) {
@@ -724,6 +726,8 @@ to_fp16_sycl_t ggml_get_to_fp16_sycl(ggml_type type, ggml_tensor * dst) {
724
726
 
725
727
  to_fp32_sycl_t ggml_get_to_fp32_sycl(ggml_type type, ggml_tensor *dst) {
726
728
  switch (type) {
729
+ case GGML_TYPE_Q1_0:
730
+ return dequantize_block_sycl<QK1_0, QR1_0, dequantize_q1_0>;
727
731
  case GGML_TYPE_Q4_0:
728
732
  if (dst->src[0]->extra &&
729
733
  ((ggml_tensor_extra_gpu*)dst->src[0]->extra)->optimized_feature.reorder) {
@@ -830,6 +834,8 @@ to_fp16_nc_sycl_t ggml_get_to_fp16_nc_sycl(ggml_type type) {
830
834
  case GGML_TYPE_BF16:
831
835
  return convert_unary_nc_sycl<sycl::ext::oneapi::bfloat16>;
832
836
  #endif
837
+ case GGML_TYPE_Q1_0:
838
+ return dequantize_block_nc_sycl<QK1_0, QR1_0, dequantize_q1_0>;
833
839
  case GGML_TYPE_Q4_0:
834
840
  return dequantize_block_nc_sycl<QK4_0, QR4_0, dequantize_q4_0>;
835
841
  case GGML_TYPE_Q4_1: