whispercpp 1.3.6 → 1.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (965) hide show
  1. checksums.yaml +4 -4
  2. data/.document +3 -0
  3. data/.rdoc_options +2 -0
  4. data/README.md +43 -9
  5. data/Rakefile +18 -3
  6. data/ext/dependencies.rb +10 -4
  7. data/ext/dependencies_for_windows.rb +17 -0
  8. data/ext/extconf.rb +20 -8
  9. data/ext/options.rb +54 -14
  10. data/ext/options_for_windows.rb +51 -0
  11. data/ext/ruby_whisper.c +35 -42
  12. data/ext/ruby_whisper.h +141 -0
  13. data/ext/ruby_whisper_context.c +157 -29
  14. data/ext/ruby_whisper_log_queue.c +180 -0
  15. data/ext/ruby_whisper_log_settable.h +46 -0
  16. data/ext/ruby_whisper_parakeet.c +49 -0
  17. data/ext/ruby_whisper_parakeet_context.c +304 -0
  18. data/ext/ruby_whisper_parakeet_context_params.c +117 -0
  19. data/ext/ruby_whisper_parakeet_model.c +84 -0
  20. data/ext/ruby_whisper_parakeet_params.c +548 -0
  21. data/ext/ruby_whisper_parakeet_segment.c +157 -0
  22. data/ext/ruby_whisper_parakeet_token.c +188 -0
  23. data/ext/ruby_whisper_parakeet_transcribe.cpp +58 -0
  24. data/ext/ruby_whisper_params.c +265 -73
  25. data/ext/ruby_whisper_segment.c +6 -6
  26. data/ext/ruby_whisper_transcribe.cpp +23 -15
  27. data/ext/ruby_whisper_vad_context.c +30 -10
  28. data/ext/ruby_whisper_vad_context_detect.cpp +8 -9
  29. data/ext/ruby_whisper_vad_params.c +4 -4
  30. data/ext/ruby_whisper_vad_segment.c +2 -2
  31. data/ext/sources/CMakeLists.txt +42 -3
  32. data/ext/sources/CMakePresets.json +95 -0
  33. data/ext/sources/cmake/parakeet-config.cmake.in +30 -0
  34. data/ext/sources/cmake/parakeet.pc.in +10 -0
  35. data/ext/sources/cmake/whisper.pc.in +2 -2
  36. data/ext/sources/examples/CMakeLists.txt +4 -2
  37. data/ext/sources/examples/bench/bench.cpp +1 -1
  38. data/ext/sources/examples/cli/cli.cpp +52 -10
  39. data/ext/sources/examples/common-ggml.cpp +4 -0
  40. data/ext/sources/examples/common-whisper.cpp +139 -67
  41. data/ext/sources/examples/common-whisper.h +11 -0
  42. data/ext/sources/examples/ffmpeg-transcode.cpp +211 -341
  43. data/ext/sources/examples/parakeet-cli/CMakeLists.txt +8 -0
  44. data/ext/sources/examples/parakeet-cli/parakeet-cli.cpp +243 -0
  45. data/ext/sources/examples/parakeet-quantize/CMakeLists.txt +7 -0
  46. data/ext/sources/examples/parakeet-quantize/parakeet-quantize.cpp +230 -0
  47. data/ext/sources/examples/server/server.cpp +199 -163
  48. data/ext/sources/examples/vad-speech-segments/speech.cpp +3 -2
  49. data/ext/sources/ggml/CMakeLists.txt +21 -14
  50. data/ext/sources/ggml/cmake/FindNCCL.cmake +36 -0
  51. data/ext/sources/ggml/cmake/ggml-config.cmake.in +12 -2
  52. data/ext/sources/ggml/include/ggml-alloc.h +1 -0
  53. data/ext/sources/ggml/include/ggml-backend.h +72 -10
  54. data/ext/sources/ggml/include/ggml-cuda.h +2 -2
  55. data/ext/sources/ggml/include/ggml-rpc.h +3 -3
  56. data/ext/sources/ggml/include/ggml-sycl.h +8 -0
  57. data/ext/sources/ggml/include/ggml.h +103 -9
  58. data/ext/sources/ggml/include/gguf.h +10 -2
  59. data/ext/sources/ggml/src/CMakeLists.txt +30 -6
  60. data/ext/sources/ggml/src/ggml-alloc.c +5 -1
  61. data/ext/sources/ggml/src/ggml-backend-impl.h +22 -2
  62. data/ext/sources/ggml/src/ggml-backend-meta.cpp +2266 -0
  63. data/ext/sources/ggml/src/ggml-backend-reg.cpp +12 -0
  64. data/ext/sources/ggml/src/ggml-backend.cpp +110 -9
  65. data/ext/sources/ggml/src/ggml-blas/ggml-blas.cpp +4 -0
  66. data/ext/sources/ggml/src/ggml-cann/aclnn_ops.cpp +672 -257
  67. data/ext/sources/ggml/src/ggml-cann/aclnn_ops.h +71 -0
  68. data/ext/sources/ggml/src/ggml-cann/common.h +20 -10
  69. data/ext/sources/ggml/src/ggml-cann/ggml-cann.cpp +211 -30
  70. data/ext/sources/ggml/src/ggml-common.h +24 -2
  71. data/ext/sources/ggml/src/ggml-cpu/CMakeLists.txt +59 -30
  72. data/ext/sources/ggml/src/ggml-cpu/amx/amx.cpp +2 -0
  73. data/ext/sources/ggml/src/ggml-cpu/amx/mmq.cpp +21 -22
  74. data/ext/sources/ggml/src/ggml-cpu/arch/arm/quants.c +194 -11
  75. data/ext/sources/ggml/src/ggml-cpu/arch/arm/repack.cpp +65 -0
  76. data/ext/sources/ggml/src/ggml-cpu/arch/loongarch/quants.c +151 -1
  77. data/ext/sources/ggml/src/ggml-cpu/arch/powerpc/quants.c +0 -1
  78. data/ext/sources/ggml/src/ggml-cpu/arch/riscv/quants.c +4279 -1292
  79. data/ext/sources/ggml/src/ggml-cpu/arch/riscv/repack.cpp +5 -35
  80. data/ext/sources/ggml/src/ggml-cpu/arch/s390/quants.c +0 -1
  81. data/ext/sources/ggml/src/ggml-cpu/arch/wasm/quants.c +72 -1
  82. data/ext/sources/ggml/src/ggml-cpu/arch/x86/quants.c +319 -31
  83. data/ext/sources/ggml/src/ggml-cpu/arch/x86/repack.cpp +1 -1
  84. data/ext/sources/ggml/src/ggml-cpu/arch-fallback.h +12 -2
  85. data/ext/sources/ggml/src/ggml-cpu/cmake/FindSMTIME.cmake +32 -0
  86. data/ext/sources/ggml/src/ggml-cpu/ggml-cpu-impl.h +10 -0
  87. data/ext/sources/ggml/src/ggml-cpu/ggml-cpu.c +109 -5
  88. data/ext/sources/ggml/src/ggml-cpu/ggml-cpu.cpp +2 -0
  89. data/ext/sources/ggml/src/ggml-cpu/kleidiai/kleidiai.cpp +146 -134
  90. data/ext/sources/ggml/src/ggml-cpu/llamafile/sgemm.cpp +107 -82
  91. data/ext/sources/ggml/src/ggml-cpu/ops.cpp +501 -119
  92. data/ext/sources/ggml/src/ggml-cpu/ops.h +3 -0
  93. data/ext/sources/ggml/src/ggml-cpu/quants.c +106 -0
  94. data/ext/sources/ggml/src/ggml-cpu/quants.h +6 -0
  95. data/ext/sources/ggml/src/ggml-cpu/repack.cpp +3 -0
  96. data/ext/sources/ggml/src/ggml-cpu/simd-gemm.h +91 -1
  97. data/ext/sources/ggml/src/ggml-cpu/simd-mappings.h +14 -16
  98. data/ext/sources/ggml/src/ggml-cpu/spacemit/ime.cpp +1402 -687
  99. data/ext/sources/ggml/src/ggml-cpu/spacemit/ime.h +8 -0
  100. data/ext/sources/ggml/src/ggml-cpu/spacemit/ime1_kernels.cpp +597 -2766
  101. data/ext/sources/ggml/src/ggml-cpu/spacemit/ime2_kernels.cpp +5768 -0
  102. data/ext/sources/ggml/src/ggml-cpu/spacemit/ime_env.cpp +320 -0
  103. data/ext/sources/ggml/src/ggml-cpu/spacemit/ime_env.h +55 -0
  104. data/ext/sources/ggml/src/ggml-cpu/spacemit/ime_kernels.h +182 -19
  105. data/ext/sources/ggml/src/ggml-cpu/spacemit/repack.cpp +1795 -0
  106. data/ext/sources/ggml/src/ggml-cpu/spacemit/repack.h +14 -0
  107. data/ext/sources/ggml/src/ggml-cpu/spacemit/rvv_kernels.cpp +3178 -0
  108. data/ext/sources/ggml/src/ggml-cpu/spacemit/rvv_kernels.h +95 -0
  109. data/ext/sources/ggml/src/ggml-cpu/spacemit/spine_barrier.h +34 -0
  110. data/ext/sources/ggml/src/ggml-cpu/spacemit/spine_mem_pool.cpp +760 -0
  111. data/ext/sources/ggml/src/ggml-cpu/spacemit/spine_mem_pool.h +32 -0
  112. data/ext/sources/ggml/src/ggml-cpu/spacemit/spine_tcm.h +409 -0
  113. data/ext/sources/ggml/src/ggml-cpu/vec.cpp +39 -55
  114. data/ext/sources/ggml/src/ggml-cpu/vec.h +225 -240
  115. data/ext/sources/ggml/src/ggml-cuda/CMakeLists.txt +17 -7
  116. data/ext/sources/ggml/src/ggml-cuda/allreduce.cu +971 -0
  117. data/ext/sources/ggml/src/ggml-cuda/allreduce.cuh +29 -0
  118. data/ext/sources/ggml/src/ggml-cuda/argsort.cu +62 -26
  119. data/ext/sources/ggml/src/ggml-cuda/binbcast.cu +134 -64
  120. data/ext/sources/ggml/src/ggml-cuda/binbcast.cuh +1 -0
  121. data/ext/sources/ggml/src/ggml-cuda/col2im-1d.cu +81 -0
  122. data/ext/sources/ggml/src/ggml-cuda/col2im-1d.cuh +3 -0
  123. data/ext/sources/ggml/src/ggml-cuda/common.cuh +246 -28
  124. data/ext/sources/ggml/src/ggml-cuda/concat.cu +134 -116
  125. data/ext/sources/ggml/src/ggml-cuda/conv-transpose-1d.cu +14 -12
  126. data/ext/sources/ggml/src/ggml-cuda/conv2d-transpose.cu +45 -21
  127. data/ext/sources/ggml/src/ggml-cuda/conv2d-transpose.cuh +1 -0
  128. data/ext/sources/ggml/src/ggml-cuda/convert.cu +139 -34
  129. data/ext/sources/ggml/src/ggml-cuda/convert.cuh +10 -0
  130. data/ext/sources/ggml/src/ggml-cuda/cpy.cu +88 -29
  131. data/ext/sources/ggml/src/ggml-cuda/dequantize.cuh +22 -0
  132. data/ext/sources/ggml/src/ggml-cuda/fattn-common.cuh +287 -49
  133. data/ext/sources/ggml/src/ggml-cuda/fattn-mma-f16.cuh +335 -130
  134. data/ext/sources/ggml/src/ggml-cuda/fattn-tile.cu +12 -0
  135. data/ext/sources/ggml/src/ggml-cuda/fattn-tile.cuh +127 -24
  136. data/ext/sources/ggml/src/ggml-cuda/fattn-vec.cuh +40 -15
  137. data/ext/sources/ggml/src/ggml-cuda/fattn-wmma-f16.cu +18 -9
  138. data/ext/sources/ggml/src/ggml-cuda/fattn.cu +169 -60
  139. data/ext/sources/ggml/src/ggml-cuda/fattn.cuh +2 -0
  140. data/ext/sources/ggml/src/ggml-cuda/fwht.cu +101 -0
  141. data/ext/sources/ggml/src/ggml-cuda/fwht.cuh +4 -0
  142. data/ext/sources/ggml/src/ggml-cuda/gated_delta_net.cu +109 -45
  143. data/ext/sources/ggml/src/ggml-cuda/gated_delta_net.cuh +10 -0
  144. data/ext/sources/ggml/src/ggml-cuda/getrows.cu +48 -23
  145. data/ext/sources/ggml/src/ggml-cuda/ggml-cuda.cu +2034 -2104
  146. data/ext/sources/ggml/src/ggml-cuda/im2col.cu +32 -29
  147. data/ext/sources/ggml/src/ggml-cuda/mean.cu +4 -2
  148. data/ext/sources/ggml/src/ggml-cuda/mma.cuh +242 -195
  149. data/ext/sources/ggml/src/ggml-cuda/mmf.cuh +3 -3
  150. data/ext/sources/ggml/src/ggml-cuda/mmq.cu +25 -12
  151. data/ext/sources/ggml/src/ggml-cuda/mmq.cuh +502 -423
  152. data/ext/sources/ggml/src/ggml-cuda/mmvf.cu +19 -12
  153. data/ext/sources/ggml/src/ggml-cuda/mmvq.cu +562 -97
  154. data/ext/sources/ggml/src/ggml-cuda/mmvq.cuh +6 -1
  155. data/ext/sources/ggml/src/ggml-cuda/norm.cu +36 -10
  156. data/ext/sources/ggml/src/ggml-cuda/out-prod.cu +66 -7
  157. data/ext/sources/ggml/src/ggml-cuda/quantize.cu +133 -26
  158. data/ext/sources/ggml/src/ggml-cuda/quantize.cuh +1 -1
  159. data/ext/sources/ggml/src/ggml-cuda/reduce_rows.cuh +5 -1
  160. data/ext/sources/ggml/src/ggml-cuda/rope.cu +11 -4
  161. data/ext/sources/ggml/src/ggml-cuda/scale.cu +4 -1
  162. data/ext/sources/ggml/src/ggml-cuda/set-rows.cu +78 -10
  163. data/ext/sources/ggml/src/ggml-cuda/snake.cu +72 -0
  164. data/ext/sources/ggml/src/ggml-cuda/snake.cuh +8 -0
  165. data/ext/sources/ggml/src/ggml-cuda/softcap.cu +4 -1
  166. data/ext/sources/ggml/src/ggml-cuda/ssm-conv.cu +45 -13
  167. data/ext/sources/ggml/src/ggml-cuda/ssm-conv.cuh +1 -1
  168. data/ext/sources/ggml/src/ggml-cuda/ssm-scan.cu +40 -18
  169. data/ext/sources/ggml/src/ggml-cuda/sumrows.cu +8 -4
  170. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_1-ncols2_16.cu +1 -0
  171. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_1-ncols2_32.cu +1 -0
  172. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_1-ncols2_8.cu +2 -0
  173. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_16-ncols2_2.cu +1 -0
  174. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_16-ncols2_4.cu +1 -0
  175. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_16.cu +1 -0
  176. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_32.cu +1 -0
  177. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_4.cu +1 -0
  178. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_8.cu +2 -0
  179. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_32-ncols2_2.cu +1 -0
  180. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_16.cu +1 -0
  181. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_2.cu +1 -0
  182. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_4.cu +1 -0
  183. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_8.cu +2 -0
  184. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_8-ncols2_2.cu +1 -0
  185. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_8-ncols2_4.cu +1 -0
  186. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_8-ncols2_8.cu +2 -0
  187. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq192-dv128.cu +5 -0
  188. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq320-dv256.cu +5 -0
  189. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq512-dv512.cu +5 -0
  190. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-bf16.cu +7 -0
  191. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-f16.cu +7 -0
  192. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q4_0.cu +7 -0
  193. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q4_1.cu +7 -0
  194. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q5_0.cu +7 -0
  195. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q5_1.cu +7 -0
  196. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q8_0.cu +7 -0
  197. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-bf16.cu +7 -0
  198. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-bf16.cu +7 -0
  199. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-bf16.cu +7 -0
  200. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-bf16.cu +7 -0
  201. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-bf16.cu +7 -0
  202. data/ext/sources/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-bf16.cu +7 -0
  203. data/ext/sources/ggml/src/ggml-cuda/template-instances/mmq-instance-nvfp4.cu +5 -0
  204. data/ext/sources/ggml/src/ggml-cuda/template-instances/mmq-instance-q1_0.cu +5 -0
  205. data/ext/sources/ggml/src/ggml-cuda/top-k.cu +5 -4
  206. data/ext/sources/ggml/src/ggml-cuda/topk-moe.cu +33 -24
  207. data/ext/sources/ggml/src/ggml-cuda/unary.cu +31 -2
  208. data/ext/sources/ggml/src/ggml-cuda/unary.cuh +2 -0
  209. data/ext/sources/ggml/src/ggml-cuda/vecdotq.cuh +80 -0
  210. data/ext/sources/ggml/src/ggml-cuda/vendors/cuda.h +7 -2
  211. data/ext/sources/ggml/src/ggml-cuda/vendors/hip.h +23 -4
  212. data/ext/sources/ggml/src/ggml-cuda/vendors/musa.h +4 -0
  213. data/ext/sources/ggml/src/ggml-hexagon/CMakeLists.txt +1 -5
  214. data/ext/sources/ggml/src/ggml-hexagon/ggml-hexagon.cpp +2788 -1762
  215. data/ext/sources/ggml/src/ggml-hexagon/htp/CMakeLists.txt +13 -4
  216. data/ext/sources/ggml/src/ggml-hexagon/htp/act-ops.c +53 -84
  217. data/ext/sources/ggml/src/ggml-hexagon/htp/argsort-ops.c +25 -12
  218. data/ext/sources/ggml/src/ggml-hexagon/htp/binary-ops.c +165 -184
  219. data/ext/sources/ggml/src/ggml-hexagon/htp/cmake-toolchain.cmake +17 -19
  220. data/ext/sources/ggml/src/ggml-hexagon/htp/concat-ops.c +277 -0
  221. data/ext/sources/ggml/src/ggml-hexagon/htp/cpy-ops.c +170 -127
  222. data/ext/sources/ggml/src/ggml-hexagon/htp/cumsum-ops.c +270 -0
  223. data/ext/sources/ggml/src/ggml-hexagon/htp/diag-ops.c +216 -0
  224. data/ext/sources/ggml/src/ggml-hexagon/htp/fill-ops.c +123 -0
  225. data/ext/sources/ggml/src/ggml-hexagon/htp/flash-attn-ops.c +1774 -396
  226. data/ext/sources/ggml/src/ggml-hexagon/htp/flash-attn-ops.h +303 -0
  227. data/ext/sources/ggml/src/ggml-hexagon/htp/gated-delta-net-ops.c +1148 -0
  228. data/ext/sources/ggml/src/ggml-hexagon/htp/get-rows-ops.c +148 -42
  229. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-common.h +80 -0
  230. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-dma.c +2 -2
  231. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-dma.h +255 -62
  232. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-dump.h +9 -0
  233. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-profile.h +64 -0
  234. data/ext/sources/ggml/src/ggml-hexagon/htp/hex-utils.h +25 -21
  235. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-fa-kernels.h +555 -0
  236. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-mm-kernels-tiled.h +1303 -0
  237. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-queue.c +167 -0
  238. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-queue.h +157 -0
  239. data/ext/sources/ggml/src/ggml-hexagon/htp/hmx-utils.h +222 -0
  240. data/ext/sources/ggml/src/ggml-hexagon/htp/htp-ctx.h +104 -13
  241. data/ext/sources/ggml/src/ggml-hexagon/htp/htp-ops.h +222 -57
  242. data/ext/sources/ggml/src/ggml-hexagon/htp/htp-vtcm.h +19 -0
  243. data/ext/sources/ggml/src/ggml-hexagon/htp/htp_iface.idl +10 -3
  244. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-base.h +78 -26
  245. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-copy.h +27 -10
  246. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-div.h +63 -23
  247. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-exp.h +48 -8
  248. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-fa-kernels.h +232 -0
  249. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-flash-attn.h +47 -0
  250. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-log.h +65 -0
  251. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-mm-kernels-flat.h +1511 -0
  252. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-mm-kernels-tiled.h +1200 -0
  253. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-pow.h +42 -0
  254. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-repl.h +74 -0
  255. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-sigmoid.h +40 -0
  256. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-sin-cos.h +90 -0
  257. data/ext/sources/ggml/src/ggml-hexagon/htp/hvx-utils.h +5 -8
  258. data/ext/sources/ggml/src/ggml-hexagon/htp/main.c +625 -816
  259. data/ext/sources/ggml/src/ggml-hexagon/htp/matmul-ops.c +3052 -2166
  260. data/ext/sources/ggml/src/ggml-hexagon/htp/matmul-ops.h +650 -0
  261. data/ext/sources/ggml/src/ggml-hexagon/htp/pad-ops.c +547 -0
  262. data/ext/sources/ggml/src/ggml-hexagon/htp/repeat-ops.c +148 -0
  263. data/ext/sources/ggml/src/ggml-hexagon/htp/rope-ops.c +337 -106
  264. data/ext/sources/ggml/src/ggml-hexagon/htp/set-rows-ops.c +59 -37
  265. data/ext/sources/ggml/src/ggml-hexagon/htp/softmax-ops.c +121 -133
  266. data/ext/sources/ggml/src/ggml-hexagon/htp/solve-tri-ops.c +267 -0
  267. data/ext/sources/ggml/src/ggml-hexagon/htp/ssm-conv.c +245 -151
  268. data/ext/sources/ggml/src/ggml-hexagon/htp/sum-rows-ops.c +6 -6
  269. data/ext/sources/ggml/src/ggml-hexagon/htp/unary-ops.c +719 -45
  270. data/ext/sources/ggml/src/ggml-hexagon/htp/worker-pool.c +15 -3
  271. data/ext/sources/ggml/src/ggml-hexagon/htp/worker-pool.h +8 -0
  272. data/ext/sources/ggml/src/ggml-hexagon/htp-opnode.h +390 -0
  273. data/ext/sources/ggml/src/ggml-hexagon/libggml-htp.inf +3 -5
  274. data/ext/sources/ggml/src/ggml-hip/CMakeLists.txt +27 -9
  275. data/ext/sources/ggml/src/ggml-impl.h +6 -1
  276. data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.cpp +207 -18
  277. data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.h +36 -2
  278. data/ext/sources/ggml/src/ggml-metal/ggml-metal-device.m +186 -29
  279. data/ext/sources/ggml/src/ggml-metal/ggml-metal-impl.h +118 -0
  280. data/ext/sources/ggml/src/ggml-metal/ggml-metal-ops.cpp +322 -21
  281. data/ext/sources/ggml/src/ggml-metal/ggml-metal-ops.h +4 -0
  282. data/ext/sources/ggml/src/ggml-metal/ggml-metal.cpp +39 -26
  283. data/ext/sources/ggml/src/ggml-metal/ggml-metal.metal +1226 -467
  284. data/ext/sources/ggml/src/ggml-musa/CMakeLists.txt +5 -6
  285. data/ext/sources/ggml/src/ggml-opencl/CMakeLists.txt +67 -5
  286. data/ext/sources/ggml/src/ggml-opencl/fa_tune.h +92 -0
  287. data/ext/sources/ggml/src/ggml-opencl/ggml-opencl.cpp +16290 -6246
  288. data/ext/sources/ggml/src/ggml-opencl/kernels/concat.cl +67 -0
  289. data/ext/sources/ggml/src/ggml-opencl/kernels/cpy.cl +59 -0
  290. data/ext/sources/ggml/src/ggml-opencl/kernels/cvt.cl +1997 -92
  291. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f16.cl +81 -41
  292. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32.cl +88 -39
  293. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32_f16.cl +1995 -96
  294. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32_q4_0.cl +1615 -0
  295. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_f32_q8_0.cl +1486 -0
  296. data/ext/sources/ggml/src/ggml-opencl/kernels/flash_attn_pre_f16.cl +156 -0
  297. data/ext/sources/ggml/src/ggml-opencl/kernels/gated_delta_net.cl +249 -0
  298. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_mxfp4_f32_ns.cl +374 -0
  299. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q4_0_f32_ns.cl +324 -0
  300. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q4_1_f32_ns.cl +326 -0
  301. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q4_k_f32_ns.cl +348 -0
  302. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q5_0_f32_ns.cl +328 -0
  303. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q5_1_f32_ns.cl +330 -0
  304. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q5_k_f32_ns.cl +356 -0
  305. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_moe_q6_k_f32_ns.cl +335 -0
  306. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_iq4_nl_f32.cl +150 -0
  307. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q1_0_f32.cl +94 -0
  308. data/ext/sources/ggml/src/ggml-opencl/kernels/{mul_mat_Ab_Bi_8x4.cl → gemm_noshuffle_q4_0_f32.cl} +1 -1
  309. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q4_k_f32.cl +172 -0
  310. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q5_0_f32.cl +131 -0
  311. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q5_1_f32.cl +134 -0
  312. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q5_k_f32.cl +176 -0
  313. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_noshuffle_q6_k_f32.cl +140 -0
  314. data/ext/sources/ggml/src/ggml-opencl/kernels/{mul_mm_q8_0_f32_8x4.cl → gemm_noshuffle_q8_0_f32.cl} +1 -1
  315. data/ext/sources/ggml/src/ggml-opencl/kernels/gemm_xmem_f16_f32_os8.cl +233 -0
  316. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_mxfp4_f32_ns.cl +165 -0
  317. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q4_0_f32_ns.cl +120 -0
  318. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q4_1_f32_ns.cl +123 -0
  319. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q4_k_f32_ns.cl +155 -0
  320. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q5_0_f32_ns.cl +123 -0
  321. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q5_1_f32_ns.cl +125 -0
  322. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q5_k_f32_ns.cl +160 -0
  323. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_moe_q6_k_f32_ns.cl +141 -0
  324. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_iq4_nl_f32.cl +302 -0
  325. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q1_0_f32.cl +121 -0
  326. data/ext/sources/ggml/src/ggml-opencl/kernels/{gemv_noshuffle_general.cl → gemv_noshuffle_q4_0_f32.cl} +5 -5
  327. data/ext/sources/ggml/src/ggml-opencl/kernels/{gemv_noshuffle.cl → gemv_noshuffle_q4_0_f32_spec.cl} +5 -5
  328. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q4_k_f32.cl +318 -0
  329. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q5_0_f32.cl +291 -0
  330. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q5_1_f32.cl +294 -0
  331. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q5_k_f32.cl +326 -0
  332. data/ext/sources/ggml/src/ggml-opencl/kernels/gemv_noshuffle_q6_k_f32.cl +293 -0
  333. data/ext/sources/ggml/src/ggml-opencl/kernels/{gemv_noshuffle_general_q8_0_f32.cl → gemv_noshuffle_q8_0_f32.cl} +1 -1
  334. data/ext/sources/ggml/src/ggml-opencl/kernels/get_rows.cl +15 -9
  335. data/ext/sources/ggml/src/ggml-opencl/kernels/moe_reorder_b.cl +30 -0
  336. data/ext/sources/ggml/src/ggml-opencl/kernels/moe_sort_by_expert.cl +82 -0
  337. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_iq4_nl_f32_l4_lm.cl +171 -0
  338. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_q1_0_f32_l4_lm.cl +156 -0
  339. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_q4_k_f32_l4_lm.cl +179 -0
  340. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_q5_0_f32_l4_lm.cl +173 -0
  341. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_q5_1_f32_l4_lm.cl +175 -0
  342. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mm_q5_k_f32_l4_lm.cl +192 -0
  343. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_f16_f32_l4.cl +1149 -0
  344. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_iq4_nl_f32.cl +164 -0
  345. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_iq4_nl_f32_flat.cl +202 -0
  346. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q1_0_f32.cl +141 -0
  347. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q1_0_f32_flat.cl +190 -0
  348. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q4_k_f32_flat.cl +196 -0
  349. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_0_f32.cl +241 -0
  350. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_0_f32_flat.cl +243 -0
  351. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_1_f32.cl +243 -0
  352. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_1_f32_flat.cl +247 -0
  353. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_k_f32.cl +187 -0
  354. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q5_k_f32_flat.cl +203 -0
  355. data/ext/sources/ggml/src/ggml-opencl/kernels/mul_mv_q6_k_f32_flat.cl +48 -64
  356. data/ext/sources/ggml/src/ggml-opencl/kernels/norm.cl +5 -2
  357. data/ext/sources/ggml/src/ggml-opencl/kernels/set_rows.cl +500 -0
  358. data/ext/sources/ggml/src/ggml-opencl/libdl.h +79 -0
  359. data/ext/sources/ggml/src/ggml-openvino/.clang-format +0 -5
  360. data/ext/sources/ggml/src/ggml-openvino/CMakeLists.txt +2 -4
  361. data/ext/sources/ggml/src/ggml-openvino/ggml-decoder.cpp +740 -127
  362. data/ext/sources/ggml/src/ggml-openvino/ggml-decoder.h +76 -23
  363. data/ext/sources/ggml/src/ggml-openvino/ggml-openvino-extra.cpp +75 -14
  364. data/ext/sources/ggml/src/ggml-openvino/ggml-openvino-extra.h +29 -8
  365. data/ext/sources/ggml/src/ggml-openvino/ggml-openvino.cpp +339 -69
  366. data/ext/sources/ggml/src/ggml-openvino/ggml-quants.cpp +330 -192
  367. data/ext/sources/ggml/src/ggml-openvino/ggml-quants.h +10 -4
  368. data/ext/sources/ggml/src/ggml-openvino/openvino/decoder.h +56 -16
  369. data/ext/sources/ggml/src/ggml-openvino/openvino/frontend.h +1 -1
  370. data/ext/sources/ggml/src/ggml-openvino/openvino/input_model.h +4 -4
  371. data/ext/sources/ggml/src/ggml-openvino/openvino/node_context.h +94 -37
  372. data/ext/sources/ggml/src/ggml-openvino/openvino/op/add_id.cpp +76 -0
  373. data/ext/sources/ggml/src/ggml-openvino/openvino/op/argsort.cpp +47 -0
  374. data/ext/sources/ggml/src/ggml-openvino/openvino/op/clamp.cpp +33 -0
  375. data/ext/sources/ggml/src/ggml-openvino/openvino/op/concat.cpp +48 -0
  376. data/ext/sources/ggml/src/ggml-openvino/openvino/op/cont.cpp +8 -16
  377. data/ext/sources/ggml/src/ggml-openvino/openvino/op/cpy.cpp +14 -1
  378. data/ext/sources/ggml/src/ggml-openvino/openvino/op/div.cpp +146 -0
  379. data/ext/sources/ggml/src/ggml-openvino/openvino/op/flash_attn_ext.cpp +108 -21
  380. data/ext/sources/ggml/src/ggml-openvino/openvino/op/gated_delta_net.cpp +282 -0
  381. data/ext/sources/ggml/src/ggml-openvino/openvino/op/gated_delta_net.hpp +65 -0
  382. data/ext/sources/ggml/src/ggml-openvino/openvino/op/get_rows.cpp +2 -9
  383. data/ext/sources/ggml/src/ggml-openvino/openvino/op/glu_geglu.cpp +21 -7
  384. data/ext/sources/ggml/src/ggml-openvino/openvino/op/glu_swiglu.cpp +41 -8
  385. data/ext/sources/ggml/src/ggml-openvino/openvino/op/im2col.cpp +120 -0
  386. data/ext/sources/ggml/src/ggml-openvino/openvino/op/l2_norm.cpp +44 -0
  387. data/ext/sources/ggml/src/ggml-openvino/openvino/op/mul_mat_id.cpp +226 -0
  388. data/ext/sources/ggml/src/ggml-openvino/openvino/op/mulmat.cpp +19 -9
  389. data/ext/sources/ggml/src/ggml-openvino/openvino/op/norm.cpp +58 -0
  390. data/ext/sources/ggml/src/ggml-openvino/openvino/op/pad.cpp +95 -0
  391. data/ext/sources/ggml/src/ggml-openvino/openvino/op/permute.cpp +58 -13
  392. data/ext/sources/ggml/src/ggml-openvino/openvino/op/repeat.cpp +74 -0
  393. data/ext/sources/ggml/src/ggml-openvino/openvino/op/reshape.cpp +13 -6
  394. data/ext/sources/ggml/src/ggml-openvino/openvino/op/rms_norm.cpp +1 -1
  395. data/ext/sources/ggml/src/ggml-openvino/openvino/op/rope.cpp +161 -39
  396. data/ext/sources/ggml/src/ggml-openvino/openvino/op/set_rows.cpp +3 -3
  397. data/ext/sources/ggml/src/ggml-openvino/openvino/op/softmax.cpp +126 -49
  398. data/ext/sources/ggml/src/ggml-openvino/openvino/op/ssm_conv.cpp +59 -0
  399. data/ext/sources/ggml/src/ggml-openvino/openvino/op/sum_rows.cpp +27 -0
  400. data/ext/sources/ggml/src/ggml-openvino/openvino/op/transpose.cpp +32 -1
  401. data/ext/sources/ggml/src/ggml-openvino/openvino/op/unary_silu.cpp +1 -1
  402. data/ext/sources/ggml/src/ggml-openvino/openvino/op/unary_softplus.cpp +38 -0
  403. data/ext/sources/ggml/src/ggml-openvino/openvino/op/view.cpp +90 -25
  404. data/ext/sources/ggml/src/ggml-openvino/openvino/op_table.cpp +41 -22
  405. data/ext/sources/ggml/src/ggml-openvino/openvino/op_table.h +18 -4
  406. data/ext/sources/ggml/src/ggml-openvino/openvino/pass/mark_decompression_convert_constant_folding.h +1 -1
  407. data/ext/sources/ggml/src/ggml-openvino/openvino/rt_info/weightless_caching_attributes.hpp +41 -0
  408. data/ext/sources/ggml/src/ggml-openvino/openvino/translate_session.cpp +70 -43
  409. data/ext/sources/ggml/src/ggml-openvino/openvino/translate_session.h +5 -4
  410. data/ext/sources/ggml/src/ggml-openvino/openvino/utils.cpp +612 -36
  411. data/ext/sources/ggml/src/ggml-openvino/openvino/utils.h +29 -26
  412. data/ext/sources/ggml/src/ggml-openvino/utils.cpp +460 -114
  413. data/ext/sources/ggml/src/ggml-openvino/utils.h +32 -9
  414. data/ext/sources/ggml/src/ggml-opt.cpp +1 -0
  415. data/ext/sources/ggml/src/ggml-quants.c +365 -114
  416. data/ext/sources/ggml/src/ggml-quants.h +6 -0
  417. data/ext/sources/ggml/src/ggml-rpc/CMakeLists.txt +24 -0
  418. data/ext/sources/ggml/src/ggml-rpc/ggml-rpc.cpp +167 -311
  419. data/ext/sources/ggml/src/ggml-rpc/transport.cpp +683 -0
  420. data/ext/sources/ggml/src/ggml-rpc/transport.h +34 -0
  421. data/ext/sources/ggml/src/ggml-sycl/CMakeLists.txt +50 -4
  422. data/ext/sources/ggml/src/ggml-sycl/add-id.cpp +1 -1
  423. data/ext/sources/ggml/src/ggml-sycl/backend.hpp +5 -1
  424. data/ext/sources/ggml/src/ggml-sycl/binbcast.cpp +12 -0
  425. data/ext/sources/ggml/src/ggml-sycl/col2im-1d.cpp +102 -0
  426. data/ext/sources/ggml/src/ggml-sycl/col2im-1d.hpp +8 -0
  427. data/ext/sources/ggml/src/ggml-sycl/common.cpp +72 -2
  428. data/ext/sources/ggml/src/ggml-sycl/common.hpp +59 -2
  429. data/ext/sources/ggml/src/ggml-sycl/concat.cpp +21 -1
  430. data/ext/sources/ggml/src/ggml-sycl/conv2d-dw.cpp +158 -0
  431. data/ext/sources/ggml/src/ggml-sycl/conv2d-dw.hpp +10 -0
  432. data/ext/sources/ggml/src/ggml-sycl/conv2d-transpose.cpp +125 -0
  433. data/ext/sources/ggml/src/ggml-sycl/conv2d-transpose.hpp +10 -0
  434. data/ext/sources/ggml/src/ggml-sycl/conv2d.cpp +150 -0
  435. data/ext/sources/ggml/src/ggml-sycl/conv2d.hpp +10 -0
  436. data/ext/sources/ggml/src/ggml-sycl/conv3d.cpp +224 -0
  437. data/ext/sources/ggml/src/ggml-sycl/conv3d.hpp +8 -0
  438. data/ext/sources/ggml/src/ggml-sycl/convert.cpp +121 -13
  439. data/ext/sources/ggml/src/ggml-sycl/convert.hpp +9 -0
  440. data/ext/sources/ggml/src/ggml-sycl/cpy.cpp +706 -0
  441. data/ext/sources/ggml/src/ggml-sycl/cpy.hpp +281 -0
  442. data/ext/sources/ggml/src/ggml-sycl/cross_entropy_loss.cpp +255 -0
  443. data/ext/sources/ggml/src/ggml-sycl/cross_entropy_loss.hpp +7 -0
  444. data/ext/sources/ggml/src/ggml-sycl/cumsum.cpp +148 -0
  445. data/ext/sources/ggml/src/ggml-sycl/cumsum.hpp +5 -0
  446. data/ext/sources/ggml/src/ggml-sycl/dequantize.hpp +678 -0
  447. data/ext/sources/ggml/src/ggml-sycl/diag.cpp +67 -0
  448. data/ext/sources/ggml/src/ggml-sycl/diag.hpp +5 -0
  449. data/ext/sources/ggml/src/ggml-sycl/dmmv.cpp +997 -244
  450. data/ext/sources/ggml/src/ggml-sycl/dpct/helper.hpp +15 -7
  451. data/ext/sources/ggml/src/ggml-sycl/element_wise.cpp +215 -204
  452. data/ext/sources/ggml/src/ggml-sycl/element_wise.hpp +2 -2
  453. data/ext/sources/ggml/src/ggml-sycl/fattn-buffers.cpp +56 -0
  454. data/ext/sources/ggml/src/ggml-sycl/fattn-buffers.hpp +63 -0
  455. data/ext/sources/ggml/src/ggml-sycl/fattn-common.hpp +7 -5
  456. data/ext/sources/ggml/src/ggml-sycl/fattn-tile.cpp +4 -0
  457. data/ext/sources/ggml/src/ggml-sycl/fattn-tile.hpp +76 -168
  458. data/ext/sources/ggml/src/ggml-sycl/fattn-vec.hpp +7 -0
  459. data/ext/sources/ggml/src/ggml-sycl/fattn.cpp +3 -1
  460. data/ext/sources/ggml/src/ggml-sycl/fill.cpp +55 -0
  461. data/ext/sources/ggml/src/ggml-sycl/fill.hpp +5 -0
  462. data/ext/sources/ggml/src/ggml-sycl/gated_delta_net.cpp +69 -31
  463. data/ext/sources/ggml/src/ggml-sycl/gated_delta_net.hpp +1 -0
  464. data/ext/sources/ggml/src/ggml-sycl/gemm.hpp +3 -0
  465. data/ext/sources/ggml/src/ggml-sycl/getrows.cpp +79 -3
  466. data/ext/sources/ggml/src/ggml-sycl/ggml-sycl.cpp +1758 -455
  467. data/ext/sources/ggml/src/ggml-sycl/im2col.cpp +353 -89
  468. data/ext/sources/ggml/src/ggml-sycl/im2col.hpp +5 -3
  469. data/ext/sources/ggml/src/ggml-sycl/mmvq.cpp +1542 -39
  470. data/ext/sources/ggml/src/ggml-sycl/mmvq.hpp +33 -0
  471. data/ext/sources/ggml/src/ggml-sycl/norm.cpp +103 -49
  472. data/ext/sources/ggml/src/ggml-sycl/outprod.cpp +45 -9
  473. data/ext/sources/ggml/src/ggml-sycl/pad.cpp +27 -27
  474. data/ext/sources/ggml/src/ggml-sycl/pool.cpp +185 -0
  475. data/ext/sources/ggml/src/ggml-sycl/pool.hpp +22 -0
  476. data/ext/sources/ggml/src/ggml-sycl/presets.hpp +3 -1
  477. data/ext/sources/ggml/src/ggml-sycl/quants.hpp +71 -0
  478. data/ext/sources/ggml/src/ggml-sycl/set_rows.cpp +17 -3
  479. data/ext/sources/ggml/src/ggml-sycl/softmax.cpp +9 -10
  480. data/ext/sources/ggml/src/ggml-sycl/solve_tri.cpp +172 -0
  481. data/ext/sources/ggml/src/ggml-sycl/solve_tri.hpp +8 -0
  482. data/ext/sources/ggml/src/ggml-sycl/ssm_conv.cpp +6 -1
  483. data/ext/sources/ggml/src/ggml-sycl/ssm_scan.cpp +156 -0
  484. data/ext/sources/ggml/src/ggml-sycl/ssm_scan.hpp +5 -0
  485. data/ext/sources/ggml/src/ggml-sycl/sycl_hw.cpp +62 -10
  486. data/ext/sources/ggml/src/ggml-sycl/sycl_hw.hpp +18 -6
  487. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-tile-instance-dkq512-dv512.cpp +6 -0
  488. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-f16.cpp +1 -0
  489. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-q4_0.cpp +1 -0
  490. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-q4_1.cpp +1 -0
  491. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-q5_0.cpp +1 -0
  492. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-q5_1.cpp +1 -0
  493. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-f16-q8_0.cpp +1 -0
  494. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-f16.cpp +1 -0
  495. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-q4_0.cpp +1 -0
  496. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-q4_1.cpp +1 -0
  497. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-q5_0.cpp +1 -0
  498. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-q5_1.cpp +1 -0
  499. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_0-q8_0.cpp +1 -0
  500. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-f16.cpp +1 -0
  501. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-q4_0.cpp +1 -0
  502. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-q4_1.cpp +1 -0
  503. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-q5_0.cpp +1 -0
  504. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-q5_1.cpp +1 -0
  505. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q4_1-q8_0.cpp +1 -0
  506. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-f16.cpp +1 -0
  507. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-q4_0.cpp +1 -0
  508. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-q4_1.cpp +1 -0
  509. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-q5_0.cpp +1 -0
  510. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-q5_1.cpp +1 -0
  511. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_0-q8_0.cpp +1 -0
  512. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-f16.cpp +1 -0
  513. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-q4_0.cpp +1 -0
  514. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-q4_1.cpp +1 -0
  515. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-q5_0.cpp +1 -0
  516. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-q5_1.cpp +1 -0
  517. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q5_1-q8_0.cpp +1 -0
  518. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-f16.cpp +1 -0
  519. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-q4_0.cpp +1 -0
  520. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-q4_1.cpp +1 -0
  521. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-q5_0.cpp +1 -0
  522. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-q5_1.cpp +1 -0
  523. data/ext/sources/ggml/src/ggml-sycl/template-instances/fattn-vec-instance-q8_0-q8_0.cpp +1 -0
  524. data/ext/sources/ggml/src/ggml-sycl/type.hpp +112 -0
  525. data/ext/sources/ggml/src/ggml-sycl/upscale.cpp +410 -0
  526. data/ext/sources/ggml/src/ggml-sycl/upscale.hpp +9 -0
  527. data/ext/sources/ggml/src/ggml-sycl/vecdotq.hpp +242 -45
  528. data/ext/sources/ggml/src/ggml-virtgpu/ggml-backend-buffer.cpp +4 -0
  529. data/ext/sources/ggml/src/ggml-virtgpu/ggml-backend-device.cpp +2 -0
  530. data/ext/sources/ggml/src/ggml-virtgpu/ggml-backend.cpp +2 -0
  531. data/ext/sources/ggml/src/ggml-virtgpu/virtgpu-shm.cpp +1 -0
  532. data/ext/sources/ggml/src/ggml-virtgpu/virtgpu.cpp +1 -0
  533. data/ext/sources/ggml/src/ggml-virtgpu/virtgpu.h +0 -2
  534. data/ext/sources/ggml/src/ggml-vulkan/CMakeLists.txt +16 -0
  535. data/ext/sources/ggml/src/ggml-vulkan/ggml-vulkan.cpp +2843 -700
  536. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/CMakeLists.txt +4 -0
  537. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/col2im_1d.comp +61 -0
  538. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/contig_copy.comp +6 -2
  539. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/conv2d_mm.comp +146 -13
  540. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/conv3d_mm.comp +431 -0
  541. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/copy.comp +3 -1
  542. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/copy_from_quant.comp +1 -1
  543. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/copy_to_quant.comp +25 -1
  544. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs.glsl +88 -0
  545. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs_cm2.glsl +643 -1
  546. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_nvfp4.comp +32 -0
  547. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q1_0.comp +29 -0
  548. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/diag.comp +3 -4
  549. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/dot_product_funcs.glsl +27 -0
  550. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/feature-tests/coopmat2_decode_vector.comp +7 -0
  551. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn.comp +198 -48
  552. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_base.glsl +60 -59
  553. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_cm1.comp +116 -113
  554. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_cm2.comp +122 -31
  555. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_dequant.glsl +131 -0
  556. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/flash_attn_mmq_funcs.glsl +203 -0
  557. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/fwht.comp +115 -0
  558. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/gated_delta_net.comp +125 -64
  559. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/generic_binary_head.glsl +0 -1
  560. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/generic_unary_head.glsl +21 -19
  561. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/get_rows_back.comp +25 -0
  562. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/glu_head.glsl +29 -1
  563. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/glu_main.glsl +17 -11
  564. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/im2col.comp +76 -54
  565. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/im2col_3d.comp +0 -1
  566. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/l2_norm.comp +4 -7
  567. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/log.comp +0 -1
  568. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec.comp +122 -27
  569. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_iface.glsl +6 -6
  570. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q2_k.comp +1 -1
  571. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q4_k.comp +1 -1
  572. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q5_k.comp +1 -1
  573. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vecq.comp +22 -24
  574. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vecq_funcs.glsl +88 -55
  575. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm.comp +42 -40
  576. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_cm2.comp +49 -15
  577. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_funcs.glsl +222 -171
  578. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_funcs.glsl +8 -8
  579. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_shmem_types.glsl +24 -9
  580. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/multi_add.comp +0 -1
  581. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/norm.comp +10 -10
  582. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/repeat_back.comp +3 -3
  583. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/roll.comp +3 -3
  584. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/rope_funcs.glsl +5 -2
  585. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/rope_head.glsl +0 -1
  586. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/rope_params.glsl +3 -2
  587. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/snake.comp +49 -0
  588. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/ssm_conv.comp +11 -1
  589. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/tri.comp +3 -4
  590. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/types.glsl +79 -2
  591. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/unary.comp +168 -0
  592. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp +282 -211
  593. data/ext/sources/ggml/src/ggml-webgpu/CMakeLists.txt +5 -2
  594. data/ext/sources/ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp +2209 -283
  595. data/ext/sources/ggml/src/ggml-webgpu/ggml-webgpu.cpp +2618 -1416
  596. data/ext/sources/ggml/src/ggml-webgpu/pre_wgsl.hpp +37 -7
  597. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/add_id.wgsl +64 -0
  598. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/binary.wgsl +8 -7
  599. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/common_decls.tmpl +90 -95
  600. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/concat.wgsl +19 -1
  601. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/conv2d.wgsl +165 -0
  602. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/{cpy.tmpl.wgsl → cpy.wgsl} +25 -50
  603. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn.wgsl +107 -184
  604. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn_quant_staging.tmpl +124 -0
  605. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn_tile.wgsl +397 -0
  606. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn_vec_blk.wgsl +101 -0
  607. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn_vec_reduce.wgsl +84 -0
  608. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/flash_attn_vec_split.wgsl +619 -0
  609. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/gated_delta_net.wgsl +149 -0
  610. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/get_rows.wgsl +204 -78
  611. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/glu.wgsl +155 -0
  612. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/im2col.wgsl +101 -0
  613. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_decls.tmpl +805 -526
  614. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_id.wgsl +195 -0
  615. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_id_gather.wgsl +52 -0
  616. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_id_vec.wgsl +154 -0
  617. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_reg_tile.wgsl +8 -6
  618. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_subgroup_matrix.wgsl +5 -1
  619. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec.wgsl +90 -413
  620. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_acc.tmpl +1553 -0
  621. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat_vec_q_acc.tmpl +297 -0
  622. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/quant_inner_loops.tmpl +21 -0
  623. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/quantize_q8.wgsl +178 -0
  624. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/rms_norm_mul.wgsl +152 -0
  625. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/{rope.tmpl.wgsl → rope.wgsl} +71 -142
  626. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/row_norm.wgsl +153 -0
  627. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/scale.wgsl +6 -4
  628. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/set.wgsl +109 -0
  629. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/set_rows.wgsl +2 -3
  630. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/set_rows_quant.wgsl +224 -0
  631. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/{soft_max.tmpl.wgsl → soft_max.wgsl} +106 -206
  632. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/solve_tri.wgsl +121 -0
  633. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/ssm_conv.wgsl +65 -0
  634. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/ssm_scan.wgsl +193 -0
  635. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/unary.wgsl +68 -48
  636. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/upscale.wgsl +240 -0
  637. data/ext/sources/ggml/src/ggml-zdnn/ggml-zdnn.cpp +18 -14
  638. data/ext/sources/ggml/src/ggml-zendnn/CMakeLists.txt +1 -1
  639. data/ext/sources/ggml/src/ggml-zendnn/ggml-zendnn.cpp +244 -10
  640. data/ext/sources/ggml/src/ggml.c +146 -42
  641. data/ext/sources/ggml/src/gguf.cpp +173 -28
  642. data/ext/sources/include/parakeet.h +342 -0
  643. data/ext/sources/include/whisper.h +31 -0
  644. data/ext/sources/media/matmul.png +0 -0
  645. data/ext/sources/src/CMakeLists.txt +23 -0
  646. data/ext/sources/src/parakeet-arch.h +188 -0
  647. data/ext/sources/src/parakeet.cpp +3838 -0
  648. data/ext/sources/src/whisper.cpp +220 -26
  649. data/extsources.rb +26 -10
  650. data/lib/whisper/log_settable.rb +33 -0
  651. data/lib/whisper/model/uri.rb +13 -8
  652. data/lib/whisper/output.rb +74 -0
  653. data/sig/whisper.rbs +417 -62
  654. data/test/helper.rb +2 -0
  655. data/test/jfk_reader/jfk_reader.c +50 -7
  656. data/test/test_callback.rb +1 -0
  657. data/test/test_package.rb +6 -5
  658. data/test/test_parakeet.rb +28 -0
  659. data/test/test_parakeet_callback.rb +107 -0
  660. data/test/test_parakeet_context.rb +116 -0
  661. data/test/test_parakeet_context_params.rb +24 -0
  662. data/test/test_parakeet_model.rb +21 -0
  663. data/test/test_parakeet_params.rb +78 -0
  664. data/test/test_parakeet_segment.rb +42 -0
  665. data/test/test_parakeet_token.rb +73 -0
  666. data/test/test_params.rb +2 -0
  667. data/test/test_vad.rb +9 -0
  668. data/test/test_vad_context.rb +2 -2
  669. data/test/test_vad_segment.rb +1 -1
  670. data/test/test_whisper.rb +24 -6
  671. data/whispercpp.gemspec +2 -2
  672. metadata +263 -304
  673. data/ext/sources/bindings/javascript/CMakeLists.txt +0 -41
  674. data/ext/sources/bindings/javascript/emscripten.cpp +0 -93
  675. data/ext/sources/bindings/javascript/libwhisper.worker.js +0 -1
  676. data/ext/sources/bindings/javascript/package.json +0 -26
  677. data/ext/sources/bindings/javascript/whisper.js +0 -19
  678. data/ext/sources/examples/addon.node/CMakeLists.txt +0 -31
  679. data/ext/sources/examples/addon.node/__test__/whisper.spec.js +0 -133
  680. data/ext/sources/examples/addon.node/addon.cpp +0 -557
  681. data/ext/sources/examples/addon.node/index.js +0 -59
  682. data/ext/sources/examples/addon.node/package.json +0 -16
  683. data/ext/sources/examples/addon.node/vad-example.js +0 -132
  684. data/ext/sources/examples/bench.wasm/CMakeLists.txt +0 -49
  685. data/ext/sources/examples/bench.wasm/emscripten.cpp +0 -87
  686. data/ext/sources/examples/bench.wasm/index-tmpl.html +0 -285
  687. data/ext/sources/examples/coi-serviceworker.js +0 -146
  688. data/ext/sources/examples/command/CMakeLists.txt +0 -10
  689. data/ext/sources/examples/command/command.cpp +0 -802
  690. data/ext/sources/examples/command/commands.txt +0 -9
  691. data/ext/sources/examples/command.wasm/CMakeLists.txt +0 -50
  692. data/ext/sources/examples/command.wasm/emscripten.cpp +0 -327
  693. data/ext/sources/examples/command.wasm/index-tmpl.html +0 -415
  694. data/ext/sources/examples/generate-karaoke.sh +0 -57
  695. data/ext/sources/examples/helpers.js +0 -191
  696. data/ext/sources/examples/livestream.sh +0 -112
  697. data/ext/sources/examples/lsp/CMakeLists.txt +0 -10
  698. data/ext/sources/examples/lsp/lsp.cpp +0 -471
  699. data/ext/sources/examples/lsp/whisper.vim +0 -362
  700. data/ext/sources/examples/python/test_whisper_processor.py +0 -7
  701. data/ext/sources/examples/python/whisper_processor.py +0 -54
  702. data/ext/sources/examples/server/bench.js +0 -29
  703. data/ext/sources/examples/server.py +0 -120
  704. data/ext/sources/examples/stream/CMakeLists.txt +0 -10
  705. data/ext/sources/examples/stream/stream.cpp +0 -437
  706. data/ext/sources/examples/stream.wasm/CMakeLists.txt +0 -49
  707. data/ext/sources/examples/stream.wasm/emscripten.cpp +0 -216
  708. data/ext/sources/examples/stream.wasm/index-tmpl.html +0 -491
  709. data/ext/sources/examples/sycl/CMakeLists.txt +0 -9
  710. data/ext/sources/examples/sycl/build.sh +0 -22
  711. data/ext/sources/examples/sycl/ls-sycl-device.cpp +0 -11
  712. data/ext/sources/examples/sycl/run-whisper.sh +0 -17
  713. data/ext/sources/examples/talk-llama/CMakeLists.txt +0 -48
  714. data/ext/sources/examples/talk-llama/eleven-labs.py +0 -80
  715. data/ext/sources/examples/talk-llama/llama-adapter.cpp +0 -488
  716. data/ext/sources/examples/talk-llama/llama-adapter.h +0 -89
  717. data/ext/sources/examples/talk-llama/llama-arch.cpp +0 -2877
  718. data/ext/sources/examples/talk-llama/llama-arch.h +0 -628
  719. data/ext/sources/examples/talk-llama/llama-batch.cpp +0 -919
  720. data/ext/sources/examples/talk-llama/llama-batch.h +0 -173
  721. data/ext/sources/examples/talk-llama/llama-chat.cpp +0 -896
  722. data/ext/sources/examples/talk-llama/llama-chat.h +0 -71
  723. data/ext/sources/examples/talk-llama/llama-context.cpp +0 -3633
  724. data/ext/sources/examples/talk-llama/llama-context.h +0 -359
  725. data/ext/sources/examples/talk-llama/llama-cparams.cpp +0 -5
  726. data/ext/sources/examples/talk-llama/llama-cparams.h +0 -47
  727. data/ext/sources/examples/talk-llama/llama-ext.h +0 -12
  728. data/ext/sources/examples/talk-llama/llama-grammar.cpp +0 -1464
  729. data/ext/sources/examples/talk-llama/llama-grammar.h +0 -194
  730. data/ext/sources/examples/talk-llama/llama-graph.cpp +0 -2735
  731. data/ext/sources/examples/talk-llama/llama-graph.h +0 -1031
  732. data/ext/sources/examples/talk-llama/llama-hparams.cpp +0 -258
  733. data/ext/sources/examples/talk-llama/llama-hparams.h +0 -353
  734. data/ext/sources/examples/talk-llama/llama-impl.cpp +0 -171
  735. data/ext/sources/examples/talk-llama/llama-impl.h +0 -75
  736. data/ext/sources/examples/talk-llama/llama-io.cpp +0 -15
  737. data/ext/sources/examples/talk-llama/llama-io.h +0 -35
  738. data/ext/sources/examples/talk-llama/llama-kv-cache-iswa.cpp +0 -330
  739. data/ext/sources/examples/talk-llama/llama-kv-cache-iswa.h +0 -137
  740. data/ext/sources/examples/talk-llama/llama-kv-cache.cpp +0 -2285
  741. data/ext/sources/examples/talk-llama/llama-kv-cache.h +0 -389
  742. data/ext/sources/examples/talk-llama/llama-kv-cells.h +0 -533
  743. data/ext/sources/examples/talk-llama/llama-memory-hybrid-iswa.cpp +0 -275
  744. data/ext/sources/examples/talk-llama/llama-memory-hybrid-iswa.h +0 -140
  745. data/ext/sources/examples/talk-llama/llama-memory-hybrid.cpp +0 -268
  746. data/ext/sources/examples/talk-llama/llama-memory-hybrid.h +0 -139
  747. data/ext/sources/examples/talk-llama/llama-memory-recurrent.cpp +0 -1165
  748. data/ext/sources/examples/talk-llama/llama-memory-recurrent.h +0 -182
  749. data/ext/sources/examples/talk-llama/llama-memory.cpp +0 -59
  750. data/ext/sources/examples/talk-llama/llama-memory.h +0 -122
  751. data/ext/sources/examples/talk-llama/llama-mmap.cpp +0 -752
  752. data/ext/sources/examples/talk-llama/llama-mmap.h +0 -73
  753. data/ext/sources/examples/talk-llama/llama-model-loader.cpp +0 -1655
  754. data/ext/sources/examples/talk-llama/llama-model-loader.h +0 -206
  755. data/ext/sources/examples/talk-llama/llama-model-saver.cpp +0 -299
  756. data/ext/sources/examples/talk-llama/llama-model-saver.h +0 -40
  757. data/ext/sources/examples/talk-llama/llama-model.cpp +0 -9056
  758. data/ext/sources/examples/talk-llama/llama-model.h +0 -597
  759. data/ext/sources/examples/talk-llama/llama-quant.cpp +0 -1304
  760. data/ext/sources/examples/talk-llama/llama-quant.h +0 -1
  761. data/ext/sources/examples/talk-llama/llama-sampler.cpp +0 -3885
  762. data/ext/sources/examples/talk-llama/llama-sampler.h +0 -42
  763. data/ext/sources/examples/talk-llama/llama-vocab.cpp +0 -3970
  764. data/ext/sources/examples/talk-llama/llama-vocab.h +0 -187
  765. data/ext/sources/examples/talk-llama/llama.cpp +0 -1194
  766. data/ext/sources/examples/talk-llama/llama.h +0 -1573
  767. data/ext/sources/examples/talk-llama/models/afmoe.cpp +0 -190
  768. data/ext/sources/examples/talk-llama/models/apertus.cpp +0 -125
  769. data/ext/sources/examples/talk-llama/models/arcee.cpp +0 -135
  770. data/ext/sources/examples/talk-llama/models/arctic.cpp +0 -137
  771. data/ext/sources/examples/talk-llama/models/arwkv7.cpp +0 -86
  772. data/ext/sources/examples/talk-llama/models/baichuan.cpp +0 -123
  773. data/ext/sources/examples/talk-llama/models/bailingmoe.cpp +0 -143
  774. data/ext/sources/examples/talk-llama/models/bailingmoe2.cpp +0 -133
  775. data/ext/sources/examples/talk-llama/models/bert.cpp +0 -184
  776. data/ext/sources/examples/talk-llama/models/bitnet.cpp +0 -145
  777. data/ext/sources/examples/talk-llama/models/bloom.cpp +0 -101
  778. data/ext/sources/examples/talk-llama/models/chameleon.cpp +0 -178
  779. data/ext/sources/examples/talk-llama/models/chatglm.cpp +0 -132
  780. data/ext/sources/examples/talk-llama/models/codeshell.cpp +0 -111
  781. data/ext/sources/examples/talk-llama/models/cogvlm.cpp +0 -102
  782. data/ext/sources/examples/talk-llama/models/cohere2-iswa.cpp +0 -134
  783. data/ext/sources/examples/talk-llama/models/command-r.cpp +0 -122
  784. data/ext/sources/examples/talk-llama/models/dbrx.cpp +0 -122
  785. data/ext/sources/examples/talk-llama/models/deci.cpp +0 -135
  786. data/ext/sources/examples/talk-llama/models/deepseek.cpp +0 -142
  787. data/ext/sources/examples/talk-llama/models/deepseek2.cpp +0 -262
  788. data/ext/sources/examples/talk-llama/models/delta-net-base.cpp +0 -445
  789. data/ext/sources/examples/talk-llama/models/dots1.cpp +0 -132
  790. data/ext/sources/examples/talk-llama/models/dream.cpp +0 -105
  791. data/ext/sources/examples/talk-llama/models/ernie4-5-moe.cpp +0 -148
  792. data/ext/sources/examples/talk-llama/models/ernie4-5.cpp +0 -110
  793. data/ext/sources/examples/talk-llama/models/eurobert.cpp +0 -97
  794. data/ext/sources/examples/talk-llama/models/exaone-moe.cpp +0 -145
  795. data/ext/sources/examples/talk-llama/models/exaone.cpp +0 -114
  796. data/ext/sources/examples/talk-llama/models/exaone4.cpp +0 -123
  797. data/ext/sources/examples/talk-llama/models/falcon-h1.cpp +0 -111
  798. data/ext/sources/examples/talk-llama/models/falcon.cpp +0 -120
  799. data/ext/sources/examples/talk-llama/models/gemma-embedding.cpp +0 -116
  800. data/ext/sources/examples/talk-llama/models/gemma.cpp +0 -112
  801. data/ext/sources/examples/talk-llama/models/gemma2-iswa.cpp +0 -128
  802. data/ext/sources/examples/talk-llama/models/gemma3.cpp +0 -155
  803. data/ext/sources/examples/talk-llama/models/gemma3n-iswa.cpp +0 -384
  804. data/ext/sources/examples/talk-llama/models/glm4-moe.cpp +0 -170
  805. data/ext/sources/examples/talk-llama/models/glm4.cpp +0 -157
  806. data/ext/sources/examples/talk-llama/models/gpt2.cpp +0 -105
  807. data/ext/sources/examples/talk-llama/models/gptneox.cpp +0 -144
  808. data/ext/sources/examples/talk-llama/models/granite-hybrid.cpp +0 -195
  809. data/ext/sources/examples/talk-llama/models/granite.cpp +0 -210
  810. data/ext/sources/examples/talk-llama/models/grok.cpp +0 -159
  811. data/ext/sources/examples/talk-llama/models/grovemoe.cpp +0 -139
  812. data/ext/sources/examples/talk-llama/models/hunyuan-dense.cpp +0 -132
  813. data/ext/sources/examples/talk-llama/models/hunyuan-moe.cpp +0 -153
  814. data/ext/sources/examples/talk-llama/models/internlm2.cpp +0 -120
  815. data/ext/sources/examples/talk-llama/models/jais.cpp +0 -86
  816. data/ext/sources/examples/talk-llama/models/jais2.cpp +0 -123
  817. data/ext/sources/examples/talk-llama/models/jamba.cpp +0 -106
  818. data/ext/sources/examples/talk-llama/models/kimi-linear.cpp +0 -381
  819. data/ext/sources/examples/talk-llama/models/lfm2.cpp +0 -196
  820. data/ext/sources/examples/talk-llama/models/llada-moe.cpp +0 -122
  821. data/ext/sources/examples/talk-llama/models/llada.cpp +0 -99
  822. data/ext/sources/examples/talk-llama/models/llama-iswa.cpp +0 -178
  823. data/ext/sources/examples/talk-llama/models/llama.cpp +0 -175
  824. data/ext/sources/examples/talk-llama/models/maincoder.cpp +0 -117
  825. data/ext/sources/examples/talk-llama/models/mamba-base.cpp +0 -289
  826. data/ext/sources/examples/talk-llama/models/mamba.cpp +0 -54
  827. data/ext/sources/examples/talk-llama/models/mimo2-iswa.cpp +0 -129
  828. data/ext/sources/examples/talk-llama/models/minicpm3.cpp +0 -200
  829. data/ext/sources/examples/talk-llama/models/minimax-m2.cpp +0 -123
  830. data/ext/sources/examples/talk-llama/models/mistral3.cpp +0 -160
  831. data/ext/sources/examples/talk-llama/models/models.h +0 -704
  832. data/ext/sources/examples/talk-llama/models/modern-bert.cpp +0 -109
  833. data/ext/sources/examples/talk-llama/models/mpt.cpp +0 -126
  834. data/ext/sources/examples/talk-llama/models/nemotron-h.cpp +0 -162
  835. data/ext/sources/examples/talk-llama/models/nemotron.cpp +0 -122
  836. data/ext/sources/examples/talk-llama/models/neo-bert.cpp +0 -104
  837. data/ext/sources/examples/talk-llama/models/olmo.cpp +0 -121
  838. data/ext/sources/examples/talk-llama/models/olmo2.cpp +0 -150
  839. data/ext/sources/examples/talk-llama/models/olmoe.cpp +0 -124
  840. data/ext/sources/examples/talk-llama/models/openai-moe-iswa.cpp +0 -127
  841. data/ext/sources/examples/talk-llama/models/openelm.cpp +0 -124
  842. data/ext/sources/examples/talk-llama/models/orion.cpp +0 -123
  843. data/ext/sources/examples/talk-llama/models/paddleocr.cpp +0 -122
  844. data/ext/sources/examples/talk-llama/models/pangu-embedded.cpp +0 -121
  845. data/ext/sources/examples/talk-llama/models/phi2.cpp +0 -121
  846. data/ext/sources/examples/talk-llama/models/phi3.cpp +0 -152
  847. data/ext/sources/examples/talk-llama/models/plamo.cpp +0 -110
  848. data/ext/sources/examples/talk-llama/models/plamo2.cpp +0 -320
  849. data/ext/sources/examples/talk-llama/models/plamo3.cpp +0 -128
  850. data/ext/sources/examples/talk-llama/models/plm.cpp +0 -169
  851. data/ext/sources/examples/talk-llama/models/qwen.cpp +0 -108
  852. data/ext/sources/examples/talk-llama/models/qwen2.cpp +0 -126
  853. data/ext/sources/examples/talk-llama/models/qwen2moe.cpp +0 -151
  854. data/ext/sources/examples/talk-llama/models/qwen2vl.cpp +0 -117
  855. data/ext/sources/examples/talk-llama/models/qwen3.cpp +0 -120
  856. data/ext/sources/examples/talk-llama/models/qwen35.cpp +0 -381
  857. data/ext/sources/examples/talk-llama/models/qwen35moe.cpp +0 -422
  858. data/ext/sources/examples/talk-llama/models/qwen3moe.cpp +0 -131
  859. data/ext/sources/examples/talk-llama/models/qwen3next.cpp +0 -525
  860. data/ext/sources/examples/talk-llama/models/qwen3vl-moe.cpp +0 -140
  861. data/ext/sources/examples/talk-llama/models/qwen3vl.cpp +0 -132
  862. data/ext/sources/examples/talk-llama/models/refact.cpp +0 -94
  863. data/ext/sources/examples/talk-llama/models/rnd1.cpp +0 -126
  864. data/ext/sources/examples/talk-llama/models/rwkv6-base.cpp +0 -164
  865. data/ext/sources/examples/talk-llama/models/rwkv6.cpp +0 -94
  866. data/ext/sources/examples/talk-llama/models/rwkv6qwen2.cpp +0 -86
  867. data/ext/sources/examples/talk-llama/models/rwkv7-base.cpp +0 -137
  868. data/ext/sources/examples/talk-llama/models/rwkv7.cpp +0 -90
  869. data/ext/sources/examples/talk-llama/models/seed-oss.cpp +0 -124
  870. data/ext/sources/examples/talk-llama/models/smallthinker.cpp +0 -126
  871. data/ext/sources/examples/talk-llama/models/smollm3.cpp +0 -128
  872. data/ext/sources/examples/talk-llama/models/stablelm.cpp +0 -146
  873. data/ext/sources/examples/talk-llama/models/starcoder.cpp +0 -100
  874. data/ext/sources/examples/talk-llama/models/starcoder2.cpp +0 -121
  875. data/ext/sources/examples/talk-llama/models/step35-iswa.cpp +0 -165
  876. data/ext/sources/examples/talk-llama/models/t5-dec.cpp +0 -166
  877. data/ext/sources/examples/talk-llama/models/t5-enc.cpp +0 -96
  878. data/ext/sources/examples/talk-llama/models/wavtokenizer-dec.cpp +0 -149
  879. data/ext/sources/examples/talk-llama/models/xverse.cpp +0 -108
  880. data/ext/sources/examples/talk-llama/prompts/talk-alpaca.txt +0 -23
  881. data/ext/sources/examples/talk-llama/speak +0 -40
  882. data/ext/sources/examples/talk-llama/speak.bat +0 -1
  883. data/ext/sources/examples/talk-llama/speak.ps1 +0 -14
  884. data/ext/sources/examples/talk-llama/talk-llama.cpp +0 -813
  885. data/ext/sources/examples/talk-llama/unicode-data.cpp +0 -7034
  886. data/ext/sources/examples/talk-llama/unicode-data.h +0 -20
  887. data/ext/sources/examples/talk-llama/unicode.cpp +0 -1103
  888. data/ext/sources/examples/talk-llama/unicode.h +0 -111
  889. data/ext/sources/examples/wchess/CMakeLists.txt +0 -10
  890. data/ext/sources/examples/wchess/libwchess/CMakeLists.txt +0 -19
  891. data/ext/sources/examples/wchess/libwchess/Chessboard.cpp +0 -803
  892. data/ext/sources/examples/wchess/libwchess/Chessboard.h +0 -33
  893. data/ext/sources/examples/wchess/libwchess/WChess.cpp +0 -193
  894. data/ext/sources/examples/wchess/libwchess/WChess.h +0 -63
  895. data/ext/sources/examples/wchess/libwchess/test-chessboard.cpp +0 -117
  896. data/ext/sources/examples/wchess/wchess.cmd/CMakeLists.txt +0 -8
  897. data/ext/sources/examples/wchess/wchess.cmd/wchess.cmd.cpp +0 -253
  898. data/ext/sources/examples/whisper.wasm/CMakeLists.txt +0 -50
  899. data/ext/sources/examples/whisper.wasm/emscripten.cpp +0 -118
  900. data/ext/sources/examples/whisper.wasm/index-tmpl.html +0 -659
  901. data/ext/sources/ggml/src/ggml-cuda/template-instances/generate_cu_files.py +0 -99
  902. data/ext/sources/ggml/src/ggml-hexagon/htp/htp-msg.h +0 -155
  903. data/ext/sources/ggml/src/ggml-hexagon/op-desc.h +0 -153
  904. data/ext/sources/ggml/src/ggml-opencl/kernels/embed_kernel.py +0 -26
  905. data/ext/sources/ggml/src/ggml-openvino/openvino/pass/eliminate_zp.cpp +0 -123
  906. data/ext/sources/ggml/src/ggml-openvino/openvino/pass/eliminate_zp.h +0 -17
  907. data/ext/sources/ggml/src/ggml-virtgpu/regenerate_remoting.py +0 -333
  908. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/abs.comp +0 -21
  909. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/ceil.comp +0 -22
  910. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/clamp.comp +0 -17
  911. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/cos.comp +0 -17
  912. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/elu.comp +0 -27
  913. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/exp.comp +0 -21
  914. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/floor.comp +0 -22
  915. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/gelu.comp +0 -25
  916. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/gelu_erf.comp +0 -39
  917. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/gelu_quick.comp +0 -23
  918. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/hardsigmoid.comp +0 -22
  919. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/hardswish.comp +0 -22
  920. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/leaky_relu.comp +0 -22
  921. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/neg.comp +0 -20
  922. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/relu.comp +0 -21
  923. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/round.comp +0 -29
  924. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/rte.glsl +0 -5
  925. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sgn.comp +0 -21
  926. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sigmoid.comp +0 -20
  927. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/silu.comp +0 -22
  928. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sin.comp +0 -17
  929. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/softplus.comp +0 -23
  930. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/sqrt.comp +0 -17
  931. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/square.comp +0 -17
  932. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/step.comp +0 -22
  933. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/tanh.comp +0 -20
  934. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/trunc.comp +0 -22
  935. data/ext/sources/ggml/src/ggml-vulkan/vulkan-shaders/xielu.comp +0 -35
  936. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/embed_wgsl.py +0 -182
  937. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/glu.tmpl.wgsl +0 -323
  938. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/mul_mat.wgsl +0 -718
  939. data/ext/sources/ggml/src/ggml-webgpu/wgsl-shaders/rms_norm.wgsl +0 -123
  940. data/ext/sources/tests/CMakeLists.txt +0 -112
  941. data/ext/sources/tests/earnings21/eval.mk +0 -58
  942. data/ext/sources/tests/earnings21/eval.py +0 -68
  943. data/ext/sources/tests/earnings21/normalizers/__init__.py +0 -2
  944. data/ext/sources/tests/earnings21/normalizers/basic.py +0 -80
  945. data/ext/sources/tests/earnings21/normalizers/english.json +0 -1741
  946. data/ext/sources/tests/earnings21/normalizers/english.py +0 -550
  947. data/ext/sources/tests/earnings21/requirements.txt +0 -6
  948. data/ext/sources/tests/en-0-ref.txt +0 -1
  949. data/ext/sources/tests/en-1-ref.txt +0 -1
  950. data/ext/sources/tests/en-2-ref.txt +0 -1
  951. data/ext/sources/tests/es-0-ref.txt +0 -1
  952. data/ext/sources/tests/librispeech/eval.mk +0 -39
  953. data/ext/sources/tests/librispeech/eval.py +0 -47
  954. data/ext/sources/tests/librispeech/normalizers/__init__.py +0 -2
  955. data/ext/sources/tests/librispeech/normalizers/basic.py +0 -80
  956. data/ext/sources/tests/librispeech/normalizers/english.json +0 -1741
  957. data/ext/sources/tests/librispeech/normalizers/english.py +0 -550
  958. data/ext/sources/tests/librispeech/requirements.txt +0 -6
  959. data/ext/sources/tests/run-tests.sh +0 -130
  960. data/ext/sources/tests/test-c.c +0 -3
  961. data/ext/sources/tests/test-vad-full.cpp +0 -56
  962. data/ext/sources/tests/test-vad.cpp +0 -83
  963. data/ext/sources/tests/test-whisper.js +0 -58
  964. data/lib/whisper/context.rb +0 -15
  965. data/lib/whisper/segment.rb +0 -58
