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
@@ -34,26 +34,26 @@ template <float (*bin_op)(const float, const float),
34
34
  static __global__ void k_bin_bcast(const src0_t * src0,
35
35
  const src1_t * src1,
36
36
  dst_t * dst,
37
- const int ne0,
38
- const int ne1,
39
- const int ne2,
37
+ const uint32_t ne0,
38
+ const uint32_t ne1,
39
+ const uint32_t ne2,
40
40
  const uint3 ne3,
41
41
  const uint3 ne10,
42
42
  const uint3 ne11,
43
43
  const uint3 ne12,
44
44
  const uint3 ne13,
45
- /*const int s0,*/
46
- const int s1,
47
- const int s2,
48
- const int s3,
49
- const int s00,
50
- const int s01,
51
- const int s02,
52
- const int s03,
53
- const int s10,
54
- const int s11,
55
- const int s12,
56
- const int s13,
45
+ /*const uint32_t s0,*/
46
+ const uint32_t s1,
47
+ const uint32_t s2,
48
+ const uint32_t s3,
49
+ const uint32_t s00,
50
+ const uint32_t s01,
51
+ const uint32_t s02,
52
+ const uint32_t s03,
53
+ const uint32_t s10,
54
+ const uint32_t s11,
55
+ const uint32_t s12,
56
+ const uint32_t s13,
57
57
  src1_ptrs... src1s) {
58
58
  ggml_cuda_pdl_lc();
59
59
  const uint32_t i0s = blockDim.x * blockIdx.x + threadIdx.x;
@@ -61,7 +61,7 @@ static __global__ void k_bin_bcast(const src0_t * src0,
61
61
  const uint32_t i2 = fastdiv((blockDim.z * blockIdx.z + threadIdx.z), ne3);
62
62
  const uint32_t i3 = (blockDim.z * blockIdx.z + threadIdx.z) - (i2 * ne3.z);
63
63
 
64
- if (i0s >= (uint32_t)ne0 || i1 >= (uint32_t)ne1 || i2 >= (uint32_t)ne2 || i3 >= ne3.z) {
64
+ if (i0s >= ne0 || i1 >= ne1 || i2 >= ne2 || i3 >= ne3.z) {
65
65
  return;
66
66
  }
67
67
 
@@ -69,25 +69,32 @@ static __global__ void k_bin_bcast(const src0_t * src0,
69
69
  const uint32_t i12 = fastmodulo(i2, ne12);
70
70
  const uint32_t i13 = fastmodulo(i3, ne13);
71
71
 
72
- const size_t i_src0 = i3*s03 + i2*s02 + i1*s01;
73
- const size_t i_src1 = i13*s13 + i12*s12 + i11*s11;
74
- const size_t i_dst = i3*s3 + i2*s2 + i1*s1;
72
+ const size_t i_src0 = size_t( i3)*s03 + size_t( i2)*s02 + size_t( i1)*s01;
73
+ const size_t i_src1 = size_t(i13)*s13 + size_t(i12)*s12 + size_t(i11)*s11;
74
+ const size_t i_dst = size_t( i3)*s3 + size_t( i2)*s2 + size_t( i1)*s1;
75
75
 
76
76
  const src0_t * src0_row = src0 ? (src0 + i_src0) : nullptr;
77
77
  dst_t * dst_row = dst + i_dst;
78
78
 
79
+ const uint32_t s0 = blockDim.x * gridDim.x;
80
+
79
81
  ggml_cuda_pdl_sync();
80
- for (int i0 = i0s; i0 < ne0; i0 += blockDim.x * gridDim.x) {
82
+ for (uint32_t i0 = i0s; i0 < ne0; i0 += s0) {
81
83
  const uint32_t i10 = fastmodulo(i0, ne10);
82
84
 
83
- float result = src0_row ? (float) src0_row[i0*s00] : 0.0f;
85
+ float result = src0_row ? (float) src0_row[size_t(i0)*s00] : 0.0f;
84
86
  if constexpr (sizeof...(src1_ptrs) > 0) {
85
- result = (..., (result = bin_op(result, (float)src1s[i_src1 + i10*s10])));
87
+ result = (..., (result = bin_op(result, (float)src1s[i_src1 + size_t(i10)*s10])));
86
88
  } else {
87
- result = bin_op(result, (float)src1[i_src1 + i10*s10]);
89
+ result = bin_op(result, (float)src1[i_src1 + size_t(i10)*s10]);
88
90
  }
89
91
 
90
92
  dst_row[i0] = (dst_t) result;
93
+
94
+ // protect i0 from overflow
95
+ if (ne0 - i0 <= s0) {
96
+ break;
97
+ }
91
98
  }
92
99
  }
93
100
 
@@ -110,19 +117,19 @@ static __global__ void k_bin_bcast_unravel(const src0_t * src0,
110
117
  const uint3 ne12,
111
118
  const uint3 ne13,
112
119
  /*const int s0,*/
113
- const int s1,
114
- const int s2,
115
- const int s3,
116
- const int s00,
117
- const int s01,
118
- const int s02,
119
- const int s03,
120
- const int s10,
121
- const int s11,
122
- const int s12,
123
- const int s13,
120
+ const uint32_t s1,
121
+ const uint32_t s2,
122
+ const uint32_t s3,
123
+ const uint32_t s00,
124
+ const uint32_t s01,
125
+ const uint32_t s02,
126
+ const uint32_t s03,
127
+ const uint32_t s10,
128
+ const uint32_t s11,
129
+ const uint32_t s12,
130
+ const uint32_t s13,
124
131
  src1_ptrs... src1s) {
125
- const int i = blockDim.x*blockIdx.x + threadIdx.x;
132
+ const uint32_t i = blockDim.x*blockIdx.x + threadIdx.x;
126
133
 
127
134
  const uint32_t i3 = fastdiv(i, prod_012);
128
135
  const uint32_t i2 = fastdiv(i - i3 * prod_012.z, prod_01);
@@ -133,25 +140,25 @@ static __global__ void k_bin_bcast_unravel(const src0_t * src0,
133
140
  return;
134
141
  }
135
142
 
136
- const int i11 = fastmodulo(i1, ne11);
137
- const int i12 = fastmodulo(i2, ne12);
138
- const int i13 = fastmodulo(i3, ne13);
143
+ const uint32_t i11 = fastmodulo(i1, ne11);
144
+ const uint32_t i12 = fastmodulo(i2, ne12);
145
+ const uint32_t i13 = fastmodulo(i3, ne13);
139
146
 
140
- const size_t i_src0 = i3*s03 + i2*s02 + i1*s01;
141
- const size_t i_src1 = i13*s13 + i12*s12 + i11*s11;
142
- const size_t i_dst = i3*s3 + i2*s2 + i1*s1;
147
+ const size_t i_src0 = size_t( i3)*s03 + size_t( i2)*s02 + size_t( i1)*s01;
148
+ const size_t i_src1 = size_t(i13)*s13 + size_t(i12)*s12 + size_t(i11)*s11;
149
+ const size_t i_dst = size_t( i3)*s3 + size_t( i2)*s2 + size_t( i1)*s1;
143
150
 
144
151
  const src0_t * src0_row = src0 ? (src0 + i_src0) : nullptr;
145
152
  dst_t * dst_row = dst + i_dst;
146
153
 
147
- const int i10 = fastmodulo(i0, ne10);
154
+ const uint32_t i10 = fastmodulo(i0, ne10);
148
155
 
149
156
  ggml_cuda_pdl_sync();
150
- float result = src0_row ? (float) src0_row[i0*s00] : 0.0f;
157
+ float result = src0_row ? (float) src0_row[size_t(i0)*s00] : 0.0f;
151
158
  if constexpr (sizeof...(src1_ptrs) > 0) {
152
- result = (..., (result = bin_op(result, (float)src1s[i_src1 + i10*s10])));
159
+ result = (..., (result = bin_op(result, (float)src1s[i_src1 + size_t(i10)*s10])));
153
160
  } else {
154
- result = bin_op(result, (float)src1[i_src1 + i10*s10]);
161
+ result = bin_op(result, (float)src1[i_src1 + size_t(i10)*s10]);
155
162
  }
156
163
 
157
164
  dst_row[i0] = (dst_t) result;
@@ -248,6 +255,31 @@ static void launch_bin_bcast_pack(const ggml_tensor * src0, const ggml_tensor *
248
255
  size_t s02 = nb02 / sizeof(src0_t);
249
256
  size_t s03 = nb03 / sizeof(src0_t);
250
257
 
258
+ GGML_ASSERT(ne0 <= std::numeric_limits<uint32_t>::max());
259
+ GGML_ASSERT(ne1 <= std::numeric_limits<uint32_t>::max());
260
+ GGML_ASSERT(ne2 <= std::numeric_limits<uint32_t>::max());
261
+ GGML_ASSERT(ne3 <= std::numeric_limits<uint32_t>::max());
262
+
263
+ //GGML_ASSERT(s0 <= std::numeric_limits<uint32_t>::max());
264
+ GGML_ASSERT(s1 <= std::numeric_limits<uint32_t>::max());
265
+ GGML_ASSERT(s2 <= std::numeric_limits<uint32_t>::max());
266
+ GGML_ASSERT(s3 <= std::numeric_limits<uint32_t>::max());
267
+
268
+ GGML_ASSERT(s00 <= std::numeric_limits<uint32_t>::max());
269
+ GGML_ASSERT(s01 <= std::numeric_limits<uint32_t>::max());
270
+ GGML_ASSERT(s02 <= std::numeric_limits<uint32_t>::max());
271
+ GGML_ASSERT(s03 <= std::numeric_limits<uint32_t>::max());
272
+
273
+ GGML_ASSERT(s10 <= std::numeric_limits<uint32_t>::max());
274
+ GGML_ASSERT(s11 <= std::numeric_limits<uint32_t>::max());
275
+ GGML_ASSERT(s12 <= std::numeric_limits<uint32_t>::max());
276
+ GGML_ASSERT(s13 <= std::numeric_limits<uint32_t>::max());
277
+
278
+ GGML_ASSERT(cne1[0] <= std::numeric_limits<uint32_t>::max());
279
+ GGML_ASSERT(cne1[1] <= std::numeric_limits<uint32_t>::max());
280
+ GGML_ASSERT(cne1[2] <= std::numeric_limits<uint32_t>::max());
281
+ GGML_ASSERT(cne1[3] <= std::numeric_limits<uint32_t>::max());
282
+
251
283
  GGML_ASSERT(nb0 % sizeof(dst_t) == 0);
252
284
  GGML_ASSERT(nb1 % sizeof(dst_t) == 0);
253
285
  GGML_ASSERT(nb2 % sizeof(dst_t) == 0);
@@ -263,6 +295,8 @@ static void launch_bin_bcast_pack(const ggml_tensor * src0, const ggml_tensor *
263
295
  GGML_ASSERT(nb12 % sizeof(src1_t) == 0);
264
296
  GGML_ASSERT(nb13 % sizeof(src1_t) == 0);
265
297
 
298
+ GGML_ASSERT(ne2 * ne3 <= std::numeric_limits<unsigned int>::max());
299
+
266
300
  const int block_size = 128;
267
301
 
268
302
  int64_t hne0 = std::max(ne0 / 2LL, 1LL);
@@ -281,7 +315,13 @@ static void launch_bin_bcast_pack(const ggml_tensor * src0, const ggml_tensor *
281
315
  const uint3 ne13 = init_fastdiv_values((uint32_t) cne1[3]);
282
316
 
283
317
  if (block_nums.z > 65535 || block_nums.y > 65535) {
284
- int block_num = (ne0 * ne1 * ne2 * ne3 + block_size - 1) / block_size;
318
+ int64_t block_num = (ne0 * ne1 * ne2 * ne3 + block_size - 1) / block_size;
319
+
320
+ GGML_ASSERT(block_num <= std::numeric_limits<uint32_t>::max());
321
+ GGML_ASSERT(block_num * block_size <= std::numeric_limits<uint32_t>::max());
322
+ GGML_ASSERT(ne0 * ne1 <= std::numeric_limits<uint32_t>::max());
323
+ GGML_ASSERT(ne0 * ne1 * ne2 <= std::numeric_limits<uint32_t>::max());
324
+
285
325
  const uint3 prod_012 = init_fastdiv_values((uint32_t) (ne0 * ne1 * ne2));
286
326
  const uint3 prod_01 = init_fastdiv_values((uint32_t) (ne0 * ne1));
287
327
  const uint3 ne0_fastdiv = init_fastdiv_values((uint32_t) ne0);
@@ -298,6 +338,10 @@ static void launch_bin_bcast_pack(const ggml_tensor * src0, const ggml_tensor *
298
338
  s10, s11, s12, s13, (const src1_t *) dst->src[I + 1]->data...);
299
339
  }
300
340
  } else {
341
+ GGML_ASSERT(int64_t(block_nums.x) * block_dims.x <= std::numeric_limits<uint32_t>::max());
342
+ GGML_ASSERT(int64_t(block_nums.y) * block_dims.y <= std::numeric_limits<uint32_t>::max());
343
+ GGML_ASSERT(int64_t(block_nums.z) * block_dims.z <= std::numeric_limits<uint32_t>::max());
344
+
301
345
  const uint3 ne3_fastdiv = init_fastdiv_values((uint32_t) ne3);
302
346
  {
303
347
  const ggml_cuda_kernel_launch_params launch_params = ggml_cuda_kernel_launch_params(block_nums, block_dims, 0, stream);
@@ -0,0 +1,81 @@
1
+ #include "col2im-1d.cuh"
2
+ #include "convert.cuh"
3
+
4
+ // col2im_1d: scatter-add GEMM columns to 1D signal (gather approach)
5
+ // columns: [K*OC, T_in] -> output: [T_out, OC]
6
+ // Supports F32, F16, BF16 data with F32 accumulator.
7
+
8
+ template <typename T>
9
+ static __global__ void col2im_1d_kernel(
10
+ const T * __restrict__ col,
11
+ T * __restrict__ dst,
12
+ const int T_in, const uint3 T_out_fd,
13
+ const int OC, const int K, const int K_OC,
14
+ const int s0, const int p0, const int total) {
15
+
16
+ const int idx = threadIdx.x + blockIdx.x * blockDim.x;
17
+ if (idx >= total) return;
18
+
19
+ // dst layout: [T_out, OC], ne[0]=T_out fastest
20
+ const uint2 qr = fast_div_modulo((uint32_t)idx, T_out_fd); // qr.x = idx / T_out, qr.y = idx % T_out
21
+ const int oc = (int)qr.x;
22
+ const int t_out = (int)qr.y;
23
+ const int t_abs = t_out + p0; // absolute position in uncropped signal
24
+
25
+ // Gather: find all (t_in, k) where t_in*s + k == t_abs, 0 <= k < K
26
+ int t_in_min = (t_abs - K + s0) / s0; // ceil((t_abs - K + 1) / s)
27
+ if (t_in_min < 0) t_in_min = 0;
28
+ int t_in_max = t_abs / s0;
29
+ if (t_in_max >= T_in) t_in_max = T_in - 1;
30
+
31
+ float sum = 0.0f;
32
+ for (int t_in = t_in_min; t_in <= t_in_max; t_in++) {
33
+ const int k = t_abs - t_in * s0;
34
+ // col layout: [K*OC, T_in], column index = oc * K + k
35
+ sum += ggml_cuda_cast<float>(col[(oc * K + k) + t_in * K_OC]);
36
+ }
37
+
38
+ dst[idx] = ggml_cuda_cast<T>(sum);
39
+ }
40
+
41
+ void ggml_cuda_op_col2im_1d(ggml_backend_cuda_context & ctx, ggml_tensor * dst) {
42
+ const ggml_tensor * src0 = dst->src[0];
43
+ cudaStream_t stream = ctx.stream();
44
+
45
+ GGML_ASSERT(ggml_is_contiguous(src0));
46
+
47
+ const int32_t s0 = ((const int32_t *)(dst->op_params))[0];
48
+ const int32_t OC = ((const int32_t *)(dst->op_params))[1];
49
+ const int32_t p0 = ((const int32_t *)(dst->op_params))[2];
50
+
51
+ const int K_OC = (int) src0->ne[0];
52
+ const int T_in = (int) src0->ne[1];
53
+ const int K = K_OC / OC;
54
+ const int T_out = (int) dst->ne[0];
55
+
56
+ const uint3 T_out_fd = init_fastdiv_values((uint32_t)T_out);
57
+
58
+ const int total = T_out * OC;
59
+ const int block_size = 256;
60
+ const int num_blocks = (total + block_size - 1) / block_size;
61
+
62
+ switch (src0->type) {
63
+ case GGML_TYPE_F32: {
64
+ col2im_1d_kernel<<<num_blocks, block_size, 0, stream>>>(
65
+ (const float *)src0->data, (float *)dst->data,
66
+ T_in, T_out_fd, OC, K, K_OC, s0, p0, total);
67
+ } break;
68
+ case GGML_TYPE_F16: {
69
+ col2im_1d_kernel<<<num_blocks, block_size, 0, stream>>>(
70
+ (const half *)src0->data, (half *)dst->data,
71
+ T_in, T_out_fd, OC, K, K_OC, s0, p0, total);
72
+ } break;
73
+ case GGML_TYPE_BF16: {
74
+ col2im_1d_kernel<<<num_blocks, block_size, 0, stream>>>(
75
+ (const nv_bfloat16 *)src0->data, (nv_bfloat16 *)dst->data,
76
+ T_in, T_out_fd, OC, K, K_OC, s0, p0, total);
77
+ } break;
78
+ default:
79
+ GGML_ABORT("col2im_1d: unsupported type");
80
+ }
81
+ }
@@ -0,0 +1,3 @@
1
+ #include "common.cuh"
2
+
3
+ void ggml_cuda_op_col2im_1d(ggml_backend_cuda_context & ctx, ggml_tensor * dst);
@@ -1505,12 +1505,16 @@ struct ggml_cuda_mm_fusion_args_host {
1505
1505
  const ggml_tensor * x_bias = nullptr;
1506
1506
  const ggml_tensor * gate = nullptr;
1507
1507
  const ggml_tensor * gate_bias = nullptr;
1508
+ const ggml_tensor * x_scale = nullptr;
1509
+ const ggml_tensor * gate_scale = nullptr;
1508
1510
  ggml_glu_op glu_op;
1509
1511
  };
1510
1512
  struct ggml_cuda_mm_fusion_args_device {
1511
1513
  const void * x_bias = nullptr;
1512
1514
  const void * gate = nullptr;
1513
1515
  const void * gate_bias = nullptr;
1516
+ const void * x_scale = nullptr;
1517
+ const void * gate_scale = nullptr;
1514
1518
  ggml_glu_op glu_op;
1515
1519
  };
1516
1520
 
@@ -152,8 +152,8 @@ static void concat_cuda(const ggml_tensor * src0, const ggml_tensor * src1, ggml
152
152
  src0_d + i3*(src0->nb[3] / sizeof(T)),
153
153
  src1_d + i3*(src1->nb[3] / sizeof(T)),
154
154
  dst_d + i3*( dst->nb[3] / sizeof(T)),
155
- src0->ne[0], src0->ne[1], src0->ne[2],
156
- dst->ne[0], dst->ne[1], dst->ne[2], dim, stream);
155
+ ggml_row_size(src0->type, src0->ne[0])/sizeof(T), src0->ne[1], src0->ne[2],
156
+ ggml_row_size(dst->type, dst->ne[0])/sizeof(T), dst->ne[1], dst->ne[2], dim, stream);
157
157
  }
158
158
  } else {
159
159
  const size_t size0 = ggml_nbytes(src0);
@@ -163,6 +163,8 @@ static void concat_cuda(const ggml_tensor * src0, const ggml_tensor * src1, ggml
163
163
  CUDA_CHECK(cudaMemcpyAsync((char *) dst->data + size0, src1->data, size1, cudaMemcpyDeviceToDevice, stream));
164
164
  }
165
165
  } else {
166
+ GGML_ASSERT(!ggml_is_quantized(src0->type));
167
+
166
168
  dim3 grid_dim(dst->ne[1], dst->ne[2], dst->ne[3]);
167
169
  auto launch_kernel = [&](auto dim) {
168
170
  concat_non_cont<T, dim><<<grid_dim, CUDA_CONCAT_BLOCK_SIZE, 0, stream>>>(
@@ -204,24 +206,34 @@ void ggml_cuda_op_concat(ggml_backend_cuda_context & ctx, ggml_tensor * dst) {
204
206
 
205
207
  GGML_ASSERT(src0->type == src1->type);
206
208
  GGML_ASSERT(dst->type == src0->type);
207
- GGML_ASSERT(!ggml_is_quantized(src0->type));
208
- GGML_ASSERT(ggml_blck_size(src0->type) == 1);
209
-
210
- switch (ggml_type_size(src0->type)) {
211
- case 1:
212
- concat_cuda<uint8_t>(src0, src1, dst, dim, stream);
213
- break;
214
- case 2:
215
- concat_cuda<uint16_t>(src0, src1, dst, dim, stream);
216
- break;
217
- case 4:
218
- concat_cuda<uint32_t>(src0, src1, dst, dim, stream);
219
- break;
220
- case 8:
221
- concat_cuda<uint64_t>(src0, src1, dst, dim, stream);
222
- break;
223
- default:
224
- GGML_ABORT("Unsupported type size: %zu", ggml_type_size(src0->type));
225
- break;
209
+
210
+ if (ggml_is_quantized(src0->type)) {
211
+ GGML_ASSERT(ggml_is_contiguous(src0));
212
+ GGML_ASSERT(ggml_is_contiguous(src1));
213
+ GGML_ASSERT(src0->ne[0] % ggml_blck_size(src0->type) == 0);
214
+ GGML_ASSERT(src1->ne[0] % ggml_blck_size(src1->type) == 0);
215
+
216
+ // if tensors are contiguous and ne[0] is multiple of the block size we can concat both tensors as byte tensors
217
+ concat_cuda<uint8_t>(src0, src1, dst, dim, stream);
218
+ } else {
219
+ GGML_ASSERT(ggml_blck_size(src0->type) == 1);
220
+
221
+ switch (ggml_type_size(src0->type)) {
222
+ case 1:
223
+ concat_cuda<uint8_t>(src0, src1, dst, dim, stream);
224
+ break;
225
+ case 2:
226
+ concat_cuda<uint16_t>(src0, src1, dst, dim, stream);
227
+ break;
228
+ case 4:
229
+ concat_cuda<uint32_t>(src0, src1, dst, dim, stream);
230
+ break;
231
+ case 8:
232
+ concat_cuda<uint64_t>(src0, src1, dst, dim, stream);
233
+ break;
234
+ default:
235
+ GGML_ABORT("Unsupported type size: %zu", ggml_type_size(src0->type));
236
+ break;
237
+ }
226
238
  }
227
239
  }
@@ -11,30 +11,32 @@ static __global__ void conv_transpose_1d_kernel(
11
11
  return;
12
12
  }
13
13
 
14
- int out_index = global_index / dst_ne0;
14
+ int out_t = global_index % dst_ne0;
15
+ int out_ch = (global_index / dst_ne0) % dst_ne1;
16
+ int plane = global_index / (dst_ne0 * dst_ne1);
15
17
 
16
18
  float accumulator = 0;
17
19
 
18
20
  for (int c = 0; c < src0_ne2; c++) {
19
- int idx = global_index % dst_ne0;
21
+ int kernel_offset = src0_ne0 * (out_ch + src0_ne1 * c);
22
+ int input_offset = src1_ne0 * (c + src1_ne1 * plane);
20
23
 
21
- int kernel_offset = (src0_ne0 * src0_ne1 * c) + (out_index * src0_ne0);
22
- int input_offset = src1_ne0 * c;
23
-
24
- for (int i = 0; i < src1_ne0; i++) {
25
- if (!(idx >= i*s0 && idx < i*s0 + src0_ne0)) {
24
+ for (int k = 0; k < src0_ne0; k++) {
25
+ int input_numer = out_t + p0 - k*d0;
26
+ if (input_numer < 0 || input_numer % s0 != 0) {
26
27
  continue;
27
28
  }
28
- int weight_idx = idx - i*s0;
29
29
 
30
- float kernel_weight = src0[kernel_offset + weight_idx];
31
- float input_value = src1[input_offset+i];
30
+ int input_t = input_numer / s0;
31
+ if (input_t >= src1_ne0) {
32
+ continue;
33
+ }
32
34
 
33
- accumulator += kernel_weight * input_value;
35
+ accumulator += src0[kernel_offset + k] * src1[input_offset + input_t];
34
36
  }
35
37
  }
36
38
  dst[global_index] = accumulator;
37
- GGML_UNUSED_VARS(p0, d0, src0_ne3, src1_ne3, dst_ne3, src1_ne1, dst_ne1, src1_ne2, dst_ne2);
39
+ GGML_UNUSED_VARS(src0_ne3, src1_ne2, src1_ne3, dst_ne2, dst_ne3);
38
40
  }
39
41
 
40
42
  static void conv_transpose_1d_f32_f32_cuda(