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
@@ -27,7 +27,10 @@
27
27
  #define QR5_1 2
28
28
  #define QK8_0 32
29
29
  #define QR8_0 1
30
+ #define QK1_0 128
31
+ #define QR1_0 1
30
32
  #define QK_K 256
33
+ #define K_SCALE_SIZE (3 * QK_K / 64)
31
34
  #define K_QUANTS_PER_ITERATION 2
32
35
 
33
36
  typedef char int8_t;
@@ -37,6 +40,14 @@ typedef ushort uint16_t;
37
40
  typedef int int32_t;
38
41
  typedef uint uint32_t;
39
42
 
43
+ //------------------------------------------------------------------------------
44
+ // block_q1_0
45
+ //------------------------------------------------------------------------------
46
+ typedef struct {
47
+ half d; // delta
48
+ uchar qs[QK1_0/8]; // 1-bit signs (16 bytes)
49
+ } block_q1_0;
50
+
40
51
  //------------------------------------------------------------------------------
41
52
  // block_q4_0
42
53
  //------------------------------------------------------------------------------
@@ -55,6 +66,46 @@ struct block_q4_1 {
55
66
  uchar qs[QK4_1 / 2]; // nibbles / quants
56
67
  };
57
68
 
69
+ //------------------------------------------------------------------------------
70
+ // block_q5_0
71
+ //------------------------------------------------------------------------------
72
+ struct block_q5_0 {
73
+ half d; // delta
74
+ uchar qh[4]; // 5-th bit of quants
75
+ uchar qs[QK5_0 / 2]; // nibbles / quants
76
+ };
77
+
78
+ //------------------------------------------------------------------------------
79
+ // block_q5_1
80
+ //------------------------------------------------------------------------------
81
+ struct block_q5_1 {
82
+ half d; // delta
83
+ half m; // min
84
+ uchar qh[4]; // 5-th bit of quants
85
+ uchar qs[QK5_1 / 2]; // nibbles / quants
86
+ };
87
+
88
+ //------------------------------------------------------------------------------
89
+ // block_q4_k
90
+ //------------------------------------------------------------------------------
91
+ struct block_q4_K {
92
+ half d; // delta
93
+ half dm; // min
94
+ uchar s[K_SCALE_SIZE];
95
+ uchar q[QK_K / 2]; // nibbles / quants
96
+ };
97
+
98
+ //------------------------------------------------------------------------------
99
+ // block_q5_k
100
+ //------------------------------------------------------------------------------
101
+ struct block_q5_K {
102
+ half d; // delta
103
+ half dm; // min
104
+ uchar s[K_SCALE_SIZE];
105
+ uchar qh[QK_K / 8];
106
+ uchar qs[QK_K / 2]; // nibbles / quants
107
+ };
108
+
58
109
  //------------------------------------------------------------------------------
59
110
  // block_q6_K
60
111
  //------------------------------------------------------------------------------
@@ -65,6 +116,95 @@ struct block_q6_K {
65
116
  half d; // super-block scale
66
117
  };
67
118
 
119
+ //------------------------------------------------------------------------------
120
+ // block_iq4_nl
121
+ //------------------------------------------------------------------------------
122
+ #define QK4_NL 32
123
+
124
+ struct block_iq4_nl
125
+ {
126
+ half d;
127
+ uint8_t qs[QK4_NL / 2];
128
+ };
129
+
130
+ //------------------------------------------------------------------------------
131
+ // bf16 to f16
132
+ //------------------------------------------------------------------------------
133
+ kernel void kernel_convert_bf16_to_f16(
134
+ global const ushort * src,
135
+ global half * dst,
136
+ ulong off_dst,
137
+ ulong n
138
+ ) {
139
+ uint i = get_global_id(0);
140
+ if (i >= n) {
141
+ return;
142
+ }
143
+
144
+ dst[i + off_dst] = (half) as_float((uint) src[i] << 16);
145
+ }
146
+
147
+ //------------------------------------------------------------------------------
148
+ // f16 to bf16
149
+ //------------------------------------------------------------------------------
150
+ kernel void kernel_convert_f16_to_bf16(
151
+ global const half * src,
152
+ ulong off_src,
153
+ global ushort * dst,
154
+ ulong n
155
+ ) {
156
+ uint i = get_global_id(0);
157
+ if (i >= n) {
158
+ return;
159
+ }
160
+
161
+ float f = (float) src[i + off_src];
162
+ uint bits = as_uint(f);
163
+ if ((bits & 0x7fffffffu) > 0x7f800000u) {
164
+ // nan to quiet nan
165
+ dst[i] = (ushort)((bits >> 16) | 0x40u);
166
+ } else {
167
+ uint rounded = bits + 0x7fffu + ((bits >> 16) & 1u);
168
+ dst[i] = (ushort)(rounded >> 16);
169
+ }
170
+ }
171
+
172
+ //------------------------------------------------------------------------------
173
+ // kernel_convert_block_q1_0
174
+ // Convert block_q1_0 (AOS) to 2 separate arrays (SOA): quant bytes + scales.
175
+ // q1_0 bits are stored in natural order (bit j of byte i -> weight 8*i + j)
176
+ //------------------------------------------------------------------------------
177
+ kernel void kernel_convert_block_q1_0(
178
+ global block_q1_0 * src0,
179
+ global uchar * dst_q,
180
+ global half * dst_d
181
+ ) {
182
+ global block_q1_0 * b = (global block_q1_0 *) src0 + get_global_id(0);
183
+ global uchar * q = (global uchar *) dst_q + (QK1_0/8)*get_global_id(0);
184
+ global half * d = (global half *) dst_d + get_global_id(0);
185
+
186
+ *d = b->d;
187
+
188
+ for (int i = 0; i < QK1_0/8; ++i) {
189
+ q[i] = b->qs[i];
190
+ }
191
+ }
192
+
193
+ kernel void kernel_restore_block_q1_0(
194
+ global uchar * src_q,
195
+ global half * src_d,
196
+ global block_q1_0 * dst
197
+ ) {
198
+ global block_q1_0 * b = (global block_q1_0 *) dst + get_global_id(0);
199
+ global uchar * q = (global uchar *) src_q + (QK1_0/8)*get_global_id(0);
200
+ global half * d = (global half *) src_d + get_global_id(0);
201
+
202
+ b->d = *d;
203
+ for (int i = 0; i < QK1_0/8; ++i) {
204
+ b->qs[i] = q[i];
205
+ }
206
+ }
207
+
68
208
  //------------------------------------------------------------------------------
69
209
  // kernel_convert_block_q4_0
70
210
  // Convert the block_q4_0 format to 2 separate arrays (AOS -> SOA).
@@ -157,6 +297,100 @@ kernel void kernel_restore_block_q4_0_noshuffle(
157
297
  }
158
298
  }
159
299
 
300
+ kernel void kernel_convert_block_q4_0_trans4_ns(
301
+ global struct block_q4_0 * src0,
302
+ __global uint * dst_q,
303
+ __global half * dst_d,
304
+ uint ne00,
305
+ uint ne01
306
+ ) {
307
+ uint i00 = get_global_id(1);
308
+ uint i01 = get_global_id(0);
309
+ uint i02 = get_global_id(2);
310
+
311
+ if (i01 >= ne01) {
312
+ return;
313
+ }
314
+
315
+ uint ne00_blk = ne00 / QK4_0;
316
+ uint src_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
317
+ uint dst_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
318
+
319
+ global struct block_q4_0 * b = src0 + src_blk_offset;
320
+ dst_d[dst_blk_offset] = b->d;
321
+
322
+ // extract quantization and unshuffle
323
+ ushort8 pre_block = ((global ushort8 *)(&(b->qs[0])))[0];
324
+
325
+ ushort8 post_block = (ushort8)(0);
326
+
327
+ uchar * pre_block_ptr = (uchar *)(&pre_block);
328
+ uchar * post_block_ptr = (uchar *)(&post_block);
329
+
330
+ for (int i = 0; i < QK4_0 / 4; ++i) {
331
+ uchar x0 = pre_block_ptr[2*i + 0];
332
+ uchar x1 = pre_block_ptr[2*i + 1];
333
+
334
+ post_block_ptr[i + 0 ] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
335
+ post_block_ptr[i + QK4_0 / 4] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
336
+ }
337
+
338
+ uint4 q_block = as_uint4(post_block);
339
+
340
+ uint offset = i02 * ne00_blk * ne01 * 4 + i00 * ne01 * 4 + i01;
341
+ dst_q[offset] = q_block.x;
342
+ dst_q[offset + ne01] = q_block.y;
343
+ dst_q[offset + ne01 * 2] = q_block.z;
344
+ dst_q[offset + ne01 * 3] = q_block.w;
345
+ }
346
+
347
+ kernel void kernel_restore_block_q4_0_trans4_ns(
348
+ __global uint * src_q,
349
+ __global half * src_d,
350
+ __global struct block_q4_0 * dst0,
351
+ uint ne00,
352
+ uint ne01
353
+ ) {
354
+ uint i00 = get_global_id(1);
355
+ uint i01 = get_global_id(0);
356
+ uint i02 = get_global_id(2);
357
+
358
+ if (i01 >= ne01) {
359
+ return;
360
+ }
361
+
362
+ uint ne00_blk = ne00 / QK4_0;
363
+ uint dst_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
364
+ uint src_d_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
365
+
366
+ __global struct block_q4_0 * b = dst0 + dst_blk_offset;
367
+ b->d = src_d[src_d_offset];
368
+
369
+ // collect transposed quantization parts for a block
370
+ uint src_q_offset = i02 * ne00_blk * ne01 * 4 + i00 * ne01 * 4 + i01;
371
+ uint4 q_block;
372
+ q_block.x = src_q[src_q_offset];
373
+ q_block.y = src_q[src_q_offset + ne01];
374
+ q_block.z = src_q[src_q_offset + ne01 * 2];
375
+ q_block.w = src_q[src_q_offset + ne01 * 3];
376
+
377
+ ushort8 post_block = as_ushort8(q_block);
378
+ ushort8 pre_block = (ushort8)(0);
379
+
380
+ uchar * pre_block_ptr = (uchar *)(&pre_block);
381
+ uchar * post_block_ptr = (uchar *)(&post_block);
382
+
383
+ for (int i = 0; i < QK4_0 / 4; ++i) {
384
+ uchar x0 = post_block_ptr[i + 0];
385
+ uchar x1 = post_block_ptr[i + QK4_0 / 4];
386
+
387
+ pre_block_ptr[2 * i + 0] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
388
+ pre_block_ptr[2 * i + 1] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
389
+ }
390
+
391
+ ((__global ushort8 *)(&(b->qs[0])))[0] = pre_block;
392
+ }
393
+
160
394
  //------------------------------------------------------------------------------
161
395
  // kernel_convert_block_q4_1
162
396
  // Convert the block_q4_1 format to 2 separate arrays (AOS -> SOA).
@@ -251,76 +485,60 @@ kernel void kernel_restore_block_q4_1_noshuffle(
251
485
  }
252
486
  }
253
487
 