@@ -3,6 +3,13 @@
3
3
  #include "dequantize.hpp"
4
4
  #include "presets.hpp"
5
5
 
6
+ #if defined(__INTEL_LLVM_COMPILER)
7
+ #if __has_include(<sycl/ext/oneapi/bfloat16.hpp>)
8
+ #include <sycl/ext/oneapi/bfloat16.hpp>
9
+ #define GGML_SYCL_DMMV_HAS_BF16
10
+ #endif
11
+ #endif
12
+
6
13
  static void convert_f16(const void * vx, const int64_t ib, const int iqs, dfloat2 & v){
7
14
  const sycl::half *x = (const sycl::half *)vx;
8
15
 
@@ -11,6 +18,16 @@ static void convert_f16(const void * vx, const int64_t ib, const int iqs, dfloat
11
18
  v.y() = x[ib + iqs + 1];
12
19
  }
13
20
 
21
+ #ifdef GGML_SYCL_DMMV_HAS_BF16
22
+ static void convert_bf16(const void * vx, const int64_t ib, const int iqs, dfloat2 & v){
23
+ const sycl::ext::oneapi::bfloat16 *x = (const sycl::ext::oneapi::bfloat16 *)vx;
24
+
25
+ // automatic bfloat16 -> float type cast if dfloat == float
26
+ v.x() = x[ib + iqs + 0];
27
+ v.y() = x[ib + iqs + 1];
28
+ }
29
+ #endif
30
+
14
31
  static void convert_f32(const void * vx, const int64_t ib, const int iqs, dfloat2 & v){
15
32
  const float * x = (const float *) vx;
16
33
 
@@ -217,13 +234,28 @@ static void convert_mul_mat_vec_f16_sycl(const void *vx, const dfloat *y,
217
234
  }
218
235
  }
219
236
 
220
- /*
221
- DPCT1110:4: The total declared local variable size in device function
222
- dequantize_mul_mat_vec_q2_k exceeds 128 bytes and may cause high register
223
- pressure. Consult with your hardware vendor to find the total register size
224
- available and adjust the code, or use smaller sub-group size to avoid high
225
- register pressure.
226
- */
237
+ #ifdef GGML_SYCL_DMMV_HAS_BF16
238
+ static void convert_mul_mat_vec_bf16_sycl(const void *vx, const dfloat *y,
239
+ float *dst, const int ncols,
240
+ const int nrows,
241
+ dpct::queue_ptr stream) {
242
+ // The qk=1 kernel iterates with stride 2*GGML_SYCL_DMMV_X, so ncols must be a
243
+ // multiple of that — not just GGML_SYCL_DMMV_X — to avoid out-of-bounds reads.
244
+ GGML_ASSERT(ncols % (2*GGML_SYCL_DMMV_X) == 0);
245
+ const int block_num_y = (nrows + GGML_SYCL_MMV_Y - 1) / GGML_SYCL_MMV_Y;
246
+ const sycl::range<3> block_nums(1, 1, block_num_y);
247
+ const sycl::range<3> block_dims(1, GGML_SYCL_MMV_Y, WARP_SIZE);
248
+ {
249
+ stream->parallel_for(
250
+ sycl::nd_range<3>(block_nums * block_dims, block_dims),
251
+ [=](sycl::nd_item<3> item_ct1) [[sycl::reqd_sub_group_size(WARP_SIZE)]] {
252
+ dequantize_mul_mat_vec<1, 1, convert_bf16>(vx, y, dst, ncols,
253
+ nrows, item_ct1);
254
+ });
255
+ }
256
+ }
257
+ #endif
258
+
227
259
  static void dequantize_mul_mat_vec_q2_k(const void *__restrict__ vx,
228
260
  const float *__restrict__ yy,
229
261
  float *__restrict__ dst,
@@ -245,19 +277,15 @@ static void dequantize_mul_mat_vec_q2_k(const void *__restrict__ vx,
245
277
 
246
278
  #if QK_K == 256
247
279
  const int tid =
248
- item_ct1.get_local_id(2) / K_QUANTS_PER_ITERATION; // 0...31 or 0...15
280
+ item_ct1.get_local_id(2) / K_QUANTS_PER_ITERATION; // 0...7 or 0...15
249
281
  const int ix =
250
282
  item_ct1.get_local_id(2) % K_QUANTS_PER_ITERATION; // 0 or 0,1
251
283
 
252
284
  const int step = 16/K_QUANTS_PER_ITERATION;
253
285
 
254
- const int im = tid/step; // 0 or 1. 0 computes 0..., 1 computes 128...
255
- const int in = tid - step*im; // 0...15 or 0...7
286
+ const int in = tid % step; // 0...15 or 0...7
256
287
 
257
288
  const int l0 = K_QUANTS_PER_ITERATION*in; // 0...15 or 0...14 in steps of 2
258
- const int q_offset = 32*im + l0;
259
- const int s_offset = 8*im;
260
- const int y_offset = 128*im + l0;
261
289
 
262
290
  uint32_t aux[4];
263
291
  const uint8_t * d = (const uint8_t *)aux;
@@ -265,33 +293,39 @@ static void dequantize_mul_mat_vec_q2_k(const void *__restrict__ vx,
265
293
 
266
294
  for (int i = ix; i < num_blocks_per_row; i += K_QUANTS_PER_ITERATION) {
267
295
 
268
- const float * y = yy + i * QK_K + y_offset;
269
- const uint8_t * q = x[i].qs + q_offset;
270
-
271
296
  const float dall = x[i].dm[0];
272
297
  const float dmin = x[i].dm[1];
273
298
 
274
- const uint32_t * a = (const uint32_t *)(x[i].scales + s_offset);
275
- aux[0] = a[0] & 0x0f0f0f0f;
276
- aux[1] = a[1] & 0x0f0f0f0f;
277
- aux[2] = (a[0] >> 4) & 0x0f0f0f0f;
278
- aux[3] = (a[1] >> 4) & 0x0f0f0f0f;
279
-
280
- float sum1 = 0, sum2 = 0;
281
- for (int l = 0; l < K_QUANTS_PER_ITERATION; ++l) {
282
- sum1 += y[l+ 0] * d[0] * ((q[l+ 0] >> 0) & 3)
283
- + y[l+32] * d[2] * ((q[l+ 0] >> 2) & 3)
284
- + y[l+64] * d[4] * ((q[l+ 0] >> 4) & 3)
285
- + y[l+96] * d[6] * ((q[l+ 0] >> 6) & 3)
286
- + y[l+16] * d[1] * ((q[l+16] >> 0) & 3)
287
- + y[l+48] * d[3] * ((q[l+16] >> 2) & 3)
288
- + y[l+80] * d[5] * ((q[l+16] >> 4) & 3)
289
- +y[l+112] * d[7] * ((q[l+16] >> 6) & 3);
290
- sum2 += y[l+ 0] * m[0] + y[l+32] * m[2] + y[l+64] * m[4] + y[ l+96] * m[6]
291
- + y[l+16] * m[1] + y[l+48] * m[3] + y[l+80] * m[5] + y[l+112] * m[7];
299
+ for (int im = 0; im < 2; ++im) {
300
+ const int q_offset = 32*im + l0;
301
+ const int s_offset = 8*im;
302
+ const int y_offset = 128*im + l0;
303
+
304
+ const float * y = yy + i * QK_K + y_offset;
305
+ const uint8_t * q = x[i].qs + q_offset;
306
+
307
+ const uint32_t * a = (const uint32_t *)(x[i].scales + s_offset);
308
+ aux[0] = a[0] & 0x0f0f0f0f;
309
+ aux[1] = a[1] & 0x0f0f0f0f;
310
+ aux[2] = (a[0] >> 4) & 0x0f0f0f0f;
311
+ aux[3] = (a[1] >> 4) & 0x0f0f0f0f;
312
+
313
+ float sum1 = 0, sum2 = 0;
314
+ for (int l = 0; l < K_QUANTS_PER_ITERATION; ++l) {
315
+ sum1 += y[l+ 0] * d[0] * ((q[l+ 0] >> 0) & 3)
316
+ + y[l+32] * d[2] * ((q[l+ 0] >> 2) & 3)
317
+ + y[l+64] * d[4] * ((q[l+ 0] >> 4) & 3)
318
+ + y[l+96] * d[6] * ((q[l+ 0] >> 6) & 3)
319
+ + y[l+16] * d[1] * ((q[l+16] >> 0) & 3)
320
+ + y[l+48] * d[3] * ((q[l+16] >> 2) & 3)
321
+ + y[l+80] * d[5] * ((q[l+16] >> 4) & 3)
322
+ +y[l+112] * d[7] * ((q[l+16] >> 6) & 3);
323
+ sum2 += y[l+ 0] * m[0] + y[l+32] * m[2] + y[l+64] * m[4] + y[ l+96] * m[6]
324
+ + y[l+16] * m[1] + y[l+48] * m[3] + y[l+80] * m[5] + y[l+112] * m[7];
292
325
 
326
+ }
327
+ tmp += dall * sum1 - dmin * sum2;
293
328
  }
294
- tmp += dall * sum1 - dmin * sum2;
295
329
 
296
330
  }
297
331
  #else
@@ -333,7 +367,7 @@ static void dequantize_mul_mat_vec_q2_k(const void *__restrict__ vx,
333
367
 
334
368
  // sum up partial sums and write back result
335
369
  #pragma unroll
336
- for (int mask = QK_WARP_SIZE / 2; mask > 0; mask >>= 1) {
370
+ for (int mask = WARP_SIZE / 2; mask > 0; mask >>= 1) {
337
371
  tmp +=
338
372
  dpct::permute_sub_group_by_xor(item_ct1.get_sub_group(), tmp, mask);
339
373
  }
@@ -343,13 +377,6 @@ static void dequantize_mul_mat_vec_q2_k(const void *__restrict__ vx,
343
377
  }
344
378
  }
345
379
 
346
- /*
347
- DPCT1110:5: The total declared local variable size in device function
348
- dequantize_mul_mat_vec_q3_k exceeds 128 bytes and may cause high register
349
- pressure. Consult with your hardware vendor to find the total register size
350
- available and adjust the code, or use smaller sub-group size to avoid high
351
- register pressure.
352
- */
353
380
  static void dequantize_mul_mat_vec_q3_k(const void *__restrict__ vx,
354
381
  const float *__restrict__ yy,
355
382
  float *__restrict__ dst,
@@ -373,52 +400,52 @@ static void dequantize_mul_mat_vec_q3_k(const void *__restrict__ vx,
373
400
  const uint16_t kmask2 = 0x0f0f;
374
401
 
375
402
  const int tid =
376
- item_ct1.get_local_id(2) / K_QUANTS_PER_ITERATION; // 0...31 or 0...16
403
+ item_ct1.get_local_id(2) / K_QUANTS_PER_ITERATION; // 0...7 or 0...15
377
404
  const int ix =
378
405
  item_ct1.get_local_id(2) % K_QUANTS_PER_ITERATION; // 0 or 0,1
379
406
 
380
407
  const int n = K_QUANTS_PER_ITERATION; // iterations in the inner loop
381
408
  const int step = 16/K_QUANTS_PER_ITERATION;
382
- const int im = tid/step; // 0 or 1. 0 computes 0..., 1 computes 128...
383
- const int in = tid - step*im; // 0....15 or 0...7
384
-
385
- const uint8_t m = 1 << (4*im);
409
+ const int in = tid % step; // 0...15 or 0...7
386
410
 
387
411
  const int l0 = n*in; // 0...15 or 0...14 in steps of 2
388
- const int q_offset = 32*im + l0;
389
- const int y_offset = 128*im + l0;
390
412
 
391
413
  uint16_t utmp[4];
392
414
  const int8_t * s = (const int8_t *)utmp;
393
415
 
394
- const uint16_t s_shift = 4*im;
395
-
396
416
  for (int i = ix; i < num_blocks_per_row; i += K_QUANTS_PER_ITERATION) {
397
417
 
398
- const float * y = yy + i * QK_K + y_offset;
399
- const uint8_t * q = x[i].qs + q_offset;
400
418
  const uint8_t * h = x[i].hmask + l0;
401
-
402
- const uint16_t * a = (const uint16_t *)x[i].scales;
403
- utmp[0] = ((a[0] >> s_shift) & kmask2) | (((a[4] >> (s_shift + 0)) & kmask1) << 4);
404
- utmp[1] = ((a[1] >> s_shift) & kmask2) | (((a[5] >> (s_shift + 0)) & kmask1) << 4);
405
- utmp[2] = ((a[2] >> s_shift) & kmask2) | (((a[4] >> (s_shift + 2)) & kmask1) << 4);
406
- utmp[3] = ((a[3] >> s_shift) & kmask2) | (((a[5] >> (s_shift + 2)) & kmask1) << 4);
407
-
408
419
  const float d = x[i].d;
409
420
 
410
- float sum = 0;
411
- for (int l = 0; l < n; ++l) {
412
- sum += y[l+ 0] * (s[0] - 32) * (((q[l] >> 0) & 3) - (h[l] & (m << 0) ? 0 : 4))
413
- + y[l+32] * (s[2] - 32) * (((q[l] >> 2) & 3) - (h[l] & (m << 1) ? 0 : 4))
414
- + y[l+64] * (s[4] - 32) * (((q[l] >> 4) & 3) - (h[l] & (m << 2) ? 0 : 4))
415
- + y[l+96] * (s[6] - 32) * (((q[l] >> 6) & 3) - (h[l] & (m << 3) ? 0 : 4));
416
- sum += y[l+16] * (s[1] - 32) * (((q[l+16] >> 0) & 3) - (h[l+16] & (m << 0) ? 0 : 4))
417
- + y[l+48] * (s[3] - 32) * (((q[l+16] >> 2) & 3) - (h[l+16] & (m << 1) ? 0 : 4))
418
- + y[l+80] * (s[5] - 32) * (((q[l+16] >> 4) & 3) - (h[l+16] & (m << 2) ? 0 : 4))
419
- + y[l+112] * (s[7] - 32) * (((q[l+16] >> 6) & 3) - (h[l+16] & (m << 3) ? 0 : 4));
421
+ for (int im = 0; im < 2; ++im) {
422
+ const int q_offset = 32*im + l0;
423
+ const int y_offset = 128*im + l0;
424
+ const uint16_t s_shift = 4*im;
425
+ const uint8_t m = 1 << (4*im);
426
+
427
+ const float * y = yy + i * QK_K + y_offset;
428
+ const uint8_t * q = x[i].qs + q_offset;
429
+
430
+ const uint16_t * a = (const uint16_t *)x[i].scales;
431
+ utmp[0] = ((a[0] >> s_shift) & kmask2) | (((a[4] >> (s_shift + 0)) & kmask1) << 4);
432
+ utmp[1] = ((a[1] >> s_shift) & kmask2) | (((a[5] >> (s_shift + 0)) & kmask1) << 4);
433
+ utmp[2] = ((a[2] >> s_shift) & kmask2) | (((a[4] >> (s_shift + 2)) & kmask1) << 4);
434
+ utmp[3] = ((a[3] >> s_shift) & kmask2) | (((a[5] >> (s_shift + 2)) & kmask1) << 4);
435
+
436
+ float sum = 0;
437
+ for (int l = 0; l < n; ++l) {
438
+ sum += y[l+ 0] * (s[0] - 32) * (((q[l] >> 0) & 3) - (h[l] & (m << 0) ? 0 : 4))
439
+ + y[l+32] * (s[2] - 32) * (((q[l] >> 2) & 3) - (h[l] & (m << 1) ? 0 : 4))
440
+ + y[l+64] * (s[4] - 32) * (((q[l] >> 4) & 3) - (h[l] & (m << 2) ? 0 : 4))
441
+ + y[l+96] * (s[6] - 32) * (((q[l] >> 6) & 3) - (h[l] & (m << 3) ? 0 : 4));
442
+ sum += y[l+16] * (s[1] - 32) * (((q[l+16] >> 0) & 3) - (h[l+16] & (m << 0) ? 0 : 4))
443
+ + y[l+48] * (s[3] - 32) * (((q[l+16] >> 2) & 3) - (h[l+16] & (m << 1) ? 0 : 4))
444
+ + y[l+80] * (s[5] - 32) * (((q[l+16] >> 4) & 3) - (h[l+16] & (m << 2) ? 0 : 4))
445
+ + y[l+112] * (s[7] - 32) * (((q[l+16] >> 6) & 3) - (h[l+16] & (m << 3) ? 0 : 4));
446
+ }
447
+ tmp += d * sum;
420
448
  }
421
- tmp += d * sum;
422
449
 
423
450
  }
424
451
  #else
@@ -452,7 +479,105 @@ static void dequantize_mul_mat_vec_q3_k(const void *__restrict__ vx,
452
479
 
453
480
  // sum up partial sums and write back result
454
481
  #pragma unroll
455
- for (int mask = QK_WARP_SIZE / 2; mask > 0; mask >>= 1) {
482
+ for (int mask = WARP_SIZE / 2; mask > 0; mask >>= 1) {
483
+ tmp +=
484
+ dpct::permute_sub_group_by_xor(item_ct1.get_sub_group(), tmp, mask);
485
+ }
486
+
487
+ if (item_ct1.get_local_id(2) == 0) {
488
+ dst[row] = tmp;
489
+ }
490
+ }
491
+
492
+ static void dequantize_mul_mat_vec_q3_k_reorder(const void *__restrict__ vx,
493
+ const float *__restrict__ yy,
494
+ float *__restrict__ dst,
495
+ const int ncols, int nrows,
496
+ const sycl::nd_item<3> &item_ct1) {
497
+
498
+ const int row = item_ct1.get_group(2) * item_ct1.get_local_range(1) +
499
+ item_ct1.get_local_id(1);
500
+ if (row > nrows) return;
501
+
502
+ const int num_blocks_per_row = ncols / QK_K;
503
+ const int ib0 = row*num_blocks_per_row;
504
+
505
+ // SOA base pointers for the reordered layout:
506
+ // [qs: nb * (QK_K/4)] [hmask: nb * (QK_K/8)] [scales: nb * 12] [d: nb * sizeof(half)]
507
+ const int nb = nrows * num_blocks_per_row;
508
+ const uint8_t * qs_base = (const uint8_t *)vx;
509
+ const uint8_t * hmask_base = qs_base + (size_t)nb * (QK_K / 4);
510
+ const uint8_t * scales_base = hmask_base + (size_t)nb * (QK_K / 8);
511
+ const sycl::half * d_base = (const sycl::half *)(scales_base + (size_t)nb * 12);
512
+
513
+ float tmp = 0; // partial sum for thread in warp
514
+
515
+ #if QK_K == 256
516
+
517
+ const uint16_t kmask1 = 0x0303;
518
+ const uint16_t kmask2 = 0x0f0f;
519
+
520
+ const int tid =
521
+ item_ct1.get_local_id(2) / K_QUANTS_PER_ITERATION; // 0...7 or 0...15
522
+ const int ix =
523
+ item_ct1.get_local_id(2) % K_QUANTS_PER_ITERATION; // 0 or 0,1
524
+
525
+ const int n = K_QUANTS_PER_ITERATION; // iterations in the inner loop
526
+ const int step = 16/K_QUANTS_PER_ITERATION;
527
+ const int in = tid % step; // 0...15 or 0...7
528
+
529
+ const int l0 = n*in; // 0...15 or 0...14 in steps of 2
530
+
531
+ uint16_t utmp[4];
532
+ const int8_t * s = (const int8_t *)utmp;
533
+
534
+ for (int i = ix; i < num_blocks_per_row; i += K_QUANTS_PER_ITERATION) {
535
+ const int bi = ib0 + i;
536
+
537
+ const uint8_t * h = hmask_base + bi * (QK_K / 8) + l0;
538
+
539
+ const float d = d_base[bi];
540
+
541
+ for (int im = 0; im < 2; ++im) {
542
+ const int q_offset = 32*im + l0;
543
+ const int y_offset = 128*im + l0;
544
+ const uint16_t s_shift = 4*im;
545
+ const uint8_t m = 1 << (4*im);
546
+
547
+ const float * y = yy + i * QK_K + y_offset;
548
+ const uint8_t * q = qs_base + bi * (QK_K / 4) + q_offset;
549
+
550
+ const uint16_t * a = (const uint16_t *)(scales_base + bi * 12);
551
+ utmp[0] = ((a[0] >> s_shift) & kmask2) | (((a[4] >> (s_shift + 0)) & kmask1) << 4);
552
+ utmp[1] = ((a[1] >> s_shift) & kmask2) | (((a[5] >> (s_shift + 0)) & kmask1) << 4);
553
+ utmp[2] = ((a[2] >> s_shift) & kmask2) | (((a[4] >> (s_shift + 2)) & kmask1) << 4);
554
+ utmp[3] = ((a[3] >> s_shift) & kmask2) | (((a[5] >> (s_shift + 2)) & kmask1) << 4);
555
+
556
+ float sum = 0;
557
+ for (int l = 0; l < n; ++l) {
558
+ sum += y[l+ 0] * (s[0] - 32) * (((q[l] >> 0) & 3) - (h[l] & (m << 0) ? 0 : 4))
559
+ + y[l+32] * (s[2] - 32) * (((q[l] >> 2) & 3) - (h[l] & (m << 1) ? 0 : 4))
560
+ + y[l+64] * (s[4] - 32) * (((q[l] >> 4) & 3) - (h[l] & (m << 2) ? 0 : 4))
561
+ + y[l+96] * (s[6] - 32) * (((q[l] >> 6) & 3) - (h[l] & (m << 3) ? 0 : 4));
562
+ sum += y[l+16] * (s[1] - 32) * (((q[l+16] >> 0) & 3) - (h[l+16] & (m << 0) ? 0 : 4))
563
+ + y[l+48] * (s[3] - 32) * (((q[l+16] >> 2) & 3) - (h[l+16] & (m << 1) ? 0 : 4))
564
+ + y[l+80] * (s[5] - 32) * (((q[l+16] >> 4) & 3) - (h[l+16] & (m << 2) ? 0 : 4))
565
+ + y[l+112] * (s[7] - 32) * (((q[l+16] >> 6) & 3) - (h[l+16] & (m << 3) ? 0 : 4));
566
+ }
567
+ tmp += d * sum;
568
+ }
569
+ }
570
+ #else
571
+ GGML_UNUSED(vx);
572
+ GGML_UNUSED(yy);
573
+ GGML_UNUSED(ncols);
574
+ GGML_UNUSED(item_ct1);
575
+ GGML_ABORT("Q3_K reorder DMMV not supported for QK_K != 256");
576
+ #endif
577
+
578
+ // sum up partial sums and write back result
579
+ #pragma unroll
580
+ for (int mask = WARP_SIZE / 2; mask > 0; mask >>= 1) {
456
581
  tmp +=
457
582
  dpct::permute_sub_group_by_xor(item_ct1.get_sub_group(), tmp, mask);
458
583
  }
@@ -462,13 +587,6 @@ static void dequantize_mul_mat_vec_q3_k(const void *__restrict__ vx,
462
587
  }
463
588
  }
464
589
 
465
- /*
466
- DPCT1110:6: The total declared local variable size in device function
467
- dequantize_mul_mat_vec_q4_k exceeds 128 bytes and may cause high register
468
- pressure. Consult with your hardware vendor to find the total register size
469
- available and adjust the code, or use smaller sub-group size to avoid high
470
- register pressure.
471
- */
472
590
  static void dequantize_mul_mat_vec_q4_k(const void *__restrict__ vx,
473
591
  const float *__restrict__ yy,
474
592
  float *__restrict__ dst,
@@ -489,22 +607,19 @@ static void dequantize_mul_mat_vec_q4_k(const void *__restrict__ vx,
489
607
  const uint16_t kmask3 = 0xc0c0;
490
608
 
491
609
  const int tid =
492
- item_ct1.get_local_id(2) / K_QUANTS_PER_ITERATION; // 0...31 or 0...16
610
+ item_ct1.get_local_id(2) / K_QUANTS_PER_ITERATION; // 0...7 or 0...15
493
611
  const int ix =
494
612
  item_ct1.get_local_id(2) % K_QUANTS_PER_ITERATION; // 0 or 0,1
495
613
 
496
614
  const int step = 8/K_QUANTS_PER_ITERATION; // 8 or 4
497
615
 
498
- const int il = tid/step; // 0...3
499
- const int ir = tid - step*il; // 0...7 or 0...3
616
+ const int il_base = tid/step; // 0 or 1 (was 0...3)
617
+ const int ir = tid - step*il_base; // 0...7 or 0...3
500
618
  const int n = 2 * K_QUANTS_PER_ITERATION; // 2 or 4
501
619
 
502
- const int im = il/2; // 0 or 1. 0 computes 0,32 + 128,160, 1 computes 64,96 + 192,224
503
- const int in = il%2;
620
+ const int in = il_base%2;
504
621
 
505
622
  const int l0 = n*(2*ir + in);
506
- const int q_offset = 32*im + l0;
507
- const int y_offset = 64*im + l0;
508
623
 
509
624
  uint16_t aux[4];
510
625
  const uint8_t * sc = (const uint8_t *)aux;
@@ -521,55 +636,60 @@ static void dequantize_mul_mat_vec_q4_k(const void *__restrict__ vx,
521
636
 
522
637
  for (int i = ix; i < num_blocks_per_row; i += K_QUANTS_PER_ITERATION) {
523
638
 
524
- const float * y1 = yy + i*QK_K + y_offset;
525
- const float * y2 = y1 + 128;
526
-
527
639
  const float dall = x[i].dm[0];
528
640
  const float dmin = x[i].dm[1];
529
641
 
530
- const uint16_t * a = (const uint16_t *)x[i].scales;
531
- aux[0] = a[im+0] & kmask1;
532
- aux[1] = a[im+2] & kmask1;
533
- aux[2] = ((a[im+4] >> 0) & kmask2) | ((a[im+0] & kmask3) >> 2);
534
- aux[3] = ((a[im+4] >> 4) & kmask2) | ((a[im+2] & kmask3) >> 2);
642
+ for (int im = 0; im < 2; ++im) {
643
+ const int q_offset = 32*im + l0;
644
+ const int y_offset = 64*im + l0;
535
645
 
536
- #if K_QUANTS_PER_ITERATION == 2
537
- const uint32_t * q1 = (const uint32_t *)(x[i].qs + q_offset);
538
- const uint32_t * q2 = q1 + 16;
646
+ const float * y1 = yy + i*QK_K + y_offset;
647
+ const float * y2 = y1 + 128;
539
648
 
540
- q32[0] = q1[0] & 0x0f0f0f0f;
541
- q32[1] = q1[0] & 0xf0f0f0f0;
542
- q32[2] = q2[0] & 0x0f0f0f0f;
543
- q32[3] = q2[0] & 0xf0f0f0f0;
649
+ const uint16_t * a = (const uint16_t *)x[i].scales;
650
+ aux[0] = a[im+0] & kmask1;
651
+ aux[1] = a[im+2] & kmask1;
652
+ aux[2] = ((a[im+4] >> 0) & kmask2) | ((a[im+0] & kmask3) >> 2);
653
+ aux[3] = ((a[im+4] >> 4) & kmask2) | ((a[im+2] & kmask3) >> 2);
544
654
 
545
- sycl::float4 s = {0.f, 0.f, 0.f, 0.f};
546
- float smin = 0;
547
- for (int l = 0; l < 4; ++l) {
548
- s.x() += y1[l] * q4[l + 0]; s.y() += y1[l + 32] * q4[l + 4];
549
- s.z() += y2[l] * q4[l + 8]; s.w() += y2[l + 32] * q4[l + 12];
550
- smin += y1[l] * sc[2] + y1[l+32] * sc[3] + y2[l] * sc[6] + y2[l+32] * sc[7];
551
- }
552
- tmp += dall * (s.x() * sc[0] + s.y() * sc[1] * 1.f / 16.f +
553
- s.z() * sc[4] + s.w() * sc[5] * 1.f / 16.f) -
554
- dmin * smin;
655
+ #if K_QUANTS_PER_ITERATION == 2
656
+ const uint32_t * q1 = (const uint32_t *)(x[i].qs + q_offset);
657
+ const uint32_t * q2 = q1 + 16;
658
+
659
+ q32[0] = q1[0] & 0x0f0f0f0f;
660
+ q32[1] = q1[0] & 0xf0f0f0f0;
661
+ q32[2] = q2[0] & 0x0f0f0f0f;
662
+ q32[3] = q2[0] & 0xf0f0f0f0;
663
+
664
+ sycl::float4 s = {0.f, 0.f, 0.f, 0.f};
665
+ float smin = 0;
666
+ for (int l = 0; l < 4; ++l) {
667
+ s.x() += y1[l] * q4[l + 0]; s.y() += y1[l + 32] * q4[l + 4];
668
+ s.z() += y2[l] * q4[l + 8]; s.w() += y2[l + 32] * q4[l + 12];
669
+ smin += y1[l] * sc[2] + y1[l+32] * sc[3] + y2[l] * sc[6] + y2[l+32] * sc[7];
670
+ }
671
+ tmp += dall * (s.x() * sc[0] + s.y() * sc[1] * 1.f / 16.f +
672
+ s.z() * sc[4] + s.w() * sc[5] * 1.f / 16.f) -
673
+ dmin * smin;
555
674
  #else
556
- const uint16_t * q1 = (const uint16_t *)(x[i].qs + q_offset);
557
- const uint16_t * q2 = q1 + 32;
558
-
559
- q16[0] = q1[0] & 0x0f0f;
560
- q16[1] = q1[0] & 0xf0f0;
561
- q16[2] = q2[0] & 0x0f0f;
562
- q16[3] = q2[0] & 0xf0f0;
563
-
564
- float4 s = {0.f, 0.f, 0.f, 0.f};
565
- float smin = 0;
566
- for (int l = 0; l < 2; ++l) {
567
- s.x += y1[l] * q4[l+0]; s.y += y1[l+32] * q4[l+2];
568
- s.z += y2[l] * q4[l+4]; s.w += y2[l+32] * q4[l+6];
569
- smin += y1[l] * sc[2] + y1[l+32] * sc[3] + y2[l] * sc[6] + y2[l+32] * sc[7];
570
- }
571
- tmp += dall * (s.x * sc[0] + s.y * sc[1] * 1.f/16.f + s.z * sc[4] + s.w * sc[5] * 1.f/16.f) - dmin * smin;
675
+ const uint16_t * q1 = (const uint16_t *)(x[i].qs + q_offset);
676
+ const uint16_t * q2 = q1 + 32;
677
+
678
+ q16[0] = q1[0] & 0x0f0f;
679
+ q16[1] = q1[0] & 0xf0f0;
680
+ q16[2] = q2[0] & 0x0f0f;
681
+ q16[3] = q2[0] & 0xf0f0;
682
+
683
+ sycl::float4 s = {0.f, 0.f, 0.f, 0.f};
684
+ float smin = 0;
685
+ for (int l = 0; l < 2; ++l) {
686
+ s.x() += y1[l] * q4[l+0]; s.y() += y1[l+32] * q4[l+2];
687
+ s.z() += y2[l] * q4[l+4]; s.w() += y2[l+32] * q4[l+6];
688
+ smin += y1[l] * sc[2] + y1[l+32] * sc[3] + y2[l] * sc[6] + y2[l+32] * sc[7];
689
+ }
690
+ tmp += dall * (s.x() * sc[0] + s.y() * sc[1] * 1.f/16.f + s.z() * sc[4] + s.w() * sc[5] * 1.f/16.f) - dmin * smin;
572
691
  #endif
692
+ }
573
693
 
574
694
  }
575
695
  #else
@@ -605,7 +725,165 @@ static void dequantize_mul_mat_vec_q4_k(const void *__restrict__ vx,
605
725
 
606
726
  // sum up partial sums and write back result
607
727
  #pragma unroll
608
- for (int mask = QK_WARP_SIZE / 2; mask > 0; mask >>= 1) {
728
+ for (int mask = WARP_SIZE / 2; mask > 0; mask >>= 1) {
729
+ tmp +=
730
+ dpct::permute_sub_group_by_xor(item_ct1.get_sub_group(), tmp, mask);
731
+ }
732
+
733
+ if (tid == 0) {
734
+ dst[row] = tmp;
735
+ }
736
+ }
737
+
738
+ static void dequantize_mul_mat_vec_q4_k_reorder(const void *__restrict__ vx,
739
+ const float *__restrict__ yy,
740
+ float *__restrict__ dst,
741
+ const int ncols, int nrows,
742
+ const sycl::nd_item<3> &item_ct1) {
743
+
744
+ const int row = item_ct1.get_group(2) * item_ct1.get_local_range(1) +
745
+ item_ct1.get_local_id(1);
746
+ if (row > nrows) return;
747
+ const int num_blocks_per_row = ncols / QK_K;
748
+ const int ib0 = row*num_blocks_per_row;
749
+
750
+ // SOA base pointers for the reordered layout:
751
+ // [qs: nb * QK_K/2] [scales: nb * K_SCALE_SIZE] [dm: nb * sizeof(half2)]
752
+ const int nb = nrows * num_blocks_per_row;
753
+ const uint8_t * qs_base = (const uint8_t *)vx;
754
+ const uint8_t * scales_base = qs_base + (size_t)nb * (QK_K / 2);
755
+ const sycl::half2 * dm_base = (const sycl::half2 *)(scales_base + (size_t)nb * K_SCALE_SIZE);
756
+
757
+ #if QK_K == 256
758
+ const uint16_t kmask1 = 0x3f3f;
759
+ const uint16_t kmask2 = 0x0f0f;
760
+ const uint16_t kmask3 = 0xc0c0;
761
+
762
+ const int tid =
763
+ item_ct1.get_local_id(2) / K_QUANTS_PER_ITERATION; // 0...7 or 0...15
764
+ const int ix =
765
+ item_ct1.get_local_id(2) % K_QUANTS_PER_ITERATION; // 0 or 0,1
766
+
767
+ const int step = 8/K_QUANTS_PER_ITERATION; // 8 or 4
768
+
769
+ const int il_base = tid/step; // 0 or 1 (was 0...3)
770
+ const int ir = tid - step*il_base; // 0...7 or 0...3
771
+ const int n = 2 * K_QUANTS_PER_ITERATION; // 2 or 4
772
+
773
+ const int in = il_base%2;
774
+
775
+ const int l0 = n*(2*ir + in);
776
+
777
+ uint16_t aux[4];
778
+ const uint8_t * sc = (const uint8_t *)aux;
779
+
780
+ #if K_QUANTS_PER_ITERATION == 2
781
+ uint32_t q32[4];
782
+ const uint8_t * q4 = (const uint8_t *)q32;
783
+ #else
784
+ uint16_t q16[4];
785
+ const uint8_t * q4 = (const uint8_t *)q16;
786
+ #endif
787
+
788
+ float tmp = 0; // partial sum for thread in warp
789
+
790
+ for (int i = ix; i < num_blocks_per_row; i += K_QUANTS_PER_ITERATION) {
791
+ const int bi = ib0 + i;
792
+
793
+ const sycl::half2 dm_val = dm_base[bi];
794
+ const float dall = dm_val[0];
795
+ const float dmin = dm_val[1];
796
+
797
+ for (int im = 0; im < 2; ++im) {
798
+ const int q_offset = 32*im + l0;
799
+ const int y_offset = 64*im + l0;
800
+
801
+ const float * y1 = yy + i*QK_K + y_offset;
802
+ const float * y2 = y1 + 128;
803
+
804
+ const uint16_t * a = (const uint16_t *)(scales_base + bi * K_SCALE_SIZE);
805
+ aux[0] = a[im+0] & kmask1;
806
+ aux[1] = a[im+2] & kmask1;
807
+ aux[2] = ((a[im+4] >> 0) & kmask2) | ((a[im+0] & kmask3) >> 2);
808
+ aux[3] = ((a[im+4] >> 4) & kmask2) | ((a[im+2] & kmask3) >> 2);
809
+
810
+ #if K_QUANTS_PER_ITERATION == 2
811
+ const uint32_t * q1 = (const uint32_t *)(qs_base + bi * (QK_K / 2) + q_offset);
812
+ const uint32_t * q2 = q1 + 16;
813
+
814
+ q32[0] = q1[0] & 0x0f0f0f0f;
815
+ q32[1] = q1[0] & 0xf0f0f0f0;
816
+ q32[2] = q2[0] & 0x0f0f0f0f;
817
+ q32[3] = q2[0] & 0xf0f0f0f0;
818
+
819
+ sycl::float4 s = {0.f, 0.f, 0.f, 0.f};
820
+ float smin = 0;
821
+ for (int l = 0; l < 4; ++l) {
822
+ s.x() += y1[l] * q4[l + 0]; s.y() += y1[l + 32] * q4[l + 4];
823
+ s.z() += y2[l] * q4[l + 8]; s.w() += y2[l + 32] * q4[l + 12];
824
+ smin += y1[l] * sc[2] + y1[l+32] * sc[3] + y2[l] * sc[6] + y2[l+32] * sc[7];
825
+ }
826
+ tmp += dall * (s.x() * sc[0] + s.y() * sc[1] * 1.f / 16.f +
827
+ s.z() * sc[4] + s.w() * sc[5] * 1.f / 16.f) -
828
+ dmin * smin;
829
+ #else
830
+ const uint16_t * q1 = (const uint16_t *)(qs_base + bi * (QK_K / 2) + q_offset);
831
+ const uint16_t * q2 = q1 + 32;
832
+
833
+ q16[0] = q1[0] & 0x0f0f;
834
+ q16[1] = q1[0] & 0xf0f0;
835
+ q16[2] = q2[0] & 0x0f0f;
836
+ q16[3] = q2[0] & 0xf0f0;
837
+
838
+ sycl::float4 s = {0.f, 0.f, 0.f, 0.f};
839
+ float smin = 0;
840
+ for (int l = 0; l < 2; ++l) {
841
+ s.x() += y1[l] * q4[l+0]; s.y() += y1[l+32] * q4[l+2];
842
+ s.z() += y2[l] * q4[l+4]; s.w() += y2[l+32] * q4[l+6];
843
+ smin += y1[l] * sc[2] + y1[l+32] * sc[3] + y2[l] * sc[6] + y2[l+32] * sc[7];
844
+ }
845
+ tmp += dall * (s.x() * sc[0] + s.y() * sc[1] * 1.f/16.f + s.z() * sc[4] + s.w() * sc[5] * 1.f/16.f) - dmin * smin;
846
+ #endif
847
+ }
848
+
849
+ }
850
+ #else
851
+ const int tid = item_ct1.get_local_id(2)/(2*K_QUANTS_PER_ITERATION); // 0...15
852
+ const int ix = item_ct1.get_local_id(2)%(2*K_QUANTS_PER_ITERATION);
853
+
854
+ const int step = tid * K_QUANTS_PER_ITERATION;
855
+
856
+ uint16_t aux16[2];
857
+ const uint8_t * s = (const uint8_t *)aux16;
858
+
859
+ float tmp = 0;
860
+
861
+ for (int i = ix; i < num_blocks_per_row; i += 2*K_QUANTS_PER_ITERATION) {
862
+ const int bi = ib0 + i;
863
+
864
+ const uint8_t * q = qs_base + bi * (QK_K / 2) + step;
865
+ const float * y = yy + i*QK_K + step;
866
+ const uint16_t * a = (const uint16_t *)(scales_base + bi * K_SCALE_SIZE);
867
+ aux16[0] = a[0] & 0x0f0f;
868
+ aux16[1] = (a[0] >> 4) & 0x0f0f;
869
+ const sycl::half2 dm_val = dm_base[bi];
870
+ const float d = (float)dm_val[0];
871
+ const float m = (float)dm_val[1];
872
+ float sum = 0.f;
873
+ for (int j = 0; j < K_QUANTS_PER_ITERATION; ++j) {
874
+ sum += y[j+ 0] * (d * s[0] * (q[j+ 0] & 0xF) - m * s[2])
875
+ + y[j+16] * (d * s[0] * (q[j+16] & 0xF) - m * s[2])
876
+ + y[j+32] * (d * s[1] * (q[j+ 0] >> 4) - m * s[3])
877
+ + y[j+48] * (d * s[1] * (q[j+16] >> 4) - m * s[3]);
878
+ }
879
+ tmp += sum;
880
+ }
881
+
882
+ #endif
883
+
884
+ // sum up partial sums and write back result
885
+ #pragma unroll
886
+ for (int mask = WARP_SIZE / 2; mask > 0; mask >>= 1) {
609
887
  tmp +=
610
888
  dpct::permute_sub_group_by_xor(item_ct1.get_sub_group(), tmp, mask);
611
889
  }
@@ -615,13 +893,6 @@ static void dequantize_mul_mat_vec_q4_k(const void *__restrict__ vx,
615
893
  }
616
894
  }
617
895
 
618
- /*
619
- DPCT1110:7: The total declared local variable size in device function
620
- dequantize_mul_mat_vec_q5_k exceeds 128 bytes and may cause high register
621
- pressure. Consult with your hardware vendor to find the total register size
622
- available and adjust the code, or use smaller sub-group size to avoid high
623
- register pressure.
624
- */
625
896
  static void dequantize_mul_mat_vec_q5_k(const void *__restrict__ vx,
626
897
  const float *__restrict__ yy,
627
898
  float *__restrict__ dst,
@@ -641,22 +912,16 @@ static void dequantize_mul_mat_vec_q5_k(const void *__restrict__ vx,
641
912
  const uint16_t kmask2 = 0x0f0f;
642
913
  const uint16_t kmask3 = 0xc0c0;
643
914
 
644
- const int tid = item_ct1.get_local_id(2) / 2; // 0...15
915
+ const int tid = item_ct1.get_local_id(2) / 2; // 0...7
645
916
  const int ix = item_ct1.get_local_id(2) % 2;
646
917
 
647
- const int il = tid/4; // 0...3
648
- const int ir = tid - 4*il;// 0...3
918
+ const int il_base = tid/4; // 0 or 1 (was 0...3)
919
+ const int ir = tid - 4*il_base;// 0...3
649
920
  const int n = 2;
650
921
 
651
- const int im = il/2; // 0 or 1. 0 computes 0,32 + 128,160, 1 computes 64,96 + 192,224
652
- const int in = il%2;
922
+ const int in = il_base%2;
653
923
 
654
924
  const int l0 = n*(2*ir + in);
655
- const int q_offset = 32*im + l0;
656
- const int y_offset = 64*im + l0;
657
-
658
- const uint8_t hm1 = 1 << (2*im);
659
- const uint8_t hm2 = hm1 << 4;
660
925
 
661
926
  uint16_t aux[4];
662
927
  const uint8_t * sc = (const uint8_t *)aux;
@@ -666,51 +931,59 @@ static void dequantize_mul_mat_vec_q5_k(const void *__restrict__ vx,
666
931
 
667
932
  for (int i = ix; i < num_blocks_per_row; i += 2) {
668
933
 
669
- const uint8_t * ql1 = x[i].qs + q_offset;
670
934
  const uint8_t * qh = x[i].qh + l0;
671
- const float * y1 = yy + i*QK_K + y_offset;
672
- const float * y2 = y1 + 128;
673
-
674
935
  const float dall = x[i].dm[0];
675
936
  const float dmin = x[i].dm[1];
676
937
 
677
- const uint16_t * a = (const uint16_t *)x[i].scales;
678
- aux[0] = a[im+0] & kmask1;
679
- aux[1] = a[im+2] & kmask1;
680
- aux[2] = ((a[im+4] >> 0) & kmask2) | ((a[im+0] & kmask3) >> 2);
681
- aux[3] = ((a[im+4] >> 4) & kmask2) | ((a[im+2] & kmask3) >> 2);
682
-
683
- sycl::float4 sum = {0.f, 0.f, 0.f, 0.f};
684
- float smin = 0;
685
- const uint16_t * q1 = (const uint16_t *)ql1;
686
- const uint16_t * q2 = q1 + 32;
687
- q16[0] = q1[0] & 0x0f0f;
688
- q16[1] = q1[8] & 0x0f0f;
689
- q16[2] = (q1[0] >> 4) & 0x0f0f;
690
- q16[3] = (q1[8] >> 4) & 0x0f0f;
691
- q16[4] = q2[0] & 0x0f0f;
692
- q16[5] = q2[8] & 0x0f0f;
693
- q16[6] = (q2[0] >> 4) & 0x0f0f;
694
- q16[7] = (q2[8] >> 4) & 0x0f0f;
695
- for (int l = 0; l < n; ++l) {
696
- sum.x() +=
697
- y1[l + 0] * (q4[l + 0] + (qh[l + 0] & (hm1 << 0) ? 16 : 0)) +
698
- y1[l + 16] * (q4[l + 2] + (qh[l + 16] & (hm1 << 0) ? 16 : 0));
699
- sum.y() +=
700
- y1[l + 32] * (q4[l + 4] + (qh[l + 0] & (hm1 << 1) ? 16 : 0)) +
701
- y1[l + 48] * (q4[l + 6] + (qh[l + 16] & (hm1 << 1) ? 16 : 0));
702
- sum.z() +=
703
- y2[l + 0] * (q4[l + 8] + (qh[l + 0] & (hm2 << 0) ? 16 : 0)) +
704
- y2[l + 16] * (q4[l + 10] + (qh[l + 16] & (hm2 << 0) ? 16 : 0));
705
- sum.w() +=
706
- y2[l + 32] * (q4[l + 12] + (qh[l + 0] & (hm2 << 1) ? 16 : 0)) +
707
- y2[l + 48] * (q4[l + 14] + (qh[l + 16] & (hm2 << 1) ? 16 : 0));
708
- smin += (y1[l] + y1[l+16]) * sc[2] + (y1[l+32] + y1[l+48]) * sc[3]
709
- + (y2[l] + y2[l+16]) * sc[6] + (y2[l+32] + y2[l+48]) * sc[7];
938
+ for (int im = 0; im < 2; ++im) {
939
+ const int q_offset = 32*im + l0;
940
+ const int y_offset = 64*im + l0;
941
+
942
+ const uint8_t hm1 = 1 << (2*im);
943
+ const uint8_t hm2 = hm1 << 4;
944
+
945
+ const uint8_t * ql1 = x[i].qs + q_offset;
946
+ const float * y1 = yy + i*QK_K + y_offset;
947
+ const float * y2 = y1 + 128;
948
+
949
+ const uint16_t * a = (const uint16_t *)x[i].scales;
950
+ aux[0] = a[im+0] & kmask1;
951
+ aux[1] = a[im+2] & kmask1;
952
+ aux[2] = ((a[im+4] >> 0) & kmask2) | ((a[im+0] & kmask3) >> 2);
953
+ aux[3] = ((a[im+4] >> 4) & kmask2) | ((a[im+2] & kmask3) >> 2);
954
+
955
+ sycl::float4 sum = {0.f, 0.f, 0.f, 0.f};
956
+ float smin = 0;
957
+ const uint16_t * q1 = (const uint16_t *)ql1;
958
+ const uint16_t * q2 = q1 + 32;
959
+ q16[0] = q1[0] & 0x0f0f;
960
+ q16[1] = q1[8] & 0x0f0f;
961
+ q16[2] = (q1[0] >> 4) & 0x0f0f;
962
+ q16[3] = (q1[8] >> 4) & 0x0f0f;
963
+ q16[4] = q2[0] & 0x0f0f;
964
+ q16[5] = q2[8] & 0x0f0f;
965
+ q16[6] = (q2[0] >> 4) & 0x0f0f;
966
+ q16[7] = (q2[8] >> 4) & 0x0f0f;
967
+ for (int l = 0; l < n; ++l) {
968
+ sum.x() +=
969
+ y1[l + 0] * (q4[l + 0] + (qh[l + 0] & (hm1 << 0) ? 16 : 0)) +
970
+ y1[l + 16] * (q4[l + 2] + (qh[l + 16] & (hm1 << 0) ? 16 : 0));
971
+ sum.y() +=
972
+ y1[l + 32] * (q4[l + 4] + (qh[l + 0] & (hm1 << 1) ? 16 : 0)) +
973
+ y1[l + 48] * (q4[l + 6] + (qh[l + 16] & (hm1 << 1) ? 16 : 0));
974
+ sum.z() +=
975
+ y2[l + 0] * (q4[l + 8] + (qh[l + 0] & (hm2 << 0) ? 16 : 0)) +
976
+ y2[l + 16] * (q4[l + 10] + (qh[l + 16] & (hm2 << 0) ? 16 : 0));
977
+ sum.w() +=
978
+ y2[l + 32] * (q4[l + 12] + (qh[l + 0] & (hm2 << 1) ? 16 : 0)) +
979
+ y2[l + 48] * (q4[l + 14] + (qh[l + 16] & (hm2 << 1) ? 16 : 0));
980
+ smin += (y1[l] + y1[l+16]) * sc[2] + (y1[l+32] + y1[l+48]) * sc[3]
981
+ + (y2[l] + y2[l+16]) * sc[6] + (y2[l+32] + y2[l+48]) * sc[7];
982
+ }
983
+ tmp += dall * (sum.x() * sc[0] + sum.y() * sc[1] + sum.z() * sc[4] +
984
+ sum.w() * sc[5]) -
985
+ dmin * smin;
710
986
  }
711
- tmp += dall * (sum.x() * sc[0] + sum.y() * sc[1] + sum.z() * sc[4] +
712
- sum.w() * sc[5]) -
713
- dmin * smin;
714
987
  }
715
988
 
716
989
  #else
@@ -739,7 +1012,7 @@ static void dequantize_mul_mat_vec_q5_k(const void *__restrict__ vx,
739
1012
 
740
1013
  // sum up partial sums and write back result
741
1014
  #pragma unroll
742
- for (int mask = QK_WARP_SIZE / 2; mask > 0; mask >>= 1) {
1015
+ for (int mask = WARP_SIZE / 2; mask > 0; mask >>= 1) {
743
1016
  tmp +=
744
1017
  dpct::permute_sub_group_by_xor(item_ct1.get_sub_group(), tmp, mask);
745
1018
  }
@@ -749,31 +1022,144 @@ static void dequantize_mul_mat_vec_q5_k(const void *__restrict__ vx,
749
1022
  }
750
1023
  }
751
1024
 
752
- static void dequantize_mul_mat_vec_q6_k(const void * __restrict__ vx, const float * __restrict__ yy, float * __restrict__ dst, const int ncols, int nrows,
753
- const sycl::nd_item<3> &item_ct1) {
754
-
755
- static_assert(16%K_QUANTS_PER_ITERATION == 0, "16 must be divisible by K_QUANTS_PER_ITERATION");
756
-
757
- const int row = item_ct1.get_group(2) * item_ct1.get_local_range(1) +
758
- item_ct1.get_local_id(1);
759
- if (row > nrows) return;
1025
+ static void dequantize_mul_mat_vec_q5_k_reorder(const void *__restrict__ vx,
1026
+ const float *__restrict__ yy,
1027
+ float *__restrict__ dst,
1028
+ const int ncols, int nrows,
1029
+ const sycl::nd_item<3> &item_ct1) {
760
1030
 
1031
+ const int row = item_ct1.get_group(2);
761
1032
  const int num_blocks_per_row = ncols / QK_K;
762
1033
  const int ib0 = row*num_blocks_per_row;
763
1034
 
764
- const block_q6_K * x = (const block_q6_K *)vx + ib0;
1035
+ // SOA base pointers for the reordered layout:
1036
+ // [qs: nb * QK_K/2] [qh: nb * QK_K/8] [scales: nb * K_SCALE_SIZE] [dm: nb * sizeof(half2)]
1037
+ const int nb = nrows * num_blocks_per_row;
1038
+ const uint8_t * qs_base = (const uint8_t *)vx;
1039
+ const uint8_t * qh_base = qs_base + (size_t)nb * (QK_K / 2);
1040
+ const uint8_t * scales_base = qh_base + (size_t)nb * (QK_K / 8);
1041
+ const sycl::half2 * dm_base = (const sycl::half2 *)(scales_base + (size_t)nb * K_SCALE_SIZE);
765
1042
 
766
- #if QK_K == 256
1043
+ float tmp = 0; // partial sum for thread in warp
1044
+
1045
+ #if QK_K == 256
1046
+ const uint16_t kmask1 = 0x3f3f;
1047
+ const uint16_t kmask2 = 0x0f0f;
1048
+ const uint16_t kmask3 = 0xc0c0;
1049
+
1050
+ const int tid = item_ct1.get_local_id(2) / 2; // 0...15
1051
+ const int ix = item_ct1.get_local_id(2) % 2;
1052
+
1053
+ const int il = tid/4; // 0...3
1054
+ const int ir = tid - 4*il;// 0...3
1055
+ const int n = 2;
1056
+
1057
+ const int im = il/2; // 0 or 1. 0 computes 0,32 + 128,160, 1 computes 64,96 + 192,224
1058
+ const int in = il%2;
1059
+
1060
+ const int l0 = n*(2*ir + in);
1061
+ const int q_offset = 32*im + l0;
1062
+ const int y_offset = 64*im + l0;
1063
+
1064
+ const uint8_t hm1 = 1 << (2*im);
1065
+ const uint8_t hm2 = hm1 << 4;
1066
+
1067
+ uint16_t aux[4];
1068
+ const uint8_t * sc = (const uint8_t *)aux;
1069
+
1070
+ uint16_t q16[8];
1071
+ const uint8_t * q4 = (const uint8_t *)q16;
1072
+
1073
+ for (int i = ix; i < num_blocks_per_row; i += 2) {
1074
+ const int bi = ib0 + i;
1075
+
1076
+ const uint8_t * ql1 = qs_base + bi * (QK_K / 2) + q_offset;
1077
+ const uint8_t * qh = qh_base + bi * (QK_K / 8) + l0;
1078
+ const float * y1 = yy + i*QK_K + y_offset;
1079
+ const float * y2 = y1 + 128;
1080
+
1081
+ const sycl::half2 dm_val = dm_base[bi];
1082
+ const float dall = dm_val[0];
1083
+ const float dmin = dm_val[1];
1084
+
1085
+ const uint16_t * a = (const uint16_t *)(scales_base + bi * K_SCALE_SIZE);
1086
+ aux[0] = a[im+0] & kmask1;
1087
+ aux[1] = a[im+2] & kmask1;
1088
+ aux[2] = ((a[im+4] >> 0) & kmask2) | ((a[im+0] & kmask3) >> 2);
1089
+ aux[3] = ((a[im+4] >> 4) & kmask2) | ((a[im+2] & kmask3) >> 2);
1090
+
1091
+ sycl::float4 sum = {0.f, 0.f, 0.f, 0.f};
1092
+ float smin = 0;
1093
+ const uint16_t * q1 = (const uint16_t *)ql1;
1094
+ const uint16_t * q2 = q1 + 32;
1095
+ q16[0] = q1[0] & 0x0f0f;
1096
+ q16[1] = q1[8] & 0x0f0f;
1097
+ q16[2] = (q1[0] >> 4) & 0x0f0f;
1098
+ q16[3] = (q1[8] >> 4) & 0x0f0f;
1099
+ q16[4] = q2[0] & 0x0f0f;
1100
+ q16[5] = q2[8] & 0x0f0f;
1101
+ q16[6] = (q2[0] >> 4) & 0x0f0f;
1102
+ q16[7] = (q2[8] >> 4) & 0x0f0f;
1103
+ for (int l = 0; l < n; ++l) {
1104
+ sum.x() +=
1105
+ y1[l + 0] * (q4[l + 0] + (qh[l + 0] & (hm1 << 0) ? 16 : 0)) +
1106
+ y1[l + 16] * (q4[l + 2] + (qh[l + 16] & (hm1 << 0) ? 16 : 0));
1107
+ sum.y() +=
1108
+ y1[l + 32] * (q4[l + 4] + (qh[l + 0] & (hm1 << 1) ? 16 : 0)) +
1109
+ y1[l + 48] * (q4[l + 6] + (qh[l + 16] & (hm1 << 1) ? 16 : 0));
1110
+ sum.z() +=
1111
+ y2[l + 0] * (q4[l + 8] + (qh[l + 0] & (hm2 << 0) ? 16 : 0)) +
1112
+ y2[l + 16] * (q4[l + 10] + (qh[l + 16] & (hm2 << 0) ? 16 : 0));
1113
+ sum.w() +=
1114
+ y2[l + 32] * (q4[l + 12] + (qh[l + 0] & (hm2 << 1) ? 16 : 0)) +
1115
+ y2[l + 48] * (q4[l + 14] + (qh[l + 16] & (hm2 << 1) ? 16 : 0));
1116
+ smin += (y1[l] + y1[l+16]) * sc[2] + (y1[l+32] + y1[l+48]) * sc[3]
1117
+ + (y2[l] + y2[l+16]) * sc[6] + (y2[l+32] + y2[l+48]) * sc[7];
1118
+ }
1119
+ tmp += dall * (sum.x() * sc[0] + sum.y() * sc[1] + sum.z() * sc[4] +
1120
+ sum.w() * sc[5]) -
1121
+ dmin * smin;
1122
+ }
1123
+ #else
1124
+ // The reordered Q5_K layout is only produced for QK_K == 256.
1125
+ #endif
1126
+
1127
+ // sum up partial sums and write back result
1128
+ #pragma unroll
1129
+ for (int mask = WARP_SIZE / 2; mask > 0; mask >>= 1) {
1130
+ tmp +=
1131
+ dpct::permute_sub_group_by_xor(item_ct1.get_sub_group(), tmp, mask);
1132
+ }
1133
+
1134
+ if (item_ct1.get_local_id(2) == 0) {
1135
+ dst[row] = tmp;
1136
+ }
1137
+ }
1138
+
1139
+ static void dequantize_mul_mat_vec_q6_k(const void * __restrict__ vx, const float * __restrict__ yy, float * __restrict__ dst, const int ncols, int nrows,
1140
+ const sycl::nd_item<3> &item_ct1) {
1141
+
1142
+ static_assert(16%K_QUANTS_PER_ITERATION == 0, "16 must be divisible by K_QUANTS_PER_ITERATION");
1143
+
1144
+ const int row = item_ct1.get_group(2) * item_ct1.get_local_range(1) +
1145
+ item_ct1.get_local_id(1);
1146
+ if (row > nrows) return;
1147
+
1148
+ const int num_blocks_per_row = ncols / QK_K;
1149
+ const int ib0 = row*num_blocks_per_row;
1150
+
1151
+ const block_q6_K * x = (const block_q6_K *)vx + ib0;
1152
+
1153
+ #if QK_K == 256
767
1154
 
768
1155
  const int tid =
769
- item_ct1.get_local_id(2) / K_QUANTS_PER_ITERATION; // 0...31 or 0...16
1156
+ item_ct1.get_local_id(2) / K_QUANTS_PER_ITERATION; // 0...7 or 0...15
770
1157
  const int ix =
771
1158
  item_ct1.get_local_id(2) % K_QUANTS_PER_ITERATION; // 0 or 0, 1
772
1159
 
773
1160
  const int step = 16/K_QUANTS_PER_ITERATION; // 16 or 8
774
1161
 
775
- const int im = tid/step; // 0 or 1. 0 computes 0..., 1 computes 128...
776
- const int in = tid - step*im; // 0...15 or 0...7
1162
+ const int in = tid % step; // 0...15 or 0...7
777
1163
 
778
1164
  #if K_QUANTS_PER_ITERATION == 1
779
1165
  const int l0 = K_QUANTS_PER_ITERATION*in; // 0...15
@@ -782,42 +1168,45 @@ static void dequantize_mul_mat_vec_q6_k(const void * __restrict__ vx, const floa
782
1168
  const int l0 = 4 * in; // 0, 4, 8, ..., 28
783
1169
  const int is = in / 4;
784
1170
  #endif
785
- const int ql_offset = 64*im + l0;
786
- const int qh_offset = 32*im + l0;
787
- const int s_offset = 8*im + is;
788
- const int y_offset = 128*im + l0;
789
1171
 
790
1172
  float tmp = 0; // partial sum for thread in warp
791
1173
 
792
1174
  for (int i = ix; i < num_blocks_per_row; i += K_QUANTS_PER_ITERATION) {
793
1175
 
794
- const float * y = yy + i * QK_K + y_offset;
795
- const uint8_t * ql = x[i].ql + ql_offset;
796
- const uint8_t * qh = x[i].qh + qh_offset;
797
- const int8_t * s = x[i].scales + s_offset;
798
-
799
1176
  const float d = x[i].d;
800
1177
 
1178
+ for (int im = 0; im < 2; ++im) {
1179
+ const int ql_offset = 64*im + l0;
1180
+ const int qh_offset = 32*im + l0;
1181
+ const int s_offset = 8*im + is;
1182
+ const int y_offset = 128*im + l0;
1183
+
1184
+ const float * y = yy + i * QK_K + y_offset;
1185
+ const uint8_t * ql = x[i].ql + ql_offset;
1186
+ const uint8_t * qh = x[i].qh + qh_offset;
1187
+ const int8_t * s = x[i].scales + s_offset;
1188
+
801
1189
  #if K_QUANTS_PER_ITERATION == 1
802
- float sum = y[ 0] * s[0] * d * ((int8_t)((ql[ 0] & 0xF) | ((qh[ 0] & 0x03) << 4)) - 32)
803
- + y[16] * s[1] * d * ((int8_t)((ql[16] & 0xF) | ((qh[16] & 0x03) << 4)) - 32)
804
- + y[32] * s[2] * d * ((int8_t)((ql[32] & 0xF) | ((qh[ 0] & 0x0c) << 2)) - 32)
805
- + y[48] * s[3] * d * ((int8_t)((ql[48] & 0xF) | ((qh[16] & 0x0c) << 2)) - 32)
806
- + y[64] * s[4] * d * ((int8_t)((ql[ 0] >> 4) | ((qh[ 0] & 0x30) >> 0)) - 32)
807
- + y[80] * s[5] * d * ((int8_t)((ql[16] >> 4) | ((qh[16] & 0x30) >> 0)) - 32)
808
- + y[96] * s[6] * d * ((int8_t)((ql[32] >> 4) | ((qh[ 0] & 0xc0) >> 2)) - 32)
809
- +y[112] * s[7] * d * ((int8_t)((ql[48] >> 4) | ((qh[16] & 0xc0) >> 2)) - 32);
810
- tmp += sum;
1190
+ float sum = y[ 0] * s[0] * d * ((int8_t)((ql[ 0] & 0xF) | ((qh[ 0] & 0x03) << 4)) - 32)
1191
+ + y[16] * s[1] * d * ((int8_t)((ql[16] & 0xF) | ((qh[16] & 0x03) << 4)) - 32)
1192
+ + y[32] * s[2] * d * ((int8_t)((ql[32] & 0xF) | ((qh[ 0] & 0x0c) << 2)) - 32)
1193
+ + y[48] * s[3] * d * ((int8_t)((ql[48] & 0xF) | ((qh[16] & 0x0c) << 2)) - 32)
1194
+ + y[64] * s[4] * d * ((int8_t)((ql[ 0] >> 4) | ((qh[ 0] & 0x30) >> 0)) - 32)
1195
+ + y[80] * s[5] * d * ((int8_t)((ql[16] >> 4) | ((qh[16] & 0x30) >> 0)) - 32)
1196
+ + y[96] * s[6] * d * ((int8_t)((ql[32] >> 4) | ((qh[ 0] & 0xc0) >> 2)) - 32)
1197
+ +y[112] * s[7] * d * ((int8_t)((ql[48] >> 4) | ((qh[16] & 0xc0) >> 2)) - 32);
1198
+ tmp += sum;
811
1199
  #else
812
- float sum = 0;
813
- for (int l = 0; l < 4; ++l) {
814
- sum += y[l+ 0] * s[0] * d * ((int8_t)((ql[l+ 0] & 0xF) | (((qh[l] >> 0) & 3) << 4)) - 32)
815
- + y[l+32] * s[2] * d * ((int8_t)((ql[l+32] & 0xF) | (((qh[l] >> 2) & 3) << 4)) - 32)
816
- + y[l+64] * s[4] * d * ((int8_t)((ql[l+ 0] >> 4) | (((qh[l] >> 4) & 3) << 4)) - 32)
817
- + y[l+96] * s[6] * d * ((int8_t)((ql[l+32] >> 4) | (((qh[l] >> 6) & 3) << 4)) - 32);
818
- }
819
- tmp += sum;
1200
+ float sum = 0;
1201
+ for (int l = 0; l < 4; ++l) {
1202
+ sum += y[l+ 0] * s[0] * d * ((int8_t)((ql[l+ 0] & 0xF) | (((qh[l] >> 0) & 3) << 4)) - 32)
1203
+ + y[l+32] * s[2] * d * ((int8_t)((ql[l+32] & 0xF) | (((qh[l] >> 2) & 3) << 4)) - 32)
1204
+ + y[l+64] * s[4] * d * ((int8_t)((ql[l+ 0] >> 4) | (((qh[l] >> 4) & 3) << 4)) - 32)
1205
+ + y[l+96] * s[6] * d * ((int8_t)((ql[l+32] >> 4) | (((qh[l] >> 6) & 3) << 4)) - 32);
1206
+ }
1207
+ tmp += sum;
820
1208
  #endif
1209
+ }
821
1210
 
822
1211
  }
823
1212
 
@@ -854,7 +1243,132 @@ static void dequantize_mul_mat_vec_q6_k(const void * __restrict__ vx, const floa
854
1243
 
855
1244
  // sum up partial sums and write back result
856
1245
  #pragma unroll
857
- for (int mask = QK_WARP_SIZE / 2; mask > 0; mask >>= 1) {
1246
+ for (int mask = WARP_SIZE / 2; mask > 0; mask >>= 1) {
1247
+ tmp +=
1248
+ dpct::permute_sub_group_by_xor(item_ct1.get_sub_group(), tmp, mask);
1249
+ }
1250
+
1251
+ if (tid == 0) {
1252
+ dst[row] = tmp;
1253
+ }
1254
+ }
1255
+
1256
+ static void dequantize_mul_mat_vec_q6_k_reorder(const void * __restrict__ vx, const float * __restrict__ yy, float * __restrict__ dst, const int ncols, int nrows,
1257
+ const sycl::nd_item<3> &item_ct1) {
1258
+
1259
+ static_assert(16%K_QUANTS_PER_ITERATION == 0, "16 must be divisible by K_QUANTS_PER_ITERATION");
1260
+
1261
+ const int row = item_ct1.get_group(2) * item_ct1.get_local_range(1) +
1262
+ item_ct1.get_local_id(1);
1263
+ if (row > nrows) return;
1264
+
1265
+ const int num_blocks_per_row = ncols / QK_K;
1266
+ const int ib0 = row*num_blocks_per_row;
1267
+
1268
+ // SOA base pointers for the reordered layout:
1269
+ // [ql: nb * QK_K/2] [qh: nb * QK_K/4] [scales: nb * QK_K/16] [d: nb * sizeof(half)]
1270
+ const int nb = nrows * num_blocks_per_row;
1271
+ const uint8_t * ql_base = (const uint8_t *)vx;
1272
+ const uint8_t * qh_base = ql_base + (size_t)nb * (QK_K / 2);
1273
+ const int8_t * scales_base = (const int8_t *)(qh_base + (size_t)nb * (QK_K / 4));
1274
+ const sycl::half * d_base = (const sycl::half *)((const uint8_t *)scales_base + (size_t)nb * (QK_K / 16));
1275
+
1276
+ #if QK_K == 256
1277
+
1278
+ const int tid =
1279
+ item_ct1.get_local_id(2) / K_QUANTS_PER_ITERATION; // 0...7 or 0...15
1280
+ const int ix =
1281
+ item_ct1.get_local_id(2) % K_QUANTS_PER_ITERATION; // 0 or 0, 1
1282
+
1283
+ const int step = 16/K_QUANTS_PER_ITERATION; // 16 or 8
1284
+
1285
+ const int in = tid % step; // 0...15 or 0...7
1286
+
1287
+ #if K_QUANTS_PER_ITERATION == 1
1288
+ const int l0 = K_QUANTS_PER_ITERATION*in; // 0...15
1289
+ const int is = 0;
1290
+ #else
1291
+ const int l0 = 4 * in; // 0, 4, 8, ..., 28
1292
+ const int is = in / 4;
1293
+ #endif
1294
+
1295
+ float tmp = 0; // partial sum for thread in warp
1296
+
1297
+ for (int i = ix; i < num_blocks_per_row; i += K_QUANTS_PER_ITERATION) {
1298
+ const int bi = ib0 + i;
1299
+
1300
+ const float d = d_base[bi];
1301
+
1302
+ for (int im = 0; im < 2; ++im) {
1303
+ const int ql_offset = 64*im + l0;
1304
+ const int qh_offset = 32*im + l0;
1305
+ const int s_offset = 8*im + is;
1306
+ const int y_offset = 128*im + l0;
1307
+
1308
+ const float * y = yy + i * QK_K + y_offset;
1309
+ const uint8_t * ql = ql_base + bi * (QK_K / 2) + ql_offset;
1310
+ const uint8_t * qh = qh_base + bi * (QK_K / 4) + qh_offset;
1311
+ const int8_t * s = scales_base + bi * (QK_K / 16) + s_offset;
1312
+
1313
+ #if K_QUANTS_PER_ITERATION == 1
1314
+ float sum = y[ 0] * s[0] * d * ((int8_t)((ql[ 0] & 0xF) | ((qh[ 0] & 0x03) << 4)) - 32)
1315
+ + y[16] * s[1] * d * ((int8_t)((ql[16] & 0xF) | ((qh[16] & 0x03) << 4)) - 32)
1316
+ + y[32] * s[2] * d * ((int8_t)((ql[32] & 0xF) | ((qh[ 0] & 0x0c) << 2)) - 32)
1317
+ + y[48] * s[3] * d * ((int8_t)((ql[48] & 0xF) | ((qh[16] & 0x0c) << 2)) - 32)
1318
+ + y[64] * s[4] * d * ((int8_t)((ql[ 0] >> 4) | ((qh[ 0] & 0x30) >> 0)) - 32)
1319
+ + y[80] * s[5] * d * ((int8_t)((ql[16] >> 4) | ((qh[16] & 0x30) >> 0)) - 32)
1320
+ + y[96] * s[6] * d * ((int8_t)((ql[32] >> 4) | ((qh[ 0] & 0xc0) >> 2)) - 32)
1321
+ +y[112] * s[7] * d * ((int8_t)((ql[48] >> 4) | ((qh[16] & 0xc0) >> 2)) - 32);
1322
+ tmp += sum;
1323
+ #else
1324
+ float sum = 0;
1325
+ for (int l = 0; l < 4; ++l) {
1326
+ sum += y[l+ 0] * s[0] * d * ((int8_t)((ql[l+ 0] & 0xF) | (((qh[l] >> 0) & 3) << 4)) - 32)
1327
+ + y[l+32] * s[2] * d * ((int8_t)((ql[l+32] & 0xF) | (((qh[l] >> 2) & 3) << 4)) - 32)
1328
+ + y[l+64] * s[4] * d * ((int8_t)((ql[l+ 0] >> 4) | (((qh[l] >> 4) & 3) << 4)) - 32)
1329
+ + y[l+96] * s[6] * d * ((int8_t)((ql[l+32] >> 4) | (((qh[l] >> 6) & 3) << 4)) - 32);
1330
+ }
1331
+ tmp += sum;
1332
+ #endif
1333
+ }
1334
+
1335
+ }
1336
+
1337
+ #else
1338
+
1339
+ const int tid = item_ct1.get_local_id(2)/(2*K_QUANTS_PER_ITERATION); // 0...7
1340
+ const int ix = item_ct1.get_local_id(2)%(2*K_QUANTS_PER_ITERATION); // 0...3
1341
+
1342
+ const int step = tid * K_QUANTS_PER_ITERATION;
1343
+
1344
+ float tmp = 0; // partial sum for thread in warp
1345
+
1346
+ for (int i = ix; i < num_blocks_per_row; i += 2*K_QUANTS_PER_ITERATION) {
1347
+ const int bi = ib0 + i;
1348
+
1349
+ const float * y = yy + i * QK_K + step;
1350
+ const uint8_t * ql = ql_base + bi * (QK_K / 2) + step;
1351
+ const uint8_t * qh = qh_base + bi * (QK_K / 4) + step;
1352
+ const int8_t * s = scales_base + bi * (QK_K / 16);
1353
+
1354
+ const float d = d_base[bi];
1355
+
1356
+ float sum = 0;
1357
+ for (int j = 0; j < K_QUANTS_PER_ITERATION; ++j) {
1358
+ sum += y[j+ 0] * s[0] * d * ((int8_t)((ql[j+ 0] & 0xF) | ((qh[j] & 0x03) << 4)) - 32)
1359
+ + y[j+16] * s[1] * d * ((int8_t)((ql[j+16] & 0xF) | ((qh[j] & 0x0c) << 2)) - 32)
1360
+ + y[j+32] * s[2] * d * ((int8_t)((ql[j+ 0] >> 4) | ((qh[j] & 0x30) >> 0)) - 32)
1361
+ + y[j+48] * s[3] * d * ((int8_t)((ql[j+16] >> 4) | ((qh[j] & 0xc0) >> 2)) - 32);
1362
+ }
1363
+ tmp += sum;
1364
+
1365
+ }
1366
+
1367
+ #endif
1368
+
1369
+ // sum up partial sums and write back result
1370
+ #pragma unroll
1371
+ for (int mask = WARP_SIZE / 2; mask > 0; mask >>= 1) {
858
1372
  tmp +=
859
1373
  dpct::permute_sub_group_by_xor(item_ct1.get_sub_group(), tmp, mask);
860
1374
  }
@@ -909,6 +1423,50 @@ static void dequantize_mul_mat_vec_q4_0_sycl(const void *vx, const dfloat *y,
909
1423
  }
910
1424
  }
911
1425
 
1426
+ static void dequantize_mul_mat_vec_q1_0_sycl_reorder(const void *vx, const dfloat *y,
1427
+ float *dst, const int ncols,
1428
+ const int nrows,
1429
+ dpct::queue_ptr stream) {
1430
+ GGML_ASSERT(ncols % GGML_SYCL_DMMV_X == 0);
1431
+ const int block_num_y = (nrows + GGML_SYCL_MMV_Y - 1) / GGML_SYCL_MMV_Y;
1432
+ // the number of rows may exceed maximum grid size in the y or z dimensions, use the x dimension instead
1433
+ const sycl::range<3> block_nums(1, 1, block_num_y);
1434
+ const sycl::range<3> block_dims(1, GGML_SYCL_MMV_Y, WARP_SIZE);
1435
+ {
1436
+ dpct::has_capability_or_fail(stream->get_device(),
1437
+ {sycl::aspect::fp16});
1438
+
1439
+ stream->parallel_for(
1440
+ sycl::nd_range<3>(block_nums * block_dims, block_dims),
1441
+ [=](sycl::nd_item<3> item_ct1) [[sycl::reqd_sub_group_size(WARP_SIZE)]] {
1442
+ dequantize_mul_mat_vec_reorder<QK1_0, QR1_0, dequantize_q1_0_reorder>(
1443
+ vx, y, dst, ncols, nrows, item_ct1);
1444
+ });
1445
+ }
1446
+ }
1447
+
1448
+ static void dequantize_mul_mat_vec_q1_0_sycl(const void *vx, const dfloat *y,
1449
+ float *dst, const int ncols,
1450
+ const int nrows,
1451
+ dpct::queue_ptr stream) {
1452
+ GGML_ASSERT(ncols % GGML_SYCL_DMMV_X == 0);
1453
+ const int block_num_y = (nrows + GGML_SYCL_MMV_Y - 1) / GGML_SYCL_MMV_Y;
1454
+ // the number of rows may exceed maximum grid size in the y or z dimensions, use the x dimension instead
1455
+ const sycl::range<3> block_nums(1, 1, block_num_y);
1456
+ const sycl::range<3> block_dims(1, GGML_SYCL_MMV_Y, WARP_SIZE);
1457
+ {
1458
+ dpct::has_capability_or_fail(stream->get_device(),
1459
+ {sycl::aspect::fp16});
1460
+
1461
+ stream->parallel_for(
1462
+ sycl::nd_range<3>(block_nums * block_dims, block_dims),
1463
+ [=](sycl::nd_item<3> item_ct1) [[sycl::reqd_sub_group_size(WARP_SIZE)]] {
1464
+ dequantize_mul_mat_vec<QK1_0, QR1_0, dequantize_q1_0>(
1465
+ vx, y, dst, ncols, nrows, item_ct1);
1466
+ });
1467
+ }
1468
+ }
1469
+
912
1470
  static void dequantize_mul_mat_vec_q4_1_sycl(const void *vx, const dfloat *y,
913
1471
  float *dst, const int ncols,
914
1472
  const int nrows,
@@ -972,6 +1530,103 @@ static void dequantize_mul_mat_vec_q5_1_sycl(const void *vx, const dfloat *y,
972
1530
  }
973
1531
  }
974
1532
 
1533
+ static void dequantize_mul_mat_vec_q8_0_sycl_reorder(const void *vx, const dfloat *y,
1534
+ float *dst, const int ncols,
1535
+ const int nrows,
1536
+ dpct::queue_ptr stream) {
1537
+ GGML_ASSERT(ncols % GGML_SYCL_DMMV_X == 0);
1538
+ const int block_num_y = (nrows + GGML_SYCL_MMV_Y - 1) / GGML_SYCL_MMV_Y;
1539
+ const sycl::range<3> block_nums(1, 1, block_num_y);
1540
+ const sycl::range<3> block_dims(1, GGML_SYCL_MMV_Y, WARP_SIZE);
1541
+ {
1542
+ dpct::has_capability_or_fail(stream->get_device(),
1543
+ {sycl::aspect::fp16});
1544
+
1545
+ stream->parallel_for(
1546
+ sycl::nd_range<3>(block_nums * block_dims, block_dims),
1547
+ [=](sycl::nd_item<3> item_ct1) [[sycl::reqd_sub_group_size(WARP_SIZE)]] {
1548
+ // Q8_0 reorder layout: [all qs (ncols*nrows bytes)][all d values]
1549
+ // Cannot reuse dequantize_mul_mat_vec_reorder template because it has
1550
+ // Q4_0-specific constants hardcoded (d_ptr offset and qs stride).
1551
+ const int row = item_ct1.get_group(2) * item_ct1.get_local_range(1) +
1552
+ item_ct1.get_local_id(1);
1553
+ if (row >= nrows) return;
1554
+
1555
+ const int tid = item_ct1.get_local_id(2);
1556
+ const int iter_stride = 8*2*GGML_SYCL_DMMV_X;
1557
+ const int vals_per_iter = iter_stride / WARP_SIZE;
1558
+ const int ncols_left = ncols % (QK8_0*WARP_SIZE);
1559
+ const int ncols_align = ncols - ncols_left;
1560
+
1561
+ #ifdef GGML_SYCL_F16
1562
+ sycl::half2 tmp = {0.0f, 0.0f};
1563
+ #else
1564
+ float tmp = 0.0f;
1565
+ #endif
1566
+ const char *d_ptr = (const char*)vx + ncols*nrows; // d after all qs
1567
+
1568
+ int i = 0;
1569
+ for (i = 0; i < ncols_align; i += iter_stride) {
1570
+ const int col = i + vals_per_iter*tid;
1571
+ const int ib = (row*ncols + col)/QK8_0;
1572
+ const int iqs = col % QK8_0;
1573
+
1574
+ #pragma unroll
1575
+ for (int j = 0; j < vals_per_iter; j += 2) {
1576
+ dfloat2 v;
1577
+ dequantize_q8_0_reorder((const void *)d_ptr, ib, (const void *)vx,
1578
+ ib * QK8_0 + iqs + j, v);
1579
+
1580
+ #ifdef GGML_SYCL_F16
1581
+ dfloat2 t1{y[col + j + 0], y[col + j + 1]};
1582
+ tmp += v * t1;
1583
+ #else
1584
+ tmp += v.x() * y[col + j + 0];
1585
+ tmp += v.y() * y[col + j + 1];
1586
+ #endif
1587
+ }
1588
+ }
1589
+
1590
+ // handle remaining columns
1591
+ for (; i < ncols; i += iter_stride) {
1592
+ if (tid >= ncols_left/QK8_0) continue;
1593
+ const int col = i + vals_per_iter*tid;
1594
+ const int ib = (row*ncols + col)/QK8_0;
1595
+ const int iqs = col % QK8_0;
1596
+
1597
+ #pragma unroll
1598
+ for (int j = 0; j < vals_per_iter; j += 2) {
1599
+ dfloat2 v;
1600
+ dequantize_q8_0_reorder((const void *)d_ptr, ib, (const void *)vx,
1601
+ ib * QK8_0 + iqs + j, v);
1602
+
1603
+ #ifdef GGML_SYCL_F16
1604
+ dfloat2 t1{y[col + j + 0], y[col + j + 1]};
1605
+ tmp += v * t1;
1606
+ #else
1607
+ tmp += v.x() * y[col + j + 0];
1608
+ tmp += v.y() * y[col + j + 1];
1609
+ #endif
1610
+ }
1611
+ }
1612
+
1613
+ // reduce
1614
+ const int mask_start = ncols > GGML_SYCL_DMMV_X ? WARP_SIZE >> 1 : WARP_SIZE >> 2;
1615
+ for (int mask = mask_start; mask > 0; mask >>= 1) {
1616
+ tmp += dpct::permute_sub_group_by_xor(item_ct1.get_sub_group(), tmp, mask);
1617
+ }
1618
+
1619
+ if (tid == 0) {
1620
+ #ifdef GGML_SYCL_F16
1621
+ dst[row] = tmp.x() + tmp.y();
1622
+ #else
1623
+ dst[row] = tmp;
1624
+ #endif
1625
+ }
1626
+ });
1627
+ }
1628
+ }
1629
+
975
1630
  static void dequantize_mul_mat_vec_q8_0_sycl(const void *vx, const dfloat *y,
976
1631
  float *dst, const int ncols,
977
1632
  const int nrows,
@@ -1001,10 +1656,10 @@ static void dequantize_mul_mat_vec_q2_K_sycl(const void *vx, const float *y,
1001
1656
  const int ny = 2; // very slightly faster than 1 even when K_QUANTS_PER_ITERATION = 2
1002
1657
  const int block_num_y = (nrows + ny - 1) / ny;
1003
1658
  const sycl::range<3> block_nums(1, 1, block_num_y);
1004
- const sycl::range<3> block_dims(1, ny, QK_WARP_SIZE);
1659
+ const sycl::range<3> block_dims(1, ny, WARP_SIZE);
1005
1660
  stream->parallel_for(
1006
1661
  sycl::nd_range<3>(block_nums * block_dims, block_dims),
1007
- [=](sycl::nd_item<3> item_ct1) [[sycl::reqd_sub_group_size(QK_WARP_SIZE)]] {
1662
+ [=](sycl::nd_item<3> item_ct1) [[sycl::reqd_sub_group_size(WARP_SIZE)]] {
1008
1663
  dequantize_mul_mat_vec_q2_k(vx, y, dst, ncols, nrows, item_ct1);
1009
1664
  });
1010
1665
  }
@@ -1017,14 +1672,30 @@ static void dequantize_mul_mat_vec_q3_K_sycl(const void *vx, const float *y,
1017
1672
  const int ny = 2 / K_QUANTS_PER_ITERATION;
1018
1673
  const int block_num_y = (nrows + ny - 1) / ny;
1019
1674
  const sycl::range<3> block_nums(1, 1, block_num_y);
1020
- const sycl::range<3> block_dims(1, ny, QK_WARP_SIZE);
1675
+ const sycl::range<3> block_dims(1, ny, WARP_SIZE);
1021
1676
  stream->parallel_for(
1022
1677
  sycl::nd_range<3>(block_nums * block_dims, block_dims),
1023
- [=](sycl::nd_item<3> item_ct1) [[sycl::reqd_sub_group_size(QK_WARP_SIZE)]] {
1678
+ [=](sycl::nd_item<3> item_ct1) [[sycl::reqd_sub_group_size(WARP_SIZE)]] {
1024
1679
  dequantize_mul_mat_vec_q3_k(vx, y, dst, ncols, nrows, item_ct1);
1025
1680
  });
1026
1681
  }
1027
1682
 
1683
+ static void dequantize_mul_mat_vec_q3_K_sycl_reorder(const void *vx, const float *y,
1684
+ float *dst, const int ncols,
1685
+ const int nrows,
1686
+ dpct::queue_ptr stream) {
1687
+ GGML_ASSERT(ncols % QK_K == 0);
1688
+ const int ny = 2 / K_QUANTS_PER_ITERATION;
1689
+ const int block_num_y = (nrows + ny - 1) / ny;
1690
+ const sycl::range<3> block_nums(1, 1, block_num_y);
1691
+ const sycl::range<3> block_dims(1, ny, WARP_SIZE);
1692
+ stream->parallel_for(
1693
+ sycl::nd_range<3>(block_nums * block_dims, block_dims),
1694
+ [=](sycl::nd_item<3> item_ct1) [[sycl::reqd_sub_group_size(WARP_SIZE)]] {
1695
+ dequantize_mul_mat_vec_q3_k_reorder(vx, y, dst, ncols, nrows, item_ct1);
1696
+ });
1697
+ }
1698
+
1028
1699
  static void dequantize_mul_mat_vec_q4_K_sycl(const void *vx, const float *y,
1029
1700
  float *dst, const int ncols,
1030
1701
  const int nrows,
@@ -1033,10 +1704,10 @@ static void dequantize_mul_mat_vec_q4_K_sycl(const void *vx, const float *y,
1033
1704
  const int ny = 2 / K_QUANTS_PER_ITERATION;
1034
1705
  const int block_num_y = (nrows + ny - 1) / ny;
1035
1706
  const sycl::range<3> block_nums(1, 1, block_num_y);
1036
- const sycl::range<3> block_dims(1, ny, QK_WARP_SIZE);
1707
+ const sycl::range<3> block_dims(1, ny, WARP_SIZE);
1037
1708
  stream->parallel_for(
1038
1709
  sycl::nd_range<3>(block_nums * block_dims, block_dims),
1039
- [=](sycl::nd_item<3> item_ct1) [[sycl::reqd_sub_group_size(QK_WARP_SIZE)]] {
1710
+ [=](sycl::nd_item<3> item_ct1) [[sycl::reqd_sub_group_size(WARP_SIZE)]] {
1040
1711
  dequantize_mul_mat_vec_q4_k(vx, y, dst, ncols, nrows, item_ct1);
1041
1712
  });
1042
1713
  }
@@ -1046,10 +1717,10 @@ static void dequantize_mul_mat_vec_q5_K_sycl(const void *vx, const float *y,
1046
1717
  const int nrows,
1047
1718
  dpct::queue_ptr stream) {
1048
1719
  GGML_ASSERT(ncols % QK_K == 0);
1049
- const sycl::range<3> block_dims(1, 1, QK_WARP_SIZE);
1720
+ const sycl::range<3> block_dims(1, 1, WARP_SIZE);
1050
1721
  stream->parallel_for(
1051
1722
  sycl::nd_range<3>(sycl::range<3>(1, 1, nrows) * block_dims, block_dims),
1052
- [=](sycl::nd_item<3> item_ct1) [[sycl::reqd_sub_group_size(QK_WARP_SIZE)]] {
1723
+ [=](sycl::nd_item<3> item_ct1) [[sycl::reqd_sub_group_size(WARP_SIZE)]] {
1053
1724
  dequantize_mul_mat_vec_q5_k(vx, y, dst, ncols, item_ct1);
1054
1725
  });
1055
1726
  }
@@ -1062,14 +1733,62 @@ static void dequantize_mul_mat_vec_q6_K_sycl(const void *vx, const float *y,
1062
1733
  const int ny = 2 / K_QUANTS_PER_ITERATION;
1063
1734
  const int block_num_y = (nrows + ny - 1) / ny;
1064
1735
  const sycl::range<3> block_nums(1, 1, block_num_y);
1065
- const sycl::range<3> block_dims(1, ny, QK_WARP_SIZE);
1736
+ const sycl::range<3> block_dims(1, ny, WARP_SIZE);
1066
1737
  stream->parallel_for(
1067
1738
  sycl::nd_range<3>(block_nums * block_dims, block_dims),
1068
- [=](sycl::nd_item<3> item_ct1) [[sycl::reqd_sub_group_size(QK_WARP_SIZE)]] {
1739
+ [=](sycl::nd_item<3> item_ct1) [[sycl::reqd_sub_group_size(WARP_SIZE)]] {
1069
1740
  dequantize_mul_mat_vec_q6_k(vx, y, dst, ncols, nrows, item_ct1);
1070
1741
  });
1071
1742
  }
1072
1743
 
1744
+ static void dequantize_mul_mat_vec_q4_K_sycl_reorder(const void *vx, const float *y,
1745
+ float *dst, const int ncols,
1746
+ const int nrows,
1747
+ dpct::queue_ptr stream) {
1748
+ GGML_ASSERT(ncols % QK_K == 0);
1749
+ const int ny = 2 / K_QUANTS_PER_ITERATION;
1750
+ const int block_num_y = (nrows + ny - 1) / ny;
1751
+ const sycl::range<3> block_nums(1, 1, block_num_y);
1752
+ const sycl::range<3> block_dims(1, ny, WARP_SIZE);
1753
+ stream->parallel_for(
1754
+ sycl::nd_range<3>(block_nums * block_dims, block_dims),
1755
+ [=](sycl::nd_item<3> item_ct1) [[sycl::reqd_sub_group_size(WARP_SIZE)]] {
1756
+ dequantize_mul_mat_vec_q4_k_reorder(vx, y, dst, ncols, nrows, item_ct1);
1757
+ });
1758
+ }
1759
+
1760
+ static void dequantize_mul_mat_vec_q5_K_sycl_reorder(const void *vx, const float *y,
1761
+ float *dst, const int ncols,
1762
+ const int nrows,
1763
+ dpct::queue_ptr stream) {
1764
+ GGML_ASSERT(ncols % QK_K == 0);
1765
+ const int ny = 2 / K_QUANTS_PER_ITERATION;
1766
+ const int block_num_y = (nrows + ny - 1) / ny;
1767
+ const sycl::range<3> block_nums(1, 1, block_num_y);
1768
+ const sycl::range<3> block_dims(1, ny, WARP_SIZE);
1769
+ stream->parallel_for(
1770
+ sycl::nd_range<3>(block_nums * block_dims, block_dims),
1771
+ [=](sycl::nd_item<3> item_ct1) [[sycl::reqd_sub_group_size(WARP_SIZE)]] {
1772
+ dequantize_mul_mat_vec_q5_k_reorder(vx, y, dst, ncols, nrows, item_ct1);
1773
+ });
1774
+ }
1775
+
1776
+ static void dequantize_mul_mat_vec_q6_K_sycl_reorder(const void *vx, const float *y,
1777
+ float *dst, const int ncols,
1778
+ const int nrows,
1779
+ dpct::queue_ptr stream) {
1780
+ GGML_ASSERT(ncols % QK_K == 0);
1781
+ const int ny = 2 / K_QUANTS_PER_ITERATION;
1782
+ const int block_num_y = (nrows + ny - 1) / ny;
1783
+ const sycl::range<3> block_nums(1, 1, block_num_y);
1784
+ const sycl::range<3> block_dims(1, ny, WARP_SIZE);
1785
+ stream->parallel_for(
1786
+ sycl::nd_range<3>(block_nums * block_dims, block_dims),
1787
+ [=](sycl::nd_item<3> item_ct1) [[sycl::reqd_sub_group_size(WARP_SIZE)]] {
1788
+ dequantize_mul_mat_vec_q6_k_reorder(vx, y, dst, ncols, nrows, item_ct1);
1789
+ });
1790
+ }
1791
+
1073
1792
  void ggml_sycl_op_dequantize_mul_mat_vec(
1074
1793
  ggml_backend_sycl_context & ctx,
1075
1794
  const ggml_tensor *src0, const ggml_tensor *src1, ggml_tensor *dst,
@@ -1087,9 +1806,11 @@ void ggml_sycl_op_dequantize_mul_mat_vec(
1087
1806
  sycl::half *src1_dfloat = nullptr; // dfloat == half
1088
1807
 
1089
1808
  bool src1_convert_f16 =
1809
+ src0->type == GGML_TYPE_Q1_0 ||
1090
1810
  src0->type == GGML_TYPE_Q4_0 || src0->type == GGML_TYPE_Q4_1 ||
1091
1811
  src0->type == GGML_TYPE_Q5_0 || src0->type == GGML_TYPE_Q5_1 ||
1092
- src0->type == GGML_TYPE_Q8_0 || src0->type == GGML_TYPE_F16;
1812
+ src0->type == GGML_TYPE_Q8_0 || src0->type == GGML_TYPE_F16 ||
1813
+ src0->type == GGML_TYPE_BF16;
1093
1814
 
1094
1815
  if (src1_convert_f16) {
1095
1816
  scope_op_debug_print scope_dbg_print(__func__, "/to_fp16_sycl", dst, /*num_src=*/2,
@@ -1104,6 +1825,14 @@ void ggml_sycl_op_dequantize_mul_mat_vec(
1104
1825
  #endif // GGML_SYCL_F16
1105
1826
 
1106
1827
  switch (src0->type) {
1828
+ case GGML_TYPE_Q1_0:
1829
+ if ((ggml_tensor_extra_gpu*)dst->src[0]->extra &&
1830
+ ((ggml_tensor_extra_gpu*)dst->src[0]->extra)->optimized_feature.reorder) {
1831
+ dequantize_mul_mat_vec_q1_0_sycl_reorder(src0_dd_i, src1_dfloat, dst_dd_i, ne00, row_diff, stream);
1832
+ } else {
1833
+ dequantize_mul_mat_vec_q1_0_sycl(src0_dd_i, src1_dfloat, dst_dd_i, ne00, row_diff, stream);
1834
+ }
1835
+ break;
1107
1836
  case GGML_TYPE_Q4_0:
1108
1837
  if ((ggml_tensor_extra_gpu*)dst->src[0]->extra &&
1109
1838
  ((ggml_tensor_extra_gpu*)dst->src[0]->extra)->optimized_feature.reorder) {
@@ -1122,32 +1851,56 @@ void ggml_sycl_op_dequantize_mul_mat_vec(
1122
1851
  dequantize_mul_mat_vec_q5_1_sycl(src0_dd_i, src1_dfloat, dst_dd_i, ne00, row_diff, stream);
1123
1852
  break;
1124
1853
  case GGML_TYPE_Q8_0:
1125
- dequantize_mul_mat_vec_q8_0_sycl(src0_dd_i, src1_dfloat, dst_dd_i, ne00, row_diff, stream);
1854
+ if ((ggml_tensor_extra_gpu *) dst->src[0]->extra &&
1855
+ ((ggml_tensor_extra_gpu *) dst->src[0]->extra)->optimized_feature.reorder) {
1856
+ dequantize_mul_mat_vec_q8_0_sycl_reorder(src0_dd_i, src1_dfloat, dst_dd_i, ne00, row_diff, stream);
1857
+ } else {
1858
+ dequantize_mul_mat_vec_q8_0_sycl(src0_dd_i, src1_dfloat, dst_dd_i, ne00, row_diff, stream);
1859
+ }
1126
1860
  break;
1127
1861
  case GGML_TYPE_Q2_K:
1128
1862
  dequantize_mul_mat_vec_q2_K_sycl(src0_dd_i, src1_ddf_i, dst_dd_i, ne00, row_diff, stream);
1129
1863
  break;
1130
1864
  case GGML_TYPE_Q3_K:
1131
- dequantize_mul_mat_vec_q3_K_sycl(src0_dd_i, src1_ddf_i, dst_dd_i, ne00, row_diff, stream);
1865
+ if ((ggml_tensor_extra_gpu *) dst->src[0]->extra &&
1866
+ ((ggml_tensor_extra_gpu *) dst->src[0]->extra)->optimized_feature.reorder) {
1867
+ dequantize_mul_mat_vec_q3_K_sycl_reorder(src0_dd_i, src1_ddf_i, dst_dd_i, ne00, row_diff, stream);
1868
+ } else {
1869
+ dequantize_mul_mat_vec_q3_K_sycl(src0_dd_i, src1_ddf_i, dst_dd_i, ne00, row_diff, stream);
1870
+ }
1132
1871
  break;
1133
1872
  case GGML_TYPE_Q4_K:
1134
1873
  if ((ggml_tensor_extra_gpu *) dst->src[0]->extra &&
1135
1874
  ((ggml_tensor_extra_gpu *) dst->src[0]->extra)->optimized_feature.reorder) {
1136
- // reorder is currently not supported for dmmv
1137
- GGML_ABORT("Unimplemented dequantize case case for q4_k reorder");
1875
+ dequantize_mul_mat_vec_q4_K_sycl_reorder(src0_dd_i, src1_ddf_i, dst_dd_i, ne00, row_diff, stream);
1138
1876
  } else {
1139
1877
  dequantize_mul_mat_vec_q4_K_sycl(src0_dd_i, src1_ddf_i, dst_dd_i, ne00, row_diff, stream);
1140
1878
  }
1141
1879
  break;
1142
1880
  case GGML_TYPE_Q5_K:
1143
- dequantize_mul_mat_vec_q5_K_sycl(src0_dd_i, src1_ddf_i, dst_dd_i, ne00, row_diff, stream);
1881
+ if ((ggml_tensor_extra_gpu *) dst->src[0]->extra &&
1882
+ ((ggml_tensor_extra_gpu *) dst->src[0]->extra)->optimized_feature.reorder) {
1883
+ dequantize_mul_mat_vec_q5_K_sycl_reorder(src0_dd_i, src1_ddf_i, dst_dd_i, ne00, row_diff, stream);
1884
+ } else {
1885
+ dequantize_mul_mat_vec_q5_K_sycl(src0_dd_i, src1_ddf_i, dst_dd_i, ne00, row_diff, stream);
1886
+ }
1144
1887
  break;
1145
1888
  case GGML_TYPE_Q6_K:
1146
- dequantize_mul_mat_vec_q6_K_sycl(src0_dd_i, src1_ddf_i, dst_dd_i, ne00, row_diff, stream);
1889
+ if ((ggml_tensor_extra_gpu *) dst->src[0]->extra &&
1890
+ ((ggml_tensor_extra_gpu *) dst->src[0]->extra)->optimized_feature.reorder) {
1891
+ dequantize_mul_mat_vec_q6_K_sycl_reorder(src0_dd_i, src1_ddf_i, dst_dd_i, ne00, row_diff, stream);
1892
+ } else {
1893
+ dequantize_mul_mat_vec_q6_K_sycl(src0_dd_i, src1_ddf_i, dst_dd_i, ne00, row_diff, stream);
1894
+ }
1147
1895
  break;
1148
1896
  case GGML_TYPE_F16:
1149
1897
  convert_mul_mat_vec_f16_sycl(src0_dd_i, src1_dfloat, dst_dd_i, ne00, row_diff, stream);
1150
1898
  break;
1899
+ #ifdef GGML_SYCL_DMMV_HAS_BF16
1900
+ case GGML_TYPE_BF16:
1901
+ convert_mul_mat_vec_bf16_sycl(src0_dd_i, src1_dfloat, dst_dd_i, ne00, row_diff, stream);
1902
+ break;
1903
+ #endif
1151
1904
  default:
1152
1905
  printf("ggml_sycl_op_dequantize_mul_mat_vec unsupported GGML_TYPE %d\n", src0->type);
1153
1906
  GGML_ABORT("fatal error");