254
- //------------------------------------------------------------------------------
255
- // block_mxfp4
256
- //------------------------------------------------------------------------------
257
- #define QK_MXFP4 32
258
- struct block_mxfp4 {
259
- uchar e; // E8M0
260
- uchar qs[QK_MXFP4 / 2];
261
- };
262
-
263
- //------------------------------------------------------------------------------
264
- // kernel_convert_block_mxfp4
265
- // Convert the block_mxfp4 format to 2 separate arrays (AOS -> SOA).
266
- // This kernel does not deshuffle the bits.
267
- //------------------------------------------------------------------------------
268
- kernel void kernel_convert_block_mxfp4(
269
- global struct block_mxfp4 * src0,
270
- global uchar * dst_q,
271
- global uchar * dst_e
272
- ) {
273
- global struct block_mxfp4 * b = (global struct block_mxfp4 *) src0 + get_global_id(0);
274
- global uchar * q = (global uchar *) dst_q + QK_MXFP4 / 2 * get_global_id(0);
275
- global uchar * e = (global uchar *) dst_e + get_global_id(0);
276
-
277
- *e = b->e;
278
-
279
- for (int i = 0; i < QK_MXFP4 / 2; ++i) {
280
- q[i] = b->qs[i];
281
- }
282
- }
283
-
284
- kernel void kernel_convert_block_mxfp4_trans(
285
- global struct block_mxfp4 * src0,
286
- __global uint4 * dst_q,
287
- __global uchar * dst_e,
488
+ kernel void kernel_convert_block_q4_1_trans4_ns(
489
+ __global struct block_q4_1 * src0,
490
+ __global uint * dst_q,
491
+ __global half * dst_d,
492
+ __global half * dst_m,
288
493
  uint ne00,
289
494
  uint ne01
290
495
  ) {
291
- int i00 = get_global_id(1);
496
+ uint i00 = get_global_id(1);
292
497
  uint i01 = get_global_id(0);
293
498
  uint i02 = get_global_id(2);
294
499
 
295
- uint ne00_blk = ne00 / QK_MXFP4;
500
+ if (i01 >= ne01) {
501
+ return;
502
+ }
503
+
504
+ uint ne00_blk = ne00 / QK4_1;
296
505
  uint src_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
297
506
  uint dst_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
298
507
 
299
- global struct block_mxfp4 * b = src0 + src_blk_offset;
508
+ global struct block_q4_1 * b = src0 + src_blk_offset;
509
+ dst_d[dst_blk_offset] = b->d;
510
+ dst_m[dst_blk_offset] = b->m;
300
511
 
301
- dst_q[dst_blk_offset] = ((global uint4 *)(&(b->qs[0])))[0];
302
- dst_e[dst_blk_offset] = b->e;
303
- }
512
+ // extract quantization and unshuffle
513
+ ushort8 pre_block = ((global ushort8 *)(&(b->qs[0])))[0];
304
514
 
305
- kernel void kernel_restore_block_mxfp4(
306
- global uchar * src_q,
307
- global half * src_e,
308
- global struct block_mxfp4 * dst
309
- ) {
310
- global struct block_mxfp4 * b = (global struct block_mxfp4 *) dst + get_global_id(0);
311
- global uchar * q = (global uchar *) src_q + QK_MXFP4 / 2 * get_global_id(0);
312
- global uchar * e = (global uchar *) src_e + get_global_id(0);
515
+ ushort8 post_block = (ushort8)(0);
313
516
 
314
- b->e = *e;
315
- for (int i = 0; i < QK_MXFP4 / 2; ++i) {
316
- b->qs[i] = q[i];
517
+ uchar * pre_block_ptr = (uchar *)(&pre_block);
518
+ uchar * post_block_ptr = (uchar *)(&post_block);
519
+
520
+ for (int i = 0; i < QK4_1 / 4; ++i) {
521
+ uchar x0 = pre_block_ptr[2*i + 0];
522
+ uchar x1 = pre_block_ptr[2*i + 1];
523
+
524
+ post_block_ptr[i + 0 ] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
525
+ post_block_ptr[i + QK4_1 / 4] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
317
526
  }
527
+
528
+ uint4 q_block = as_uint4(post_block);
529
+
530
+ uint offset = i02 * ne00_blk * ne01 * 4 + i00 * ne01 * 4 + i01;
531
+ dst_q[offset] = q_block.x;
532
+ dst_q[offset + ne01] = q_block.y;
533
+ dst_q[offset + ne01 * 2] = q_block.z;
534
+ dst_q[offset + ne01 * 3] = q_block.w;
318
535
  }
319
536
 
320
- kernel void kernel_restore_block_mxfp4_trans(
321
- __global uint4 * src_q,
322
- __global uchar * src_e,
323
- global struct block_mxfp4 * dst,
537
+ kernel void kernel_restore_block_q4_1_trans4_ns(
538
+ __global uint * src_q,
539
+ __global half * src_d,
540
+ __global half * src_m,
541
+ __global struct block_q4_1 * dst0,
324
542
  uint ne00,
325
543
  uint ne01
326
544
  ) {
@@ -328,70 +546,1255 @@ kernel void kernel_restore_block_mxfp4_trans(
328
546
  uint i01 = get_global_id(0);
329
547
  uint i02 = get_global_id(2);
330
548
 
331
- uint ne00_blk = ne00 / QK_MXFP4;
332
- uint src_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
549
+ if (i01 >= ne01) {
550
+ return;
551
+ }
552
+
553
+ uint ne00_blk = ne00 / QK4_1;
333
554
  uint dst_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
555
+ uint src_dm_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
334
556
 
335
- global struct block_mxfp4 * b = dst + dst_blk_offset;
557
+ __global struct block_q4_1 * b = dst0 + dst_blk_offset;
558
+ b->d = src_d[src_dm_offset];
559
+ b->m = src_m[src_dm_offset];
336
560
 
337
- ((global uint4 *)(&(b->qs[0])))[0] = src_q[src_blk_offset];
338
- b->e = src_e[src_blk_offset];
561
+ // collect transposed quantization parts for a block
562
+ uint src_q_offset = i02 * ne00_blk * ne01 * 4 + i00 * ne01 * 4 + i01;
563
+ uint4 q_block;
564
+ q_block.x = src_q[src_q_offset];
565
+ q_block.y = src_q[src_q_offset + ne01];
566
+ q_block.z = src_q[src_q_offset + ne01 * 2];
567
+ q_block.w = src_q[src_q_offset + ne01 * 3];
568
+
569
+ ushort8 post_block = as_ushort8(q_block);
570
+ ushort8 pre_block = (ushort8)(0);
571
+
572
+ uchar * pre_block_ptr = (uchar *)(&pre_block);
573
+ uchar * post_block_ptr = (uchar *)(&post_block);
574
+
575
+ for (int i = 0; i < QK4_0 / 4; ++i) {
576
+ uchar x0 = post_block_ptr[i + 0];
577
+ uchar x1 = post_block_ptr[i + QK4_0 / 4];
578
+
579
+ pre_block_ptr[2 * i + 0] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
580
+ pre_block_ptr[2 * i + 1] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
581
+ }
582
+
583
+ ((__global ushort8 *)(&(b->qs[0])))[0] = pre_block;
339
584
  }
340
585
 
341
586
  //------------------------------------------------------------------------------
342
- // block_q8_0
587
+ // kernel_convert_block_q5_0
588
+ // Convert the block_q5_0 format to 3 separate arrays (AOS -> SOA).
589
+ // This kernel does not deshuffle the bits.
343
590
  //------------------------------------------------------------------------------
344
- typedef struct {
345
- half d; // delta
346
- char qs[QK8_0]; // quants
347
- } block_q8_0;
591
+ kernel void kernel_convert_block_q5_0(
592
+ global struct block_q5_0 * src0,
593
+ global uchar * dst_qs,
594
+ global uint * dst_qh,
595
+ global half * dst_d,
596
+ ulong n_blk
597
+ ) {
598
+ if (get_global_id(0) >= n_blk) {
599
+ return;
600
+ }
348
601
 
349
- kernel void kernel_convert_block_q8_0(
350
- global block_q8_0 * src0,
602
+ global struct block_q5_0 * b = (global struct block_q5_0 *) src0 + get_global_id(0);
603
+ global uchar * qs = (global uchar *) dst_qs + (QK5_0/2)*get_global_id(0);
604
+ global uint * qh = (global uint *) dst_qh + get_global_id(0);
605
+ global half * d = (global half *) dst_d + get_global_id(0);
606
+
607
+ *d = b->d;
608
+ *qh = *((global uint *)(b->qh));
609
+
610
+ for (int i = 0; i < QK5_0/2; ++i) {
611
+ qs[i] = b->qs[i];
612
+ }
613
+ }
614
+
615
+ kernel void kernel_restore_block_q5_0(
616
+ global uchar * src_qs,
617
+ global uint * src_qh,
618
+ global half * src_d,
619
+ global struct block_q5_0 * dst
620
+ ) {
621
+ global struct block_q5_0 * b = (global struct block_q5_0 *) dst + get_global_id(0);
622
+ global uchar * qs = (global uchar *) src_qs + (QK5_0/2)*get_global_id(0);
623
+ global uint * qh = (global uint *) src_qh + get_global_id(0);
624
+ global half * d = (global half *) src_d + get_global_id(0);
625
+
626
+ b->d = *d;
627
+ *((global uint *)(b->qh)) = *qh;
628
+ for (int i = 0; i < QK5_0/2; ++i) {
629
+ b->qs[i] = qs[i];
630
+ }
631
+ }
632
+
633
+ kernel void kernel_convert_block_q5_0_noshuffle(
634
+ global struct block_q5_0 * src0,
351
635
  global uchar * dst_q,
636
+ global uint * dst_qh,
352
637
  global half * dst_d
353
638
  ) {
354
- global block_q8_0 * b = (global block_q8_0 *) src0 + get_global_id(0);
355
- global uchar * q = (global uchar *) dst_q + QK8_0*get_global_id(0);
356
- global half * d = (global half *) dst_d + get_global_id(0);
639
+ global struct block_q5_0 * b = (global struct block_q5_0 *) src0 + get_global_id(0);
640
+ global uchar * q = (global uchar *) dst_q + QK5_0/2*get_global_id(0);
641
+ global uint * qh = (global uint *) dst_qh + get_global_id(0);
642
+ global half * d = (global half *) dst_d + get_global_id(0);
357
643
 
358
644
  *d = b->d;
645
+ *qh = *((global uint *)(b->qh));
359
646
 
360
- for (int i = 0; i < QK8_0; ++i) {
361
- q[i] = b->qs[i];
647
+ for (int i = 0; i < QK5_0/4; ++i) {
648
+ uchar x0 = b->qs[2*i + 0];
649
+ uchar x1 = b->qs[2*i + 1];
650
+
651
+ q[i + 0 ] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
652
+ q[i + QK5_0/4] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
653
+
654
+ #ifdef ADRENO_GPU
655
+ if (get_global_id(0) == 65536*4096) {
656
+ printf("%04x - %02x\n", *(global ushort*)d, ((x0 & 0xF0) >> 4) | (x1 & 0xF0));
657
+ }
658
+ #endif
362
659
  }
363
660
  }
364
661
 
365
- kernel void kernel_restore_block_q8_0(
662
+ kernel void kernel_restore_block_q5_0_noshuffle(
366
663
  global uchar * src_q,
664
+ global uint * src_qh,
367
665
  global half * src_d,
368
- global block_q8_0 * dst
666
+ global struct block_q5_0 * dst,
667
+ uchar mask_0F,
668
+ uchar mask_F0
369
669
  ) {
370
- global block_q8_0 * b = (global block_q8_0 *) dst + get_global_id(0);
371
- global uchar * q = (global uchar *) src_q + QK8_0*get_global_id(0);
372
- global half * d = (global half *) src_d + get_global_id(0);
670
+ global struct block_q5_0 * b = (global struct block_q5_0 *) dst + get_global_id(0);
671
+ global uchar * q = (global uchar *) src_q + QK5_0/2*get_global_id(0);
672
+ global uint * qh = (global uint *) src_qh + get_global_id(0);
673
+ global half * d = (global half *) src_d + get_global_id(0);
373
674
 
374
675
  b->d = *d;
375
- for (int i = 0; i < QK8_0; ++i) {
376
- b->qs[i] = q[i];
676
+ *((global uint *)(b->qh)) = *qh;
677
+
678
+ for (int i = 0; i < QK5_0/4; ++i) {
679
+ uchar x0 = q[i + 0 ];
680
+ uchar x1 = q[i + QK5_0/4];
681
+
682
+ b->qs[2*i + 0] = convert_uchar((x0 & mask_0F) | ((x1 & mask_0F) << 4));
683
+ b->qs[2*i + 1] = convert_uchar(((x0 & mask_F0) >> 4) | (x1 & mask_F0));
377
684
  }
378
685
  }
379
686
 
380
- kernel void kernel_restore_block_q8_0_trans(
381
- global uchar * src_q,
382
- global half * src_d,
383
- global block_q8_0 * dst,
687
+ kernel void kernel_convert_block_q5_0_trans4_ns(
688
+ __global struct block_q5_0 * src0,
689
+ __global uint * dst_qs,
690
+ __global uint * dst_qh,
691
+ __global half * dst_d,
384
692
  uint ne00,
385
693
  uint ne01
386
- ){
387
- uint num_blk_per_row = ne00 / QK8_0;
694
+ ) {
695
+ uint i00 = get_global_id(1);
696
+ uint i01 = get_global_id(0);
697
+ uint i02 = get_global_id(2);
388
698
 
389
- global block_q8_0 * b = (global block_q8_0 *) dst + get_global_id(0) * num_blk_per_row;
390
- global uchar * q = (global uchar *) src_q + get_global_id(0) * 4; // 4 8-bit packed
391
- global half * d = (global half *) src_d + get_global_id(0);
699
+ if (i01 >= ne01) {
700
+ return;
701
+ }
392
702
 
393
- for (uint blk = 0; blk < num_blk_per_row; blk++) {
394
- b->d = *d;
703
+ uint ne00_blk = ne00 / QK5_0;
704
+ uint src_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
705
+ uint dst_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
706
+
707
+ global struct block_q5_0 * b = src0 + src_blk_offset;
708
+ dst_d[dst_blk_offset] = b->d;
709
+
710
+ dst_qh[dst_blk_offset] = ((global uint *)(&(b->qh[0])))[0];
711
+
712
+ // extract quantization and unshuffle
713
+ ushort8 pre_block = ((global ushort8 *)(&(b->qs[0])))[0];
714
+ ushort8 post_block = (ushort8)(0);
715
+
716
+ uchar * pre_block_ptr = (uchar *)(&pre_block);
717
+ uchar * post_block_ptr = (uchar *)(&post_block);
718
+
719
+ for (int i = 0; i < QK5_0 / 4; ++i) {
720
+ uchar x0 = pre_block_ptr[2*i + 0];
721
+ uchar x1 = pre_block_ptr[2*i + 1];
722
+
723
+ post_block_ptr[i + 0 ] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
724
+ post_block_ptr[i + QK5_0 / 4] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
725
+ }
726
+
727
+ uint4 q_block = as_uint4(post_block);
728
+
729
+ uint offset = i02 * ne00_blk * ne01 * 4 + i00 * ne01 * 4 + i01;
730
+ dst_qs[offset] = q_block.x;
731
+ dst_qs[offset + ne01] = q_block.y;
732
+ dst_qs[offset + ne01 * 2] = q_block.z;
733
+ dst_qs[offset + ne01 * 3] = q_block.w;
734
+ }
735
+
736
+ kernel void kernel_restore_block_q5_0_trans4_ns(
737
+ __global uint * src_qs,
738
+ __global uint * src_qh,
739
+ __global half * src_d,
740
+ __global struct block_q5_0 * dst0,
741
+ uint ne00,
742
+ uint ne01
743
+ ) {
744
+ int i00 = get_global_id(1);
745
+ uint i01 = get_global_id(0);
746
+ uint i02 = get_global_id(2);
747
+
748
+ if (i01 >= ne01) {
749
+ return;
750
+ }
751
+
752
+ uint ne00_blk = ne00 / QK5_0;
753
+ uint dst_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
754
+ uint src_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
755
+
756
+ __global struct block_q5_0 * b = dst0 + dst_blk_offset;
757
+ b->d = src_d[src_blk_offset];
758
+
759
+ ((__global uint *)(&(b->qh[0])))[0] = src_qh[src_blk_offset];
760
+
761
+ // collect transposed quantization parts for a block
762
+ uint src_q_offset = i02 * ne00_blk * ne01 * 4 + i00 * ne01 * 4 + i01;
763
+ uint4 q_block;
764
+ q_block.x = src_qs[src_q_offset];
765
+ q_block.y = src_qs[src_q_offset + ne01];
766
+ q_block.z = src_qs[src_q_offset + ne01 * 2];
767
+ q_block.w = src_qs[src_q_offset + ne01 * 3];
768
+
769
+ ushort8 post_block = as_ushort8(q_block);
770
+ ushort8 pre_block = (ushort8)(0);
771
+
772
+ uchar * pre_block_ptr = (uchar *)(&pre_block);
773
+ uchar * post_block_ptr = (uchar *)(&post_block);
774
+
775
+ for (int i = 0; i < QK5_0 / 4; ++i) {
776
+ uchar x0 = post_block_ptr[i + 0];
777
+ uchar x1 = post_block_ptr[i + QK5_0 / 4];
778
+
779
+ pre_block_ptr[2 * i + 0] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
780
+ pre_block_ptr[2 * i + 1] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
781
+ }
782
+
783
+ ((__global ushort8 *)(&(b->qs[0])))[0] = pre_block;
784
+ }
785
+
786
+ //------------------------------------------------------------------------------
787
+ // kernel_convert_block_q5_1
788
+ // Convert the block_q5_1 format to 4 separate arrays (AOS -> SOA).
789
+ // This kernel does not deshuffle the bits.
790
+ //------------------------------------------------------------------------------
791
+ kernel void kernel_convert_block_q5_1(
792
+ global struct block_q5_1 * src0,
793
+ global uchar * dst_qs,
794
+ global uint * dst_qh,
795
+ global half * dst_d,
796
+ global half * dst_m,
797
+ ulong n_blk
798
+ ) {
799
+ if (get_global_id(0) >= n_blk) {
800
+ return;
801
+ }
802
+
803
+ global struct block_q5_1 * b = (global struct block_q5_1 *) src0 + get_global_id(0);
804
+ global uchar * qs = (global uchar *) dst_qs + (QK5_1/2)*get_global_id(0);
805
+ global uint * qh = (global uint *) dst_qh + get_global_id(0);
806
+ global half * d = (global half *) dst_d + get_global_id(0);
807
+ global half * m = (global half *) dst_m + get_global_id(0);
808
+
809
+ *d = b->d;
810
+ *m = b->m;
811
+ *qh = *((global uint *)(b->qh));
812
+
813
+ for (int i = 0; i < QK5_1/2; ++i) {
814
+ qs[i] = b->qs[i];
815
+ }
816
+ }
817
+
818
+ kernel void kernel_restore_block_q5_1(
819
+ global uchar * src_qs,
820
+ global uint * src_qh,
821
+ global half * src_d,
822
+ global half * src_m,
823
+ global struct block_q5_1 * dst
824
+ ) {
825
+ global struct block_q5_1 * b = (global struct block_q5_1 *) dst + get_global_id(0);
826
+ global uchar * qs = (global uchar *) src_qs + (QK5_1/2)*get_global_id(0);
827
+ global uint * qh = (global uint *) src_qh + get_global_id(0);
828
+ global half * d = (global half *) src_d + get_global_id(0);
829
+ global half * m = (global half *) src_m + get_global_id(0);
830
+
831
+ b->d = *d;
832
+ b->m = *m;
833
+ *((global uint *)(b->qh)) = *qh;
834
+ for (int i = 0; i < QK5_1/2; ++i) {
835
+ b->qs[i] = qs[i];
836
+ }
837
+ }
838
+
839
+ kernel void kernel_convert_block_q5_1_noshuffle(
840
+ global struct block_q5_1 * src0,
841
+ global uchar * dst_q,
842
+ global uint * dst_qh,
843
+ global half * dst_d,
844
+ global half * dst_m
845
+ ) {
846
+ global struct block_q5_1 * b = (global struct block_q5_1 *) src0 + get_global_id(0);
847
+ global uchar * q = (global uchar *) dst_q + QK5_1/2*get_global_id(0);
848
+ global uint * qh = (global uint *) dst_qh + get_global_id(0);
849
+ global half * d = (global half *) dst_d + get_global_id(0);
850
+ global half * m = (global half *) dst_m + get_global_id(0);
851
+
852
+ *d = b->d;
853
+ *m = b->m;
854
+ *qh = *((global uint *)(b->qh));
855
+
856
+ for (int i = 0; i < QK5_1/4; ++i) {
857
+ uchar x0 = b->qs[2*i + 0];
858
+ uchar x1 = b->qs[2*i + 1];
859
+
860
+ q[i + 0 ] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
861
+ q[i + QK5_1/4] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
862
+
863
+ #ifdef ADRENO_GPU
864
+ if (get_global_id(0) == 65536*4096) {
865
+ printf("%04x - %02x\n", *(global ushort*)d, ((x0 & 0xF0) >> 4) | (x1 & 0xF0));
866
+ }
867
+ #endif
868
+ }
869
+ }
870
+
871
+ kernel void kernel_restore_block_q5_1_noshuffle(
872
+ global uchar * src_q,
873
+ global uint * src_qh,
874
+ global half * src_d,
875
+ global half * src_m,
876
+ global struct block_q5_1 * dst,
877
+ uchar mask_0F,
878
+ uchar mask_F0
879
+ ) {
880
+ global struct block_q5_1 * b = (global struct block_q5_1 *) dst + get_global_id(0);
881
+ global uchar * q = (global uchar *) src_q + QK5_1/2*get_global_id(0);
882
+ global uint * qh = (global uint *) src_qh + get_global_id(0);
883
+ global half * d = (global half *) src_d + get_global_id(0);
884
+ global half * m = (global half *) src_m + get_global_id(0);
885
+
886
+ b->d = *d;
887
+ b->m = *m;
888
+ *((global uint *)(b->qh)) = *qh;
889
+
890
+ for (int i = 0; i < QK5_1/4; ++i) {
891
+ uchar x0 = q[i + 0 ];
892
+ uchar x1 = q[i + QK5_1/4];
893
+
894
+ b->qs[2*i + 0] = convert_uchar((x0 & mask_0F) | ((x1 & mask_0F) << 4));
895
+ b->qs[2*i + 1] = convert_uchar(((x0 & mask_F0) >> 4) | (x1 & mask_F0));
896
+ }
897
+ }
898
+
899
+ kernel void kernel_convert_block_q5_1_trans4_ns(
900
+ __global struct block_q5_1 * src0,
901
+ __global uint * dst_qs,
902
+ __global uint * dst_qh,
903
+ __global half * dst_d,
904
+ __global half * dst_m,
905
+ uint ne00,
906
+ uint ne01
907
+ ) {
908
+ uint i00 = get_global_id(1);
909
+ uint i01 = get_global_id(0);
910
+ uint i02 = get_global_id(2);
911
+
912
+ if (i01 >= ne01) {
913
+ return;
914
+ }
915
+
916
+ uint ne00_blk = ne00 / QK5_1;
917
+ uint src_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
918
+ uint dst_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
919
+
920
+ global struct block_q5_1 * b = src0 + src_blk_offset;
921
+ dst_d[dst_blk_offset] = b->d;
922
+ dst_m[dst_blk_offset] = b->m;
923
+
924
+ dst_qh[dst_blk_offset] = ((global uint *)(&(b->qh[0])))[0];
925
+
926
+ // extract quantization and unshuffle
927
+ ushort8 pre_block = ((global ushort8 *)(&(b->qs[0])))[0];
928
+ ushort8 post_block = (ushort8)(0);
929
+
930
+ uchar * pre_block_ptr = (uchar *)(&pre_block);
931
+ uchar * post_block_ptr = (uchar *)(&post_block);
932
+
933
+ for (int i = 0; i < QK5_1 / 4; ++i) {
934
+ uchar x0 = pre_block_ptr[2*i + 0];
935
+ uchar x1 = pre_block_ptr[2*i + 1];
936
+
937
+ post_block_ptr[i + 0 ] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
938
+ post_block_ptr[i + QK5_1 / 4] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
939
+ }
940
+
941
+ uint4 q_block = as_uint4(post_block);
942
+
943
+ uint offset = i02 * ne00_blk * ne01 * 4 + i00 * ne01 * 4 + i01;
944
+ dst_qs[offset] = q_block.x;
945
+ dst_qs[offset + ne01] = q_block.y;
946
+ dst_qs[offset + ne01 * 2] = q_block.z;
947
+ dst_qs[offset + ne01 * 3] = q_block.w;
948
+ }
949
+
950
+ kernel void kernel_restore_block_q5_1_trans4_ns(
951
+ __global uint * src_qs,
952
+ __global uint * src_qh,
953
+ __global half * src_d,
954
+ __global half * src_m,
955
+ __global struct block_q5_1 * dst0,
956
+ uint ne00,
957
+ uint ne01
958
+ ) {
959
+ int i00 = get_global_id(1);
960
+ uint i01 = get_global_id(0);
961
+ uint i02 = get_global_id(2);
962
+
963
+ if (i01 >= ne01) {
964
+ return;
965
+ }
966
+
967
+ uint ne00_blk = ne00 / QK5_1;
968
+ uint dst_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
969
+ uint src_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
970
+
971
+ __global struct block_q5_1 * b = dst0 + dst_blk_offset;
972
+ b->d = src_d[src_blk_offset];
973
+ b->m = src_m[src_blk_offset];
974
+
975
+ ((__global uint *)(&(b->qh[0])))[0] = src_qh[src_blk_offset];
976
+
977
+ // collect transposed quantization parts for a block
978
+ uint src_q_offset = i02 * ne00_blk * ne01 * 4 + i00 * ne01 * 4 + i01;
979
+ uint4 q_block;
980
+ q_block.x = src_qs[src_q_offset];
981
+ q_block.y = src_qs[src_q_offset + ne01];
982
+ q_block.z = src_qs[src_q_offset + ne01 * 2];
983
+ q_block.w = src_qs[src_q_offset + ne01 * 3];
984
+
985
+ ushort8 post_block = as_ushort8(q_block);
986
+ ushort8 pre_block = (ushort8)(0);
987
+
988
+ uchar * pre_block_ptr = (uchar *)(&pre_block);
989
+ uchar * post_block_ptr = (uchar *)(&post_block);
990
+
991
+ for (int i = 0; i < QK5_1 / 4; ++i) {
992
+ uchar x0 = post_block_ptr[i + 0];
993
+ uchar x1 = post_block_ptr[i + QK5_1 / 4];
994
+
995
+ pre_block_ptr[2 * i + 0] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
996
+ pre_block_ptr[2 * i + 1] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
997
+ }
998
+ ((__global ushort8 *)(&(b->qs[0])))[0] = pre_block;
999
+ }
1000
+
1001
+ kernel void kernel_convert_block_q4_k_trans4_ns(
1002
+ __global struct block_q4_K * src0,
1003
+ __global uint * dst_q,
1004
+ __global half * dst_d,
1005
+ __global half * dst_dm,
1006
+ __global uchar * dst_s,
1007
+ uint ne00,
1008
+ uint ne01,
1009
+ uchar mask_0F,
1010
+ uchar mask_F0
1011
+ ) {
1012
+ uint i00 = get_global_id(1);
1013
+ uint i01 = get_global_id(0);
1014
+ uint i02 = get_global_id(2);
1015
+
1016
+ if (i01 >= ne01) {
1017
+ return;
1018
+ }
1019
+
1020
+ uint ne00_blk = ne00 / QK_K;
1021
+ uint src_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
1022
+ uint dst_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
1023
+
1024
+ __global struct block_q4_K * b = src0 + src_blk_offset;
1025
+
1026
+ dst_d [dst_blk_offset] = b->d;
1027
+ dst_dm[dst_blk_offset] = b->dm;
1028
+
1029
+ uint4 qv[8];
1030
+ uchar * qv_bytes = (uchar *)qv;
1031
+ for (int i = 0; i < QK_K / 64; ++i) {
1032
+ for (int j = 0; j < 16; ++j) {
1033
+ uchar x0 = b->q[i*32 + 2*j];
1034
+ uchar x1 = b->q[i*32 + 2*j + 1];
1035
+
1036
+ qv_bytes[i*32 + j ] = convert_uchar(x0 & mask_0F) | convert_uchar((x1 & mask_0F) << 4);
1037
+ qv_bytes[i*32 + j + 16] = convert_uchar((x0 & mask_F0) >> 4) | convert_uchar(x1 & mask_F0);
1038
+ }
1039
+ }
1040
+
1041
+ uint base = i02 * ne00_blk * ne01 * 32 + i00 * ne01 * 32 + i01;
1042
+ #pragma unroll
1043
+ for (int p = 0; p < 8; ++p) {
1044
+ uint4 v = qv[p];
1045
+ dst_q[base + (p * 4 + 0) * ne01] = v.x;
1046
+ dst_q[base + (p * 4 + 1) * ne01] = v.y;
1047
+ dst_q[base + (p * 4 + 2) * ne01] = v.z;
1048
+ dst_q[base + (p * 4 + 3) * ne01] = v.w;
1049
+ }
1050
+
1051
+ __global uchar * s_dst = dst_s + (i02 * ne01 + i01) * ne00_blk * K_SCALE_SIZE + i00 * K_SCALE_SIZE;
1052
+ #pragma unroll
1053
+ for (int i = 0; i < K_SCALE_SIZE; ++i) {
1054
+ s_dst[i] = b->s[i];
1055
+ }
1056
+ }
1057
+
1058
+ kernel void kernel_restore_block_q4_k_trans4_ns(
1059
+ __global uint * src_q,
1060
+ __global half * src_d,
1061
+ __global half * src_dm,
1062
+ __global uchar * src_s,
1063
+ __global struct block_q4_K * dst0,
1064
+ uint ne00,
1065
+ uint ne01,
1066
+ uchar mask_0F,
1067
+ uchar mask_F0
1068
+ ) {
1069
+ uint i00 = get_global_id(1); // block index along K
1070
+ uint i01 = get_global_id(0); // row index
1071
+ uint i02 = get_global_id(2); // batch index
1072
+
1073
+ if (i01 >= ne01) {
1074
+ return;
1075
+ }
1076
+
1077
+ uint ne00_blk = ne00 / QK_K;
1078
+
1079
+ uint src_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
1080
+ uint dst_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
1081
+
1082
+ __global struct block_q4_K * b = dst0 + dst_blk_offset;
1083
+
1084
+ b->d = src_d[src_blk_offset];
1085
+ b->dm = src_dm[src_blk_offset];
1086
+
1087
+ __global uchar * s_src = src_s + (i02 * ne01 + i01) * ne00_blk * K_SCALE_SIZE + i00 * K_SCALE_SIZE;
1088
+ for (int i = 0; i < K_SCALE_SIZE; ++i) {
1089
+ b->s[i] = s_src[i];
1090
+ }
1091
+
1092
+ uint base = i02 * ne00_blk * ne01 * 32 + i00 * ne01 * 32 + i01;
1093
+
1094
+ uint4 qv[8];
1095
+ for (int p = 0; p < 8; ++p) {
1096
+ qv[p].x = src_q[base + (p * 4 + 0) * ne01];
1097
+ qv[p].y = src_q[base + (p * 4 + 1) * ne01];
1098
+ qv[p].z = src_q[base + (p * 4 + 2) * ne01];
1099
+ qv[p].w = src_q[base + (p * 4 + 3) * ne01];
1100
+ }
1101
+
1102
+ uchar * qv_bytes = (uchar *)qv;
1103
+ for (int i = 0; i < QK_K / 64; ++i) {
1104
+ for (int j = 0; j < 16; ++j) {
1105
+ uchar lo = qv_bytes[i*32 + j];
1106
+ uchar hi = qv_bytes[i*32 + j + 16];
1107
+ b->q[i*32 + 2*j] = convert_uchar((lo & mask_0F) | ((hi & mask_0F) << 4));
1108
+ b->q[i*32 + 2*j + 1] = convert_uchar(((lo & mask_F0) >> 4) | (hi & mask_F0));
1109
+ }
1110
+ }
1111
+ }
1112
+
1113
+ kernel void kernel_convert_block_q5_k_trans4_ns(
1114
+ __global struct block_q5_K * src0,
1115
+ __global uint * dst_qs,
1116
+ __global uint * dst_qh,
1117
+ __global half * dst_d,
1118
+ __global half * dst_dm,
1119
+ __global uchar * dst_s,
1120
+ uint ne00,
1121
+ uint ne01,
1122
+ uchar mask_0F,
1123
+ uchar mask_F0
1124
+ ) {
1125
+ uint i00 = get_global_id(1);
1126
+ uint i01 = get_global_id(0);
1127
+ uint i02 = get_global_id(2);
1128
+
1129
+ if (i01 >= ne01) {
1130
+ return;
1131
+ }
1132
+
1133
+ uint ne00_blk = ne00 / QK_K;
1134
+ uint src_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
1135
+ uint dst_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
1136
+
1137
+ __global struct block_q5_K * b = src0 + src_blk_offset;
1138
+
1139
+ dst_d [dst_blk_offset] = b->d;
1140
+ dst_dm[dst_blk_offset] = b->dm;
1141
+
1142
+ for (int k = 0; k < 8; k++) {
1143
+ uchar b0 = 0, b1 = 0, b2 = 0, b3 = 0;
1144
+ for (int bit = 0; bit < 8; bit++) {
1145
+ b0 |= (uchar)(((b->qh[bit] >> k) & 1) << bit);
1146
+ b1 |= (uchar)(((b->qh[8 + bit] >> k) & 1) << bit);
1147
+ b2 |= (uchar)(((b->qh[16 + bit] >> k) & 1) << bit);
1148
+ b3 |= (uchar)(((b->qh[24 + bit] >> k) & 1) << bit);
1149
+ }
1150
+ uint packed = (uint)b0 | ((uint)b1 << 8) | ((uint)b2 << 16) | ((uint)b3 << 24);
1151
+ dst_qh[i01 + (i00 * 8 + k) * ne01 + i02 * ne00_blk * 8 * ne01] = packed;
1152
+ }
1153
+
1154
+ uint4 qv[8];
1155
+ uchar * qv_bytes = (uchar *)qv;
1156
+ for (int i = 0; i < QK_K / 64; ++i) {
1157
+ for (int j = 0; j < 16; ++j) {
1158
+ uchar x0 = b->qs[i*32 + 2*j];
1159
+ uchar x1 = b->qs[i*32 + 2*j + 1];
1160
+
1161
+ qv_bytes[i*32 + j ] = convert_uchar(x0 & mask_0F) | convert_uchar((x1 & mask_0F) << 4);
1162
+ qv_bytes[i*32 + j + 16] = convert_uchar((x0 & mask_F0) >> 4) | convert_uchar(x1 & mask_F0);
1163
+ }
1164
+ }
1165
+
1166
+ uint base = i02 * ne00_blk * ne01 * 32 + i00 * ne01 * 32 + i01;
1167
+ #pragma unroll
1168
+ for (int p = 0; p < 8; ++p) {
1169
+ uint4 v = qv[p];
1170
+ dst_qs[base + (p * 4 + 0) * ne01] = v.x;
1171
+ dst_qs[base + (p * 4 + 1) * ne01] = v.y;
1172
+ dst_qs[base + (p * 4 + 2) * ne01] = v.z;
1173
+ dst_qs[base + (p * 4 + 3) * ne01] = v.w;
1174
+ }
1175
+
1176
+ __global uchar * s_dst = dst_s + (i02 * ne01 + i01) * ne00_blk * K_SCALE_SIZE + i00 * K_SCALE_SIZE;
1177
+ #pragma unroll
1178
+ for (int i = 0; i < K_SCALE_SIZE; ++i) {
1179
+ s_dst[i] = b->s[i];
1180
+ }
1181
+ }
1182
+
1183
+ kernel void kernel_restore_block_q5_k_trans4_ns(
1184
+ __global uint * src_qs,
1185
+ __global uint * src_qh,
1186
+ __global half * src_d,
1187
+ __global half * src_dm,
1188
+ __global uchar * src_s,
1189
+ __global struct block_q5_K * dst0,
1190
+ uint ne00,
1191
+ uint ne01,
1192
+ uchar mask_0F,
1193
+ uchar mask_F0
1194
+ ) {
1195
+ uint i00 = get_global_id(1); // block index along K
1196
+ uint i01 = get_global_id(0); // row index
1197
+ uint i02 = get_global_id(2); // batch index
1198
+
1199
+ if (i01 >= ne01) {
1200
+ return;
1201
+ }
1202
+
1203
+ uint ne00_blk = ne00 / QK_K;
1204
+
1205
+ uint src_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
1206
+ uint dst_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
1207
+
1208
+ __global struct block_q5_K * b = dst0 + dst_blk_offset;
1209
+
1210
+ b->d = src_d[src_blk_offset];
1211
+ b->dm = src_dm[src_blk_offset];
1212
+
1213
+ for (int j = 0; j < 32; j++) b->qh[j] = 0;
1214
+ for (int k = 0; k < 8; k++) {
1215
+ uint packed = src_qh[i01 + (i00 * 8 + k) * ne01 + i02 * ne00_blk * 8 * ne01];
1216
+ uchar b0 = (uchar)(packed & 0xFF);
1217
+ uchar b1 = (uchar)((packed >> 8) & 0xFF);
1218
+ uchar b2 = (uchar)((packed >> 16) & 0xFF);
1219
+ uchar b3 = (uchar)((packed >> 24) & 0xFF);
1220
+ for (int bit = 0; bit < 8; bit++) {
1221
+ b->qh[bit] |= (uchar)(((b0 >> bit) & 1) << k);
1222
+ b->qh[8 + bit] |= (uchar)(((b1 >> bit) & 1) << k);
1223
+ b->qh[16 + bit] |= (uchar)(((b2 >> bit) & 1) << k);
1224
+ b->qh[24 + bit] |= (uchar)(((b3 >> bit) & 1) << k);
1225
+ }
1226
+ }
1227
+
1228
+ __global uchar * s_src = src_s + (i02 * ne01 + i01) * ne00_blk * K_SCALE_SIZE + i00 * K_SCALE_SIZE;
1229
+ for (int i = 0; i < K_SCALE_SIZE; ++i) {
1230
+ b->s[i] = s_src[i];
1231
+ }
1232
+
1233
+ uint base = i02 * ne00_blk * ne01 * 32 + i00 * ne01 * 32 + i01;
1234
+
1235
+ uint4 qv[8];
1236
+ for (int p = 0; p < 8; ++p) {
1237
+ qv[p].x = src_qs[base + (p * 4 + 0) * ne01];
1238
+ qv[p].y = src_qs[base + (p * 4 + 1) * ne01];
1239
+ qv[p].z = src_qs[base + (p * 4 + 2) * ne01];
1240
+ qv[p].w = src_qs[base + (p * 4 + 3) * ne01];
1241
+ }
1242
+
1243
+ uchar * qv_bytes = (uchar *)qv;
1244
+ for (int i = 0; i < QK_K / 64; ++i) {
1245
+ for (int j = 0; j < 16; ++j) {
1246
+ uchar lo = qv_bytes[i*32 + j];
1247
+ uchar hi = qv_bytes[i*32 + j + 16];
1248
+ b->qs[i*32 + 2*j] = convert_uchar((lo & mask_0F) | ((hi & mask_0F) << 4));
1249
+ b->qs[i*32 + 2*j + 1] = convert_uchar(((lo & mask_F0) >> 4) | (hi & mask_F0));
1250
+ }
1251
+ }
1252
+ }
1253
+
1254
+ kernel void kernel_convert_block_q6_k_trans4_ns(
1255
+ __global struct block_q6_K * src0,
1256
+ __global uint * dst_ql,
1257
+ __global uint * dst_qh,
1258
+ __global half * dst_d,
1259
+ __global char * dst_s,
1260
+ uint ne00,
1261
+ uint ne01,
1262
+ uchar mask_0F,
1263
+ uchar mask_F0
1264
+ ) {
1265
+ uint i00 = get_global_id(1);
1266
+ uint i01 = get_global_id(0);
1267
+ uint i02 = get_global_id(2);
1268
+
1269
+ if (i01 >= ne01) {
1270
+ return;
1271
+ }
1272
+
1273
+ uint ne00_blk = ne00 / QK_K;
1274
+
1275
+ uint src_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
1276
+ uint dst_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
1277
+
1278
+ __global struct block_q6_K * b = src0 + src_blk_offset;
1279
+
1280
+ dst_d[dst_blk_offset] = b->d;
1281
+
1282
+ uint4 qlv[8];
1283
+ uchar * qlv_bytes = (uchar *)qlv;
1284
+ for (int i = 0; i < 2; ++i) {
1285
+ for (int j = 0; j < 16; ++j) {
1286
+ uchar x0 = b->ql[i*64 + 2*j];
1287
+ uchar x1 = b->ql[i*64 + 2*j + 1];
1288
+ uchar x2 = b->ql[i*64 + 32 + 2*j];
1289
+ uchar x3 = b->ql[i*64 + 32 + 2*j + 1];
1290
+ qlv_bytes[i*64 + j ] = convert_uchar(x0 & mask_0F) | convert_uchar((x1 & mask_0F) << 4);
1291
+ qlv_bytes[i*64 + j + 16] = convert_uchar(x2 & mask_0F) | convert_uchar((x3 & mask_0F) << 4);
1292
+ qlv_bytes[i*64 + j + 32] = convert_uchar((x0 & mask_F0) >> 4) | convert_uchar(x1 & mask_F0);
1293
+ qlv_bytes[i*64 + j + 48] = convert_uchar((x2 & mask_F0) >> 4) | convert_uchar(x3 & mask_F0);
1294
+ }
1295
+ }
1296
+
1297
+ uint ql_base = i02 * ne00_blk * ne01 * 32 + i00 * ne01 * 32 + i01;
1298
+
1299
+ #pragma unroll
1300
+ for (int p = 0; p < 8; ++p) {
1301
+ uint4 v = qlv[p];
1302
+ dst_ql[ql_base + (p * 4 + 0) * ne01] = v.x;
1303
+ dst_ql[ql_base + (p * 4 + 1) * ne01] = v.y;
1304
+ dst_ql[ql_base + (p * 4 + 2) * ne01] = v.z;
1305
+ dst_ql[ql_base + (p * 4 + 3) * ne01] = v.w;
1306
+ }
1307
+
1308
+ uint qhv[16] = {0};
1309
+
1310
+ for (int n = 0; n < 2; ++n) {
1311
+ for (int l = 0; l < 32; ++l) {
1312
+ uchar h = b->qh[n*32 + l];
1313
+ int u = l / 16;
1314
+ int bit_pos = (l % 16) * 2;
1315
+ qhv[(n*4 + 0)*2 + u] |= ((uint)((h >> 0) & 0x03)) << bit_pos;
1316
+ qhv[(n*4 + 1)*2 + u] |= ((uint)((h >> 2) & 0x03)) << bit_pos;
1317
+ qhv[(n*4 + 2)*2 + u] |= ((uint)((h >> 4) & 0x03)) << bit_pos;
1318
+ qhv[(n*4 + 3)*2 + u] |= ((uint)((h >> 6) & 0x03)) << bit_pos;
1319
+ }
1320
+ }
1321
+
1322
+ uint qh_base = i02 * ne00_blk * ne01 * 16 + i00 * ne01 * 16 + i01;
1323
+
1324
+ for (int p = 0; p < 16; ++p) {
1325
+ dst_qh[qh_base + p * ne01] = qhv[p];
1326
+ }
1327
+
1328
+ __global char * s_dst = dst_s + (i02 * ne01 + i01) * ne00_blk * 16 + i00 * 16;
1329
+ #pragma unroll
1330
+ for (int i = 0; i < 16; ++i) {
1331
+ s_dst[i] = b->scales[i];
1332
+ }
1333
+ }
1334
+
1335
+ kernel void kernel_restore_block_q6_k_trans4_ns(
1336
+ __global uint * src_ql,
1337
+ __global uint * src_qh,
1338
+ __global half * src_d,
1339
+ __global char * src_s,
1340
+ __global struct block_q6_K * dst0,
1341
+ uint ne00,
1342
+ uint ne01,
1343
+ uchar mask_0F,
1344
+ uchar mask_F0
1345
+ ) {
1346
+ uint i00 = get_global_id(1); // block index along K
1347
+ uint i01 = get_global_id(0); // row index
1348
+ uint i02 = get_global_id(2); // batch index
1349
+
1350
+ if (i01 >= ne01) {
1351
+ return;
1352
+ }
1353
+
1354
+ uint ne00_blk = ne00 / QK_K;
1355
+
1356
+ uint src_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
1357
+ uint dst_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
1358
+
1359
+ __global struct block_q6_K * b = dst0 + dst_blk_offset;
1360
+
1361
+ b->d = src_d[src_blk_offset];
1362
+
1363
+ uint ql_base = i02 * ne00_blk * ne01 * 32 + i00 * ne01 * 32 + i01;
1364
+ uint4 qlv[8];
1365
+ for (int p = 0; p < 8; ++p) {
1366
+ qlv[p].x = src_ql[ql_base + (p * 4 + 0) * ne01];
1367
+ qlv[p].y = src_ql[ql_base + (p * 4 + 1) * ne01];
1368
+ qlv[p].z = src_ql[ql_base + (p * 4 + 2) * ne01];
1369
+ qlv[p].w = src_ql[ql_base + (p * 4 + 3) * ne01];
1370
+ }
1371
+
1372
+ uchar * qlv_bytes = (uchar *)qlv;
1373
+ for (int i = 0; i < 2; ++i) {
1374
+ for (int j = 0; j < 16; ++j) {
1375
+ uchar lo_02 = qlv_bytes[i*64 + j];
1376
+ uchar lo_13 = qlv_bytes[i*64 + j + 16];
1377
+ uchar hi_02 = qlv_bytes[i*64 + j + 32];
1378
+ uchar hi_13 = qlv_bytes[i*64 + j + 48];
1379
+ b->ql[i*64 + 2*j] = convert_uchar((lo_02 & mask_0F) | ((hi_02 & mask_0F) << 4));
1380
+ b->ql[i*64 + 2*j + 1] = convert_uchar(((lo_02 & mask_F0) >> 4) | (hi_02 & mask_F0));
1381
+ b->ql[i*64 + 32 + 2*j] = convert_uchar((lo_13 & mask_0F) | ((hi_13 & mask_0F) << 4));
1382
+ b->ql[i*64 + 32 + 2*j + 1] = convert_uchar(((lo_13 & mask_F0) >> 4) | (hi_13 & mask_F0));
1383
+ }
1384
+ }
1385
+
1386
+ uint qh_base = i02 * ne00_blk * ne01 * 16 + i00 * ne01 * 16 + i01;
1387
+ uint qhv[16];
1388
+ for (int p = 0; p < 16; ++p) {
1389
+ qhv[p] = src_qh[qh_base + p * ne01];
1390
+ }
1391
+
1392
+ for (int n = 0; n < 2; ++n) {
1393
+ for (int l = 0; l < 32; ++l) {
1394
+ int u = l / 16;
1395
+ int bit_pos = (l % 16) * 2;
1396
+ uchar v0 = (uchar)((qhv[(n*4 + 0)*2 + u] >> bit_pos) & 0x03);
1397
+ uchar v1 = (uchar)((qhv[(n*4 + 1)*2 + u] >> bit_pos) & 0x03);
1398
+ uchar v2 = (uchar)((qhv[(n*4 + 2)*2 + u] >> bit_pos) & 0x03);
1399
+ uchar v3 = (uchar)((qhv[(n*4 + 3)*2 + u] >> bit_pos) & 0x03);
1400
+ b->qh[n*32 + l] = v0 | (v1 << 2) | (v2 << 4) | (v3 << 6);
1401
+ }
1402
+ }
1403
+
1404
+ __global char * s_src = src_s + (i02 * ne01 + i01) * ne00_blk * 16 + i00 * 16;
1405
+ for (int i = 0; i < 16; ++i) {
1406
+ b->scales[i] = s_src[i];
1407
+ }
1408
+ }
1409
+
1410
+ //------------------------------------------------------------------------------
1411
+ // block_mxfp4
1412
+ //------------------------------------------------------------------------------
1413
+ #define QK_MXFP4 32
1414
+ struct block_mxfp4 {
1415
+ uchar e; // E8M0
1416
+ uchar qs[QK_MXFP4 / 2];
1417
+ };
1418
+
1419
+ //------------------------------------------------------------------------------
1420
+ // kernel_convert_block_mxfp4
1421
+ // Convert the block_mxfp4 format to 2 separate arrays (AOS -> SOA).
1422
+ // This kernel does not deshuffle the bits.
1423
+ //------------------------------------------------------------------------------
1424
+ kernel void kernel_convert_block_mxfp4(
1425
+ global struct block_mxfp4 * src0,
1426
+ global uchar * dst_q,
1427
+ global uchar * dst_e
1428
+ ) {
1429
+ global struct block_mxfp4 * b = (global struct block_mxfp4 *) src0 + get_global_id(0);
1430
+ global uchar * q = (global uchar *) dst_q + QK_MXFP4 / 2 * get_global_id(0);
1431
+ global uchar * e = (global uchar *) dst_e + get_global_id(0);
1432
+
1433
+ *e = b->e;
1434
+
1435
+ for (int i = 0; i < QK_MXFP4 / 2; ++i) {
1436
+ q[i] = b->qs[i];
1437
+ }
1438
+ }
1439
+
1440
+ kernel void kernel_convert_block_mxfp4_trans(
1441
+ global struct block_mxfp4 * src0,
1442
+ __global uint4 * dst_q,
1443
+ __global uchar * dst_e,
1444
+ uint ne00,
1445
+ uint ne01
1446
+ ) {
1447
+ int i00 = get_global_id(1);
1448
+ uint i01 = get_global_id(0);
1449
+ uint i02 = get_global_id(2);
1450
+
1451
+ uint ne00_blk = ne00 / QK_MXFP4;
1452
+ uint src_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
1453
+ uint dst_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
1454
+
1455
+ global struct block_mxfp4 * b = src0 + src_blk_offset;
1456
+
1457
+ dst_q[dst_blk_offset] = ((global uint4 *)(&(b->qs[0])))[0];
1458
+ dst_e[dst_blk_offset] = b->e;
1459
+ }
1460
+
1461
+ kernel void kernel_restore_block_mxfp4(
1462
+ global uchar * src_q,
1463
+ global half * src_e,
1464
+ global struct block_mxfp4 * dst
1465
+ ) {
1466
+ global struct block_mxfp4 * b = (global struct block_mxfp4 *) dst + get_global_id(0);
1467
+ global uchar * q = (global uchar *) src_q + QK_MXFP4 / 2 * get_global_id(0);
1468
+ global uchar * e = (global uchar *) src_e + get_global_id(0);
1469
+
1470
+ b->e = *e;
1471
+ for (int i = 0; i < QK_MXFP4 / 2; ++i) {
1472
+ b->qs[i] = q[i];
1473
+ }
1474
+ }
1475
+
1476
+ kernel void kernel_restore_block_mxfp4_trans(
1477
+ __global uint4 * src_q,
1478
+ __global uchar * src_e,
1479
+ global struct block_mxfp4 * dst,
1480
+ uint ne00,
1481
+ uint ne01
1482
+ ) {
1483
+ int i00 = get_global_id(1);
1484
+ uint i01 = get_global_id(0);
1485
+ uint i02 = get_global_id(2);
1486
+
1487
+ uint ne00_blk = ne00 / QK_MXFP4;
1488
+ uint src_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
1489
+ uint dst_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
1490
+
1491
+ global struct block_mxfp4 * b = dst + dst_blk_offset;
1492
+
1493
+ ((global uint4 *)(&(b->qs[0])))[0] = src_q[src_blk_offset];
1494
+ b->e = src_e[src_blk_offset];
1495
+ }
1496
+
1497
+ kernel void kernel_convert_block_mxfp4_trans4_ns(
1498
+ global struct block_mxfp4 * src0,
1499
+ __global uint * dst_q,
1500
+ __global uchar * dst_e,
1501
+ uint ne00,
1502
+ uint ne01
1503
+ ) {
1504
+ uint i00 = get_global_id(1);
1505
+ uint i01 = get_global_id(0);
1506
+ uint i02 = get_global_id(2);
1507
+
1508
+ if (i01 >= ne01) {
1509
+ return;
1510
+ }
1511
+
1512
+ uint ne00_blk = ne00 / QK_MXFP4;
1513
+ uint src_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
1514
+ uint dst_blk_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
1515
+
1516
+ global struct block_mxfp4 * b = src0 + src_blk_offset;
1517
+ dst_e[dst_blk_offset] = b->e;
1518
+
1519
+ // extract quantization and unshuffle
1520
+ ushort8 pre_block = ((global ushort8 *)(&(b->qs[0])))[0];
1521
+
1522
+ ushort8 post_block = (ushort8)(0);
1523
+
1524
+ uchar * pre_block_ptr = (uchar *)(&pre_block);
1525
+ uchar * post_block_ptr = (uchar *)(&post_block);
1526
+
1527
+ for (int i = 0; i < QK_MXFP4 / 4; ++i) {
1528
+ uchar x0 = pre_block_ptr[2*i + 0];
1529
+ uchar x1 = pre_block_ptr[2*i + 1];
1530
+
1531
+ post_block_ptr[i + 0 ] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
1532
+ post_block_ptr[i + QK_MXFP4 / 4] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
1533
+ }
1534
+
1535
+ uint4 q_block = as_uint4(post_block);
1536
+
1537
+ uint offset = i02 * ne00_blk * ne01 * 4 + i00 * ne01 * 4 + i01;
1538
+ dst_q[offset] = q_block.x;
1539
+ dst_q[offset + ne01] = q_block.y;
1540
+ dst_q[offset + ne01 * 2] = q_block.z;
1541
+ dst_q[offset + ne01 * 3] = q_block.w;
1542
+ }
1543
+
1544
+ kernel void kernel_restore_block_mxfp4_trans4_ns(
1545
+ __global uint * src_q,
1546
+ __global uchar * src_e,
1547
+ __global struct block_mxfp4 * dst0,
1548
+ uint ne00,
1549
+ uint ne01
1550
+ ) {
1551
+ uint i00 = get_global_id(1);
1552
+ uint i01 = get_global_id(0);
1553
+ uint i02 = get_global_id(2);
1554
+
1555
+ if (i01 >= ne01) {
1556
+ return;
1557
+ }
1558
+
1559
+ uint ne00_blk = ne00 / QK_MXFP4;
1560
+ uint dst_blk_offset = i00 + i01 * ne00_blk + i02 * ne00_blk * ne01;
1561
+ uint src_d_offset = i01 + i00 * ne01 + i02 * ne00_blk * ne01;
1562
+
1563
+ __global struct block_mxfp4 * b = dst0 + dst_blk_offset;
1564
+ b->e = src_e[src_d_offset];
1565
+
1566
+ // collect transposed quantization parts for a block
1567
+ uint src_q_offset = i02 * ne00_blk * ne01 * 4 + i00 * ne01 * 4 + i01;
1568
+ uint4 q_block;
1569
+ q_block.x = src_q[src_q_offset];
1570
+ q_block.y = src_q[src_q_offset + ne01];
1571
+ q_block.z = src_q[src_q_offset + ne01 * 2];
1572
+ q_block.w = src_q[src_q_offset + ne01 * 3];
1573
+
1574
+ ushort8 post_block = as_ushort8(q_block);
1575
+ ushort8 pre_block = (ushort8)(0);
1576
+
1577
+ uchar * pre_block_ptr = (uchar *)(&pre_block);
1578
+ uchar * post_block_ptr = (uchar *)(&post_block);
1579
+
1580
+ for (int i = 0; i < QK_MXFP4 / 4; ++i) {
1581
+ uchar x0 = post_block_ptr[i + 0];
1582
+ uchar x1 = post_block_ptr[i + QK_MXFP4 / 4];
1583
+
1584
+ pre_block_ptr[2 * i + 0] = convert_uchar(x0 & 0x0F) | convert_uchar((x1 & 0x0F) << 4);
1585
+ pre_block_ptr[2 * i + 1] = convert_uchar((x0 & 0xF0) >> 4) | convert_uchar(x1 & 0xF0);
1586
+ }
1587
+
1588
+ ((__global ushort8 *)(&(b->qs[0])))[0] = pre_block;
1589
+ }
1590
+
1591
+
1592
+ //------------------------------------------------------------------------------
1593
+ // block_q8_0
1594
+ //------------------------------------------------------------------------------
1595
+ typedef struct {
1596
+ half d; // delta
1597
+ char qs[QK8_0]; // quants
1598
+ } block_q8_0;
1599
+
1600
+ kernel void kernel_convert_block_q8_0(
1601
+ global block_q8_0 * src0,
1602
+ global uchar * dst_q,
1603
+ global half * dst_d
1604
+ ) {
1605
+ global block_q8_0 * b = (global block_q8_0 *) src0 + get_global_id(0);
1606
+ global uchar * q = (global uchar *) dst_q + QK8_0*get_global_id(0);
1607
+ global half * d = (global half *) dst_d + get_global_id(0);
1608
+
1609
+ *d = b->d;
1610
+
1611
+ for (int i = 0; i < QK8_0; ++i) {
1612
+ q[i] = b->qs[i];
1613
+ }
1614
+ }
1615
+
1616
+ kernel void kernel_restore_block_q8_0(
1617
+ global uchar * src_q,
1618
+ global half * src_d,
1619
+ global block_q8_0 * dst
1620
+ ) {
1621
+ global block_q8_0 * b = (global block_q8_0 *) dst + get_global_id(0);
1622
+ global uchar * q = (global uchar *) src_q + QK8_0*get_global_id(0);
1623
+ global half * d = (global half *) src_d + get_global_id(0);
1624
+
1625
+ b->d = *d;
1626
+ for (int i = 0; i < QK8_0; ++i) {
1627
+ b->qs[i] = q[i];
1628
+ }
1629
+ }
1630
+
1631
+ // View-aware AoS q8_0 -> f32 dequant (f32/f32 FA path).
1632
+ kernel void kernel_dequant_q8_0_f32_view_aos(
1633
+ global char * src,
1634
+ ulong src_offset,
1635
+ ulong src_nb1,
1636
+ ulong src_nb2,
1637
+ ulong src_nb3,
1638
+ int nblk0,
1639
+ int ne1,
1640
+ int ne2,
1641
+ int ne3,
1642
+ global float * dst
1643
+ ) {
1644
+ int blk_i0 = get_global_id(0);
1645
+ int i1 = get_global_id(1);
1646
+ int batch = get_global_id(2);
1647
+
1648
+ if (blk_i0 >= nblk0) return;
1649
+ if (i1 >= ne1) return;
1650
+
1651
+ int i2 = batch % ne2;
1652
+ int i3 = batch / ne2;
1653
+ if (i3 >= ne3) return;
1654
+
1655
+ global char * block = src + src_offset + (ulong)i3*src_nb3 + (ulong)i2*src_nb2 + (ulong)i1*src_nb1 + (ulong)blk_i0 * (2 + QK8_0);
1656
+ float d = vload_half(0, (global half *)block);
1657
+ global char * qs = block + 2;
1658
+
1659
+ ulong dst_row_base = ((ulong)i3 * ne2 * ne1 + (ulong)i2 * ne1 + (ulong)i1) * nblk0;
1660
+ global float * out = dst + (dst_row_base + blk_i0) * QK8_0;
1661
+
1662
+ for (int i = 0; i < QK8_0; ++i) {
1663
+ out[i] = d * (float)qs[i];
1664
+ }
1665
+ }
1666
+
1667
+ // View-aware AoS q8_0 -> f16 dequant. Rows tight, batch strides may be gapped.
1668
+ kernel void kernel_dequant_q8_0_f16_view_aos(
1669
+ global char * src,
1670
+ ulong src_offset,
1671
+ ulong src_nb1,
1672
+ ulong src_nb2,
1673
+ ulong src_nb3,
1674
+ int nblk0,
1675
+ int ne1,
1676
+ int ne2,
1677
+ int ne3,
1678
+ global half * dst
1679
+ ) {
1680
+ int blk_i0 = get_global_id(0);
1681
+ int i1 = get_global_id(1);
1682
+ int batch = get_global_id(2);
1683
+
1684
+ if (blk_i0 >= nblk0) return;
1685
+ if (i1 >= ne1) return;
1686
+
1687
+ int i2 = batch % ne2;
1688
+ int i3 = batch / ne2;
1689
+ if (i3 >= ne3) return;
1690
+
1691
+ global char * block = src + src_offset + (ulong)i3*src_nb3 + (ulong)i2*src_nb2 + (ulong)i1*src_nb1 + (ulong)blk_i0 * (2 + QK8_0);
1692
+ float d = vload_half(0, (global half *)block);
1693
+ global char * qs = block + 2;
1694
+
1695
+ ulong dst_row_base = ((ulong)i3 * ne2 * ne1 + (ulong)i2 * ne1 + (ulong)i1) * nblk0;
1696
+ global half * out = dst + (dst_row_base + blk_i0) * QK8_0;
1697
+
1698
+ for (int i = 0; i < QK8_0; ++i) {
1699
+ out[i] = (half)(d * (float)qs[i]);
1700
+ }
1701
+ }
1702
+
1703
+ // View-aware AoS q4_0 -> f32 dequant (mirrors the q8_0 view variant).
1704
+ kernel void kernel_dequant_q4_0_f32_view_aos(
1705
+ global char * src,
1706
+ ulong src_offset,
1707
+ ulong src_nb1,
1708
+ ulong src_nb2,
1709
+ ulong src_nb3,
1710
+ int nblk0,
1711
+ int ne1,
1712
+ int ne2,
1713
+ int ne3,
1714
+ global float * dst
1715
+ ) {
1716
+ int blk_i0 = get_global_id(0);
1717
+ int i1 = get_global_id(1);
1718
+ int batch = get_global_id(2);
1719
+
1720
+ if (blk_i0 >= nblk0) return;
1721
+ if (i1 >= ne1) return;
1722
+
1723
+ int i2 = batch % ne2;
1724
+ int i3 = batch / ne2;
1725
+ if (i3 >= ne3) return;
1726
+
1727
+ global char * block = src + src_offset + (ulong)i3*src_nb3 + (ulong)i2*src_nb2 + (ulong)i1*src_nb1 + (ulong)blk_i0 * (2 + QK4_0/2);
1728
+ float d = vload_half(0, (global half *)block);
1729
+ global uchar * qs = (global uchar *)(block + 2);
1730
+
1731
+ ulong dst_row_base = ((ulong)i3 * ne2 * ne1 + (ulong)i2 * ne1 + (ulong)i1) * nblk0;
1732
+ global float * out = dst + (dst_row_base + blk_i0) * QK4_0;
1733
+
1734
+ for (int i = 0; i < QK4_0/2; ++i) {
1735
+ uchar byte = qs[i];
1736
+ int q0 = (int)(byte & 0x0F) - 8;
1737
+ int q1 = (int)(byte >> 4) - 8;
1738
+ out[i] = d * (float)q0;
1739
+ out[i + QK4_0/2] = d * (float)q1;
1740
+ }
1741
+ }
1742
+
1743
+ // View-aware AoS q4_0 -> f16 dequant (mirrors the q8_0 view variant).
1744
+ kernel void kernel_dequant_q4_0_f16_view_aos(
1745
+ global char * src,
1746
+ ulong src_offset,
1747
+ ulong src_nb1,
1748
+ ulong src_nb2,
1749
+ ulong src_nb3,
1750
+ int nblk0,
1751
+ int ne1,
1752
+ int ne2,
1753
+ int ne3,
1754
+ global half * dst
1755
+ ) {
1756
+ int blk_i0 = get_global_id(0);
1757
+ int i1 = get_global_id(1);
1758
+ int batch = get_global_id(2);
1759
+
1760
+ if (blk_i0 >= nblk0) return;
1761
+ if (i1 >= ne1) return;
1762
+
1763
+ int i2 = batch % ne2;
1764
+ int i3 = batch / ne2;
1765
+ if (i3 >= ne3) return;
1766
+
1767
+ global char * block = src + src_offset + (ulong)i3*src_nb3 + (ulong)i2*src_nb2 + (ulong)i1*src_nb1 + (ulong)blk_i0 * (2 + QK4_0/2);
1768
+ float d = vload_half(0, (global half *)block);
1769
+ global uchar * qs = (global uchar *)(block + 2);
1770
+
1771
+ ulong dst_row_base = ((ulong)i3 * ne2 * ne1 + (ulong)i2 * ne1 + (ulong)i1) * nblk0;
1772
+ global half * out = dst + (dst_row_base + blk_i0) * QK4_0;
1773
+
1774
+ for (int i = 0; i < QK4_0/2; ++i) {
1775
+ uchar byte = qs[i];
1776
+ int q0 = (int)(byte & 0x0F) - 8;
1777
+ int q1 = (int)(byte >> 4) - 8;
1778
+ out[i] = (half)(d * (float)q0);
1779
+ out[i + QK4_0/2] = (half)(d * (float)q1);
1780
+ }
1781
+ }
1782
+
1783
+ kernel void kernel_restore_block_q8_0_trans(
1784
+ global uchar * src_q,
1785
+ global half * src_d,
1786
+ global block_q8_0 * dst,
1787
+ uint ne00,
1788
+ uint ne01
1789
+ ){
1790
+ uint num_blk_per_row = ne00 / QK8_0;
1791
+
1792
+ global block_q8_0 * b = (global block_q8_0 *) dst + get_global_id(0) * num_blk_per_row;
1793
+ global uchar * q = (global uchar *) src_q + get_global_id(0) * 4; // 4 8-bit packed
1794
+ global half * d = (global half *) src_d + get_global_id(0);
1795
+
1796
+ for (uint blk = 0; blk < num_blk_per_row; blk++) {
1797
+ b->d = *d;
395
1798
 
396
1799
  for (uint i = 0; i < QK8_0; i+=4) {
397
1800
  b->qs[i] = q[0];
@@ -408,6 +1811,288 @@ kernel void kernel_restore_block_q8_0_trans(
408
1811
  }
409
1812
  }
410
1813
 
1814
+ //------------------------------------------------------------------------------
1815
+ // kernel_convert_block_q4_K
1816
+ // Convert the block_q4_K format to 4 separate arrays (AOS -> SOA).
1817
+ // This kernel does not deshuffle the bits.
1818
+ // Each thread processes a super block.
1819
+ // Mask args are just to keep the signature consistent with the no-shuffle
1820
+ // version and they are not used in this kernel.
1821
+ //------------------------------------------------------------------------------
1822
+ kernel void kernel_convert_block_q4_K(
1823
+ global struct block_q4_K * src0,
1824
+ global uchar * dst_q,
1825
+ global uchar * dst_s,
1826
+ global half * dst_d,
1827
+ global half * dst_dm,
1828
+ uchar mask_0F,
1829
+ uchar mask_F0
1830
+ ) {
1831
+ global struct block_q4_K * b = (global struct block_q4_K *) src0 + get_global_id(0);
1832
+ global uchar * q = (global uchar *) dst_q + QK_K/2*get_global_id(0);
1833
+ global uchar * s = (global uchar *) dst_s + K_SCALE_SIZE*get_global_id(0);
1834
+ global half * d = (global half *) dst_d + get_global_id(0);
1835
+ global half * dm = (global half *) dst_dm + get_global_id(0);
1836
+
1837
+ *d = b->d;
1838
+ *dm = b->dm;
1839
+
1840
+ for (int i = 0; i < QK_K/2; ++i) {
1841
+ q[i] = b->q[i];
1842
+ }
1843
+ for (int i = 0; i < K_SCALE_SIZE; ++i) {
1844
+ s[i] = b->s[i];
1845
+ }
1846
+ }
1847
+
1848
+ // Restore block_q4_K from flattened arrays.
1849
+ // Each thread processes a super block.
1850
+ // Mask args are just to keep the signature consistent with the no-shuffle ones.
1851
+ kernel void kernel_restore_block_q4_K(
1852
+ global uchar * src_q,
1853
+ global uchar * src_s,
1854
+ global half * src_d,
1855
+ global half * src_dm,
1856
+ global struct block_q4_K * dst,
1857
+ uchar mask_0F,
1858
+ uchar mask_F0
1859
+ ) {
1860
+ global struct block_q4_K * b = (global struct block_q4_K *) dst + get_global_id(0);
1861
+ global uchar * q = (global uchar *) src_q + QK_K/2*get_global_id(0);
1862
+ global uchar * s = (global uchar *) src_s + K_SCALE_SIZE*get_global_id(0);
1863
+ global half * d = (global half *) src_d + get_global_id(0);
1864
+ global half * dm = (global half *) src_dm + get_global_id(0);
1865
+
1866
+ b->d = *d;
1867
+ b->dm = *dm;
1868
+
1869
+ for (int i = 0; i < QK_K/2; ++i) {
1870
+ b->q[i] = q[i];
1871
+ }
1872
+ for (int i = 0; i < K_SCALE_SIZE; ++i) {
1873
+ b->s[i] = s[i];
1874
+ }
1875
+ }
1876
+
1877
+ kernel void kernel_convert_block_q4_K_noshuffle(
1878
+ global struct block_q4_K * src0,
1879
+ global uchar * dst_q,
1880
+ global uchar * dst_s,
1881
+ global half * dst_d,
1882
+ global half * dst_dm,
1883
+ uchar mask_0F,
1884
+ uchar mask_F0
1885
+ ) {
1886
+ global struct block_q4_K * b = (global struct block_q4_K *) src0 + get_global_id(0);
1887
+ global uchar * q = (global uchar *) dst_q + QK_K/2 * get_global_id(0);
1888
+ global uchar * s = (global uchar *) dst_s + K_SCALE_SIZE * get_global_id(0);
1889
+ global half * d = (global half *) dst_d + get_global_id(0);
1890
+ global half * dm = (global half *) dst_dm + get_global_id(0);
1891
+
1892
+ *d = b->d;
1893
+ *dm = b->dm;
1894
+
1895
+ for (int i = 0; i < QK_K / 64; ++i) {
1896
+ for (int j = 0; j < 16; ++j) {
1897
+ uchar x0 = b->q[i*32 + 2*j];
1898
+ uchar x1 = b->q[i*32 + 2*j + 1];
1899
+ q[i*32 + j] = convert_uchar(x0 & mask_0F) | convert_uchar((x1 & mask_0F) << 4);
1900
+ q[i*32 + j + 16] = convert_uchar((x0 & mask_F0) >> 4) | convert_uchar(x1 & mask_F0);
1901
+ }
1902
+ }
1903
+
1904
+ for (int i = 0; i < K_SCALE_SIZE; ++i) {
1905
+ s[i] = b->s[i];
1906
+ }
1907
+ }
1908
+
1909
+ kernel void kernel_restore_block_q4_K_noshuffle(
1910
+ global uchar * src_q,
1911
+ global uchar * src_s,
1912
+ global half * src_d,
1913
+ global half * src_dm,
1914
+ global struct block_q4_K * dst,
1915
+ uchar mask_0F,
1916
+ uchar mask_F0
1917
+ ) {
1918
+ global struct block_q4_K * b = (global struct block_q4_K *) dst + get_global_id(0);
1919
+ global uchar * q = (global uchar *) src_q + QK_K/2 * get_global_id(0);
1920
+ global uchar * s = (global uchar *) src_s + K_SCALE_SIZE * get_global_id(0);
1921
+ global half * d = (global half *) src_d + get_global_id(0);
1922
+ global half * dm = (global half *) src_dm + get_global_id(0);
1923
+
1924
+ b->d = *d;
1925
+ b->dm = *dm;
1926
+
1927
+ for (int i = 0; i < QK_K / 64; ++i) {
1928
+ for (int j = 0; j < 16; ++j) {
1929
+ uchar lo = q[i*32 + j];
1930
+ uchar hi = q[i*32 + j + 16];
1931
+ b->q[i*32 + 2*j] = convert_uchar((lo & mask_0F) | ((hi & mask_0F) << 4));
1932
+ b->q[i*32 + 2*j + 1] = convert_uchar(((lo & mask_F0) >> 4) | (hi & mask_F0));
1933
+ }
1934
+ }
1935
+
1936
+ for (int i = 0; i < K_SCALE_SIZE; ++i) {
1937
+ b->s[i] = s[i];
1938
+ }
1939
+ }
1940
+
1941
+ //------------------------------------------------------------------------------
1942
+ // kernel_convert_block_q5_K
1943
+ // Convert the block_q5_K format to 5 separate arrays (AOS -> SOA).
1944
+ // Each thread processes a super block.
1945
+ //------------------------------------------------------------------------------
1946
+ kernel void kernel_convert_block_q5_K(
1947
+ global struct block_q5_K * src0,
1948
+ global uchar * dst_q,
1949
+ global uchar * dst_qh,
1950
+ global uchar * dst_s,
1951
+ global half * dst_d,
1952
+ global half * dst_dm,
1953
+ uchar mask_0F,
1954
+ uchar mask_F0
1955
+ ) {
1956
+ global struct block_q5_K * b = (global struct block_q5_K *) src0 + get_global_id(0);
1957
+ global uchar * q = (global uchar *) dst_q + QK_K/2*get_global_id(0);
1958
+ global uchar * qh = (global uchar *) dst_qh + QK_K/8*get_global_id(0);
1959
+ global uchar * s = (global uchar *) dst_s + K_SCALE_SIZE*get_global_id(0);
1960
+ global half * d = (global half *) dst_d + get_global_id(0);
1961
+ global half * dm = (global half *) dst_dm + get_global_id(0);
1962
+
1963
+ *d = b->d;
1964
+ *dm = b->dm;
1965
+
1966
+ for (int i = 0; i < QK_K/2; ++i) {
1967
+ q[i] = b->qs[i];
1968
+ }
1969
+ for (int i = 0; i < QK_K/8; ++i) {
1970
+ qh[i] = b->qh[i];
1971
+ }
1972
+ for (int i = 0; i < K_SCALE_SIZE; ++i) {
1973
+ s[i] = b->s[i];
1974
+ }
1975
+ }
1976
+
1977
+ // Restore block_q5_K from flattened arrays.
1978
+ // Each thread processes a super block.
1979
+ kernel void kernel_restore_block_q5_K(
1980
+ global uchar * src_q,
1981
+ global uchar * src_qh,
1982
+ global uchar * src_s,
1983
+ global half * src_d,
1984
+ global half * src_dm,
1985
+ global struct block_q5_K * dst,
1986
+ uchar mask_0F,
1987
+ uchar mask_F0
1988
+ ) {
1989
+ global struct block_q5_K * b = (global struct block_q5_K *) dst + get_global_id(0);
1990
+ global uchar * q = (global uchar *) src_q + QK_K/2*get_global_id(0);
1991
+ global uchar * qh = (global uchar *) src_qh + QK_K/8*get_global_id(0);
1992
+ global uchar * s = (global uchar *) src_s + K_SCALE_SIZE*get_global_id(0);
1993
+ global half * d = (global half *) src_d + get_global_id(0);
1994
+ global half * dm = (global half *) src_dm + get_global_id(0);
1995
+
1996
+ b->d = *d;
1997
+ b->dm = *dm;
1998
+
1999
+ for (int i = 0; i < QK_K/2; ++i) {
2000
+ b->qs[i] = q[i];
2001
+ }
2002
+ for (int i = 0; i < QK_K/8; ++i) {
2003
+ b->qh[i] = qh[i];
2004
+ }
2005
+ for (int i = 0; i < K_SCALE_SIZE; ++i) {
2006
+ b->s[i] = s[i];
2007
+ }
2008
+ }
2009
+
2010
+ kernel void kernel_convert_block_q5_K_noshuffle(
2011
+ global struct block_q5_K * src0,
2012
+ global uchar * dst_q,
2013
+ global uchar * dst_qh,
2014
+ global uchar * dst_s,
2015
+ global half * dst_d,
2016
+ global half * dst_dm,
2017
+ uchar mask_0F,
2018
+ uchar mask_F0
2019
+ ) {
2020
+ global struct block_q5_K * b = (global struct block_q5_K *) src0 + get_global_id(0);
2021
+ global uchar * q = (global uchar *) dst_q + QK_K/2 * get_global_id(0);
2022
+ global uchar * qh = (global uchar *) dst_qh + QK_K/8 * get_global_id(0);
2023
+ global uchar * s = (global uchar *) dst_s + K_SCALE_SIZE * get_global_id(0);
2024
+ global half * d = (global half *) dst_d + get_global_id(0);
2025
+ global half * dm = (global half *) dst_dm + get_global_id(0);
2026
+
2027
+ *d = b->d;
2028
+ *dm = b->dm;
2029
+
2030
+ for (int i = 0; i < QK_K / 64; ++i) {
2031
+ for (int j = 0; j < 16; ++j) {
2032
+ uchar x0 = b->qs[i*32 + 2*j];
2033
+ uchar x1 = b->qs[i*32 + 2*j + 1];
2034
+ q[i*32 + j] = convert_uchar(x0 & mask_0F) | convert_uchar((x1 & mask_0F) << 4);
2035
+ q[i*32 + j + 16] = convert_uchar((x0 & mask_F0) >> 4) | convert_uchar(x1 & mask_F0);
2036
+ }
2037
+ }
2038
+
2039
+ for (int l = 0; l < QK_K/8; ++l) {
2040
+ uchar x0 = 0;
2041
+ for (int i = 0; i < 8; ++i) {
2042
+ x0 |= ((b->qh[(l%4)*8+i] >> (l/4)) & 0x01) << i;
2043
+ }
2044
+ qh[l] = x0;
2045
+ }
2046
+
2047
+ for (int i = 0; i < K_SCALE_SIZE; ++i) {
2048
+ s[i] = b->s[i];
2049
+ }
2050
+ }
2051
+
2052
+ kernel void kernel_restore_block_q5_K_noshuffle(
2053
+ global uchar * src_q,
2054
+ global uchar * src_qh,
2055
+ global uchar * src_s,
2056
+ global half * src_d,
2057
+ global half * src_dm,
2058
+ global struct block_q5_K * dst,
2059
+ uchar mask_0F,
2060
+ uchar mask_F0
2061
+ ) {
2062
+ global struct block_q5_K * b = (global struct block_q5_K *) dst + get_global_id(0);
2063
+ global uchar * q = (global uchar *) src_q + QK_K/2 * get_global_id(0);
2064
+ global uchar * qh = (global uchar *) src_qh + QK_K/8 * get_global_id(0);
2065
+ global uchar * s = (global uchar *) src_s + K_SCALE_SIZE * get_global_id(0);
2066
+ global half * d = (global half *) src_d + get_global_id(0);
2067
+ global half * dm = (global half *) src_dm + get_global_id(0);
2068
+
2069
+ b->d = *d;
2070
+ b->dm = *dm;
2071
+
2072
+ for (int i = 0; i < QK_K / 64; ++i) {
2073
+ for (int j = 0; j < 16; ++j) {
2074
+ uchar lo = q[i*32 + j];
2075
+ uchar hi = q[i*32 + j + 16];
2076
+ b->qs[i*32 + 2*j] = convert_uchar((lo & mask_0F) | ((hi & mask_0F) << 4));
2077
+ b->qs[i*32 + 2*j + 1] = convert_uchar(((lo & mask_F0) >> 4) | (hi & mask_F0));
2078
+ }
2079
+ }
2080
+
2081
+ for (int g = 0; g < 4; ++g) {
2082
+ for (int i = 0; i < 8; ++i) {
2083
+ uchar x0 = 0;
2084
+ for (int k = 0; k < 8; ++k) {
2085
+ x0 |= ((qh[4*k+g] >> i) & 0x01) << k;
2086
+ }
2087
+ b->qh[g*8+i] = x0;
2088
+ }
2089
+ }
2090
+
2091
+ for (int i = 0; i < K_SCALE_SIZE; ++i) {
2092
+ b->s[i] = s[i];
2093
+ }
2094
+ }
2095
+
411
2096
  //------------------------------------------------------------------------------
412
2097
  // kernel_convert_block_q6_K
413
2098
  // Convert the block_q6_K format to 3 separate arrays (AOS -> SOA).
@@ -419,8 +2104,13 @@ kernel void kernel_convert_block_q6_K(
419
2104
  global uchar * dst_ql,
420
2105
  global uchar * dst_qh,
421
2106
  global char * dst_s,
422
- global half * dst_d
2107
+ global half * dst_d,
2108
+ uchar mask_lsb_8,
2109
+ ulong n_blk
423
2110
  ) {
2111
+ if (get_global_id(0) >= n_blk) {
2112
+ return;
2113
+ }
424
2114
  global struct block_q6_K * b = (global struct block_q6_K *) src0 + get_global_id(0);
425
2115
  global uchar * ql = (global uchar *) dst_ql + QK_K/2*get_global_id(0);
426
2116
  global uchar * qh = (global uchar *) dst_qh + QK_K/4*get_global_id(0);
@@ -447,8 +2137,13 @@ kernel void kernel_restore_block_q6_K(
447
2137
  global uchar * dst_qh,
448
2138
  global char * dst_s,
449
2139
  global half * dst_d,
450
- global struct block_q6_K * dst
2140
+ global struct block_q6_K * dst,
2141
+ uchar mask_lsb_8,
2142
+ ulong n_blk
451
2143
  ) {
2144
+ if (get_global_id(0) >= n_blk) {
2145
+ return;
2146
+ }
452
2147
  global struct block_q6_K * b = (global struct block_q6_K *) dst + get_global_id(0);
453
2148
  global uchar * ql = (global uchar *) dst_ql + QK_K/2*get_global_id(0);
454
2149
  global uchar * qh = (global uchar *) dst_qh + QK_K/4*get_global_id(0);
@@ -467,3 +2162,213 @@ kernel void kernel_restore_block_q6_K(
467
2162
  b->scales[i] = s[i];
468
2163
  }
469
2164
  }
2165
+
2166
+ kernel void kernel_convert_block_q6_K_noshuffle(
2167
+ global struct block_q6_K * src0,
2168
+ global uchar * dst_ql,
2169
+ global uchar * dst_qh,
2170
+ global char * dst_s,
2171
+ global half * dst_d,
2172
+ uchar mask_lsb_8,
2173
+ ulong n_blk
2174
+ ) {
2175
+ if (get_global_id(0) >= n_blk) {
2176
+ return;
2177
+ }
2178
+ global struct block_q6_K * b = (global struct block_q6_K *) src0 + get_global_id(0);
2179
+ global uchar * ql = (global uchar *) dst_ql + QK_K/2*get_global_id(0);
2180
+ global uchar * qh = (global uchar *) dst_qh + QK_K/4*get_global_id(0);
2181
+ global char * s = (global char *) dst_s + QK_K/16*get_global_id(0);
2182
+ global half * d = (global half *) dst_d + get_global_id(0);
2183
+
2184
+ *d = b->d;
2185
+
2186
+ for (int i = 0; i < QK_K/2/4; ++i) {
2187
+ uchar x0 = b->ql[i*2 + 0] & mask_lsb_8;
2188
+ uchar x1 = b->ql[i*2 + 1] & mask_lsb_8;
2189
+ ql[i + 0] = (x0 & 0x0F) | ((x1 & 0x0F) << 4);
2190
+ ql[i + 32] = ((x0 & 0xF0) >> 4) | (x1 & 0xF0);
2191
+
2192
+ uchar x2 = b->ql[i*2 + 0 + 64] & mask_lsb_8;
2193
+ uchar x3 = b->ql[i*2 + 1 + 64] & mask_lsb_8;
2194
+ ql[i + 64] = (x2 & 0x0F) | ((x3 & 0x0F) << 4);
2195
+ ql[i + 96] = ((x2 & 0xF0) >> 4) | (x3 & 0xF0);
2196
+ }
2197
+
2198
+ for (int i = 0; i < QK_K/4/8; ++i) {
2199
+ uchar x0 = b->qh[i*4 + 0] & mask_lsb_8;
2200
+ uchar x1 = b->qh[i*4 + 1] & mask_lsb_8;
2201
+ uchar x2 = b->qh[i*4 + 2] & mask_lsb_8;
2202
+ uchar x3 = b->qh[i*4 + 3] & mask_lsb_8;
2203
+ qh[i + 0] = (x0 & 0x03) | ((x1 & 0x03) << 2) | ((x2 & 0x03) << 4) | ((x3 & 0x03) << 6);
2204
+ qh[i + 8] = ((x0 & 0x0C) >> 2) | (x1 & 0x0C) | ((x2 & 0x0C) << 2) | ((x3 & 0x0C) << 4);
2205
+ qh[i + 16] = ((x0 & 0x30) >> 4) | ((x1 & 0x30) >> 2) | (x2 & 0x30) | ((x3 & 0x30) << 2);
2206
+ qh[i + 24] = ((x0 & 0xC0) >> 6) | ((x1 & 0xC0) >> 4) | ((x2 & 0xC0) >> 2) | (x3 & 0xC0);
2207
+
2208
+ uchar x4 = b->qh[i*4 + 0 + 32] & mask_lsb_8;
2209
+ uchar x5 = b->qh[i*4 + 1 + 32] & mask_lsb_8;
2210
+ uchar x6 = b->qh[i*4 + 2 + 32] & mask_lsb_8;
2211
+ uchar x7 = b->qh[i*4 + 3 + 32] & mask_lsb_8;
2212
+ qh[i + 32] = (x4 & 0x03) | ((x5 & 0x03) << 2) | ((x6 & 0x03) << 4) | ((x7 & 0x03) << 6);
2213
+ qh[i + 40] = ((x4 & 0x0C) >> 2) | (x5 & 0x0C) | ((x6 & 0x0C) << 2) | ((x7 & 0x0C) << 4);
2214
+ qh[i + 48] = ((x4 & 0x30) >> 4) | ((x5 & 0x30) >> 2) | (x6 & 0x30) | ((x7 & 0x30) << 2);
2215
+ qh[i + 56] = ((x4 & 0xC0) >> 6) | ((x5 & 0xC0) >> 4) | ((x6 & 0xC0) >> 2) | (x7 & 0xC0);
2216
+ }
2217
+
2218
+ for (int i = 0; i < QK_K/16; ++i) {
2219
+ s[i] = b->scales[i];
2220
+ }
2221
+ }
2222
+
2223
+ kernel void kernel_restore_block_q6_K_noshuffle(
2224
+ global uchar * src_ql,
2225
+ global uchar * src_qh,
2226
+ global char * src_s,
2227
+ global half * src_d,
2228
+ global struct block_q6_K * dst,
2229
+ uchar mask_lsb_8,
2230
+ ulong n_blk
2231
+ ) {
2232
+ if (get_global_id(0) >= n_blk) {
2233
+ return;
2234
+ }
2235
+ global struct block_q6_K * b = (global struct block_q6_K *) dst + get_global_id(0);
2236
+ global uchar * ql = (global uchar *) src_ql + QK_K/2*get_global_id(0);
2237
+ global uchar * qh = (global uchar *) src_qh + QK_K/4*get_global_id(0);
2238
+ global char * s = (global char *) src_s + QK_K/16*get_global_id(0);
2239
+ global half * d = (global half *) src_d + get_global_id(0);
2240
+
2241
+ b->d = *d;
2242
+
2243
+ for (int i = 0; i < QK_K/2/4; ++i) {
2244
+ uchar x0 = ql[i + 0] & mask_lsb_8;
2245
+ uchar x1 = ql[i + 32] & mask_lsb_8;
2246
+ b->ql[i*2 + 0] = (x0 & 0x0F) | ((x1 & 0x0F) << 4);
2247
+ b->ql[i*2 + 1] = ((x0 & 0xF0) >> 4) | (x1 & 0xF0);
2248
+
2249
+ uchar x2 = ql[i + 64] & mask_lsb_8;
2250
+ uchar x3 = ql[i + 96] & mask_lsb_8;
2251
+ b->ql[i*2 + 0 + 64] = (x2 & 0x0F) | ((x3 & 0x0F) << 4);
2252
+ b->ql[i*2 + 1 + 64] = ((x2 & 0xF0) >> 4) | (x3 & 0xF0);
2253
+ }
2254
+
2255
+ for (int i = 0; i < QK_K/4/8; ++i) {
2256
+ uchar x0 = qh[i + 0] & mask_lsb_8;
2257
+ uchar x1 = qh[i + 8] & mask_lsb_8;
2258
+ uchar x2 = qh[i + 16] & mask_lsb_8;
2259
+ uchar x3 = qh[i + 24] & mask_lsb_8;
2260
+ b->qh[i*4 + 0] = (x0 & 0x03) | ((x1 & 0x03) << 2) | ((x2 & 0x03) << 4) | ((x3 & 0x03) << 6);
2261
+ b->qh[i*4 + 1] = ((x0 & 0x0C) >> 2) | (x1 & 0x0C) | ((x2 & 0x0C) << 2) | ((x3 & 0x0C) << 4);
2262
+ b->qh[i*4 + 2] = ((x0 & 0x30) >> 4) | ((x1 & 0x30) >> 2) | (x2 & 0x30) | ((x3 & 0x30) << 2);
2263
+ b->qh[i*4 + 3] = ((x0 & 0xC0) >> 6) | ((x1 & 0xC0) >> 4) | ((x2 & 0xC0) >> 2) | (x3 & 0xC0);
2264
+
2265
+ uchar x4 = qh[i + 0 + 32] & mask_lsb_8;
2266
+ uchar x5 = qh[i + 8 + 32] & mask_lsb_8;
2267
+ uchar x6 = qh[i + 16 + 32] & mask_lsb_8;
2268
+ uchar x7 = qh[i + 24 + 32] & mask_lsb_8;
2269
+ b->qh[i*4 + 0 + 32] = (x4 & 0x03) | ((x5 & 0x03) << 2) | ((x6 & 0x03) << 4) | ((x7 & 0x03) << 6);
2270
+ b->qh[i*4 + 1 + 32] = ((x4 & 0x0C) >> 2) | (x5 & 0x0C) | ((x6 & 0x0C) << 2) | ((x7 & 0x0C) << 4);
2271
+ b->qh[i*4 + 2 + 32] = ((x4 & 0x30) >> 4) | ((x5 & 0x30) >> 2) | (x6 & 0x30) | ((x7 & 0x30) << 2);
2272
+ b->qh[i*4 + 3 + 32] = ((x4 & 0xC0) >> 6) | ((x5 & 0xC0) >> 4) | ((x6 & 0xC0) >> 2) | (x7 & 0xC0);
2273
+ }
2274
+
2275
+ for (int i = 0; i < QK_K/16; ++i) {
2276
+ b->scales[i] = s[i];
2277
+ }
2278
+ }
2279
+
2280
+ //------------------------------------------------------------------------------
2281
+ // kernel_convert_block_iq4_nl
2282
+ // Convert the block_iq4_nl format to 2 separate arrays (AOS -> SOA).
2283
+ //------------------------------------------------------------------------------
2284
+ kernel void kernel_convert_block_iq4_nl(
2285
+ global struct block_iq4_nl * src0,
2286
+ global uchar * dst_q,
2287
+ global half * dst_d,
2288
+ uchar mask_0F,
2289
+ uchar mask_F0,
2290
+ ulong n_blk
2291
+ ) {
2292
+ if (get_global_id(0) >= n_blk) {
2293
+ return;
2294
+ }
2295
+ global struct block_iq4_nl * b = (global struct block_iq4_nl *) src0 + get_global_id(0);
2296
+ global uchar * q = (global uchar *) dst_q + QK4_NL/2*get_global_id(0);
2297
+ global half * d = (global half *) dst_d + get_global_id(0);
2298
+
2299
+ *d = b->d;
2300
+
2301
+ for (int i = 0; i < QK4_NL/2; ++i) {
2302
+ q[i] = b->qs[i];
2303
+ }
2304
+ }
2305
+
2306
+ kernel void kernel_restore_block_iq4_nl(
2307
+ global uchar * src_q,
2308
+ global half * src_d,
2309
+ global struct block_iq4_nl * dst,
2310
+ ulong n_blk
2311
+ ) {
2312
+ if (get_global_id(0) >= n_blk) {
2313
+ return;
2314
+ }
2315
+ global struct block_iq4_nl * b = (global struct block_iq4_nl *) dst + get_global_id(0);
2316
+ global uchar * q = (global uchar *) src_q + QK4_NL/2*get_global_id(0);
2317
+ global half * d = (global half *) src_d + get_global_id(0);
2318
+
2319
+ b->d = *d;
2320
+
2321
+ for (int i = 0; i < QK4_NL/2; ++i) {
2322
+ b->qs[i] = q[i];
2323
+ }
2324
+ }
2325
+
2326
+ kernel void kernel_convert_block_iq4_nl_noshuffle(
2327
+ global struct block_iq4_nl * src0,
2328
+ global uchar * dst_q,
2329
+ global half * dst_d,
2330
+ uchar mask_0F,
2331
+ uchar mask_F0,
2332
+ ulong n_blk
2333
+ ) {
2334
+ if (get_global_id(0) >= n_blk) {
2335
+ return;
2336
+ }
2337
+ global struct block_iq4_nl * b = (global struct block_iq4_nl *) src0 + get_global_id(0);
2338
+ global uchar * q = (global uchar *) dst_q + QK4_NL/2*get_global_id(0);
2339
+ global half * d = (global half *) dst_d + get_global_id(0);
2340
+
2341
+ *d = b->d;
2342
+ for (int i = 0; i < QK4_NL/4; ++i) {
2343
+ uchar x0 = b->qs[2*i + 0];
2344
+ uchar x1 = b->qs[2*i + 1];
2345
+
2346
+ q[i + 0 ] = convert_uchar(x0 & mask_0F) | convert_uchar((x1 & mask_0F) << 4);
2347
+ q[i + QK4_NL/4] = convert_uchar((x0 & mask_F0) >> 4) | convert_uchar(x1 & mask_F0);
2348
+ }
2349
+ }
2350
+
2351
+ kernel void kernel_restore_block_iq4_nl_noshuffle(
2352
+ global uchar * src_q,
2353
+ global half * src_d,
2354
+ global struct block_iq4_nl * dst,
2355
+ uchar mask_0F,
2356
+ uchar mask_F0,
2357
+ ulong n_blk
2358
+ ) {
2359
+ if (get_global_id(0) >= n_blk) {
2360
+ return;
2361
+ }
2362
+ global struct block_iq4_nl * b = (global struct block_iq4_nl *) dst + get_global_id(0);
2363
+ global uchar * q = (global uchar *) src_q + QK4_NL/2*get_global_id(0);
2364
+ global half * d = (global half *) src_d + get_global_id(0);
2365
+
2366
+ b->d = *d;
2367
+ for (int i = 0; i < QK4_NL/4; ++i) {
2368
+ uchar x0 = q[i + 0 ];
2369
+ uchar x1 = q[i + QK4_NL/4];
2370
+
2371
+ b->qs[2*i + 0] = convert_uchar((x0 & mask_0F) | ((x1 & mask_0F) << 4));
2372
+ b->qs[2*i + 1] = convert_uchar(((x0 & mask_F0) >> 4) | (x1 & mask_F0));
2373
+ }
2374
+ }