cohere-transcribe 0.1.0

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 (480) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +21 -0
  3. data/LICENSE.txt +201 -0
  4. data/NOTICE +5 -0
  5. data/README.md +265 -0
  6. data/THIRD_PARTY_NOTICES.md +67 -0
  7. data/exe/cohere-transcribe +8 -0
  8. data/exe/cohere-transcribe-doctor +8 -0
  9. data/ext/cohere_transcribe_native/CMakeLists.txt +262 -0
  10. data/ext/cohere_transcribe_native/README.md +26 -0
  11. data/ext/cohere_transcribe_native/audio_abi.cpp +1416 -0
  12. data/ext/cohere_transcribe_native/audio_exports.macos +5 -0
  13. data/ext/cohere_transcribe_native/audio_exports.map +10 -0
  14. data/ext/cohere_transcribe_native/cohere_abi.cpp +1209 -0
  15. data/ext/cohere_transcribe_native/exports.macos +40 -0
  16. data/ext/cohere_transcribe_native/exports.map +45 -0
  17. data/ext/cohere_transcribe_native/extconf.rb +89 -0
  18. data/ext/cohere_transcribe_native/test/abi_smoke.rb +232 -0
  19. data/ext/cohere_transcribe_native/test/audio_matrix_smoke.cpp +121 -0
  20. data/ext/cohere_transcribe_native/test/audio_reliability_smoke.cpp +198 -0
  21. data/ext/cohere_transcribe_native/test/native_abi_reliability_smoke.cpp +186 -0
  22. data/ext/cohere_transcribe_native/test/native_batch_projection_probe.rb +81 -0
  23. data/ext/cohere_transcribe_native/test/native_cancellation_smoke.cpp +194 -0
  24. data/lib/cohere/transcribe/alignment/ATTRIBUTION.md +23 -0
  25. data/lib/cohere/transcribe/alignment/LICENSE.ctc-forced-aligner +407 -0
  26. data/lib/cohere/transcribe/alignment/LICENSE.torchaudio +25 -0
  27. data/lib/cohere/transcribe/alignment/LICENSE.uroman +26 -0
  28. data/lib/cohere/transcribe/alignment/aligner.rb +476 -0
  29. data/lib/cohere/transcribe/alignment/ctc.rb +224 -0
  30. data/lib/cohere/transcribe/alignment/text.rb +237 -0
  31. data/lib/cohere/transcribe/alignment/uroman_data.rb +4950 -0
  32. data/lib/cohere/transcribe/api.rb +173 -0
  33. data/lib/cohere/transcribe/asr/batching.rb +472 -0
  34. data/lib/cohere/transcribe/asr/failure_policy.rb +112 -0
  35. data/lib/cohere/transcribe/asr/native.rb +676 -0
  36. data/lib/cohere/transcribe/audio/ATTRIBUTION.md +8 -0
  37. data/lib/cohere/transcribe/audio/LICENSE.auditok +21 -0
  38. data/lib/cohere/transcribe/audio/decoder.rb +315 -0
  39. data/lib/cohere/transcribe/audio/ffmpeg_native.rb +248 -0
  40. data/lib/cohere/transcribe/audio/segmentation.rb +260 -0
  41. data/lib/cohere/transcribe/cli.rb +727 -0
  42. data/lib/cohere/transcribe/configuration.rb +282 -0
  43. data/lib/cohere/transcribe/constants.rb +14 -0
  44. data/lib/cohere/transcribe/dense_converter.rb +548 -0
  45. data/lib/cohere/transcribe/doctor.rb +576 -0
  46. data/lib/cohere/transcribe/errors.rb +57 -0
  47. data/lib/cohere/transcribe/gguf_writer.rb +268 -0
  48. data/lib/cohere/transcribe/hub.rb +436 -0
  49. data/lib/cohere/transcribe/input.rb +110 -0
  50. data/lib/cohere/transcribe/licenses/crispasr.txt +21 -0
  51. data/lib/cohere/transcribe/loader.rb +128 -0
  52. data/lib/cohere/transcribe/model_identity.rb +440 -0
  53. data/lib/cohere/transcribe/output/publication.rb +1118 -0
  54. data/lib/cohere/transcribe/output/rendering.rb +105 -0
  55. data/lib/cohere/transcribe/output/timing.rb +86 -0
  56. data/lib/cohere/transcribe/python_text.rb +70 -0
  57. data/lib/cohere/transcribe/pytorch_checkpoint.rb +1180 -0
  58. data/lib/cohere/transcribe/runtime/engine.rb +1676 -0
  59. data/lib/cohere/transcribe/runtime/model_provider.rb +390 -0
  60. data/lib/cohere/transcribe/runtime/precision.rb +57 -0
  61. data/lib/cohere/transcribe/runtime/preparation.rb +215 -0
  62. data/lib/cohere/transcribe/runtime/resources.rb +165 -0
  63. data/lib/cohere/transcribe/runtime/word_pipeline.rb +364 -0
  64. data/lib/cohere/transcribe/safetensors.rb +579 -0
  65. data/lib/cohere/transcribe/state/checkpoint.rb +224 -0
  66. data/lib/cohere/transcribe/state/contracts.rb +141 -0
  67. data/lib/cohere/transcribe/state/io.rb +727 -0
  68. data/lib/cohere/transcribe/state/locking.rb +211 -0
  69. data/lib/cohere/transcribe/state/manifest.rb +155 -0
  70. data/lib/cohere/transcribe/state.rb +7 -0
  71. data/lib/cohere/transcribe/types.rb +535 -0
  72. data/lib/cohere/transcribe/vad/ATTRIBUTION.md +14 -0
  73. data/lib/cohere/transcribe/vad/LICENSE.faster-whisper +21 -0
  74. data/lib/cohere/transcribe/vad/LICENSE.silero-vad +21 -0
  75. data/lib/cohere/transcribe/vad/silero.rb +344 -0
  76. data/lib/cohere/transcribe/vad/silero_vad_v6.onnx +0 -0
  77. data/lib/cohere/transcribe/vad/timestamps.rb +219 -0
  78. data/lib/cohere/transcribe/version.rb +7 -0
  79. data/lib/cohere/transcribe.rb +26 -0
  80. data/sig/cohere/transcribe.rbs +250 -0
  81. data/vendor/crispasr/AUTHORS +510 -0
  82. data/vendor/crispasr/LICENSE +21 -0
  83. data/vendor/crispasr/UPSTREAM.md +9 -0
  84. data/vendor/crispasr/VERSION +1 -0
  85. data/vendor/crispasr/ggml/AUTHORS +335 -0
  86. data/vendor/crispasr/ggml/CMakeLists.txt +512 -0
  87. data/vendor/crispasr/ggml/LICENSE +21 -0
  88. data/vendor/crispasr/ggml/README.md +49 -0
  89. data/vendor/crispasr/ggml/cmake/FindNCCL.cmake +36 -0
  90. data/vendor/crispasr/ggml/cmake/GitVars.cmake +22 -0
  91. data/vendor/crispasr/ggml/cmake/common.cmake +50 -0
  92. data/vendor/crispasr/ggml/cmake/ggml-config.cmake.in +191 -0
  93. data/vendor/crispasr/ggml/ggml.pc.in +10 -0
  94. data/vendor/crispasr/ggml/include/ggml-alloc.h +85 -0
  95. data/vendor/crispasr/ggml/include/ggml-backend.h +431 -0
  96. data/vendor/crispasr/ggml/include/ggml-blas.h +25 -0
  97. data/vendor/crispasr/ggml/include/ggml-cann.h +123 -0
  98. data/vendor/crispasr/ggml/include/ggml-cpp.h +39 -0
  99. data/vendor/crispasr/ggml/include/ggml-cpu.h +151 -0
  100. data/vendor/crispasr/ggml/include/ggml-cuda.h +50 -0
  101. data/vendor/crispasr/ggml/include/ggml-hexagon.h +19 -0
  102. data/vendor/crispasr/ggml/include/ggml-metal.h +61 -0
  103. data/vendor/crispasr/ggml/include/ggml-opencl.h +26 -0
  104. data/vendor/crispasr/ggml/include/ggml-openvino.h +37 -0
  105. data/vendor/crispasr/ggml/include/ggml-opt.h +256 -0
  106. data/vendor/crispasr/ggml/include/ggml-rpc.h +35 -0
  107. data/vendor/crispasr/ggml/include/ggml-sycl.h +49 -0
  108. data/vendor/crispasr/ggml/include/ggml-virtgpu.h +14 -0
  109. data/vendor/crispasr/ggml/include/ggml-vulkan.h +29 -0
  110. data/vendor/crispasr/ggml/include/ggml-webgpu.h +19 -0
  111. data/vendor/crispasr/ggml/include/ggml-zdnn.h +17 -0
  112. data/vendor/crispasr/ggml/include/ggml-zendnn.h +22 -0
  113. data/vendor/crispasr/ggml/include/ggml.h +2887 -0
  114. data/vendor/crispasr/ggml/include/gguf.h +204 -0
  115. data/vendor/crispasr/ggml/src/CMakeLists.txt +493 -0
  116. data/vendor/crispasr/ggml/src/ggml-alloc.c +1323 -0
  117. data/vendor/crispasr/ggml/src/ggml-backend-dl.cpp +48 -0
  118. data/vendor/crispasr/ggml/src/ggml-backend-dl.h +44 -0
  119. data/vendor/crispasr/ggml/src/ggml-backend-impl.h +275 -0
  120. data/vendor/crispasr/ggml/src/ggml-backend-meta.cpp +2145 -0
  121. data/vendor/crispasr/ggml/src/ggml-backend-reg.cpp +586 -0
  122. data/vendor/crispasr/ggml/src/ggml-backend.cpp +2437 -0
  123. data/vendor/crispasr/ggml/src/ggml-common.h +1900 -0
  124. data/vendor/crispasr/ggml/src/ggml-cpu/CMakeLists.txt +718 -0
  125. data/vendor/crispasr/ggml/src/ggml-cpu/amx/amx.cpp +249 -0
  126. data/vendor/crispasr/ggml/src/ggml-cpu/amx/amx.h +8 -0
  127. data/vendor/crispasr/ggml/src/ggml-cpu/amx/common.h +115 -0
  128. data/vendor/crispasr/ggml/src/ggml-cpu/amx/mmq.cpp +2512 -0
  129. data/vendor/crispasr/ggml/src/ggml-cpu/amx/mmq.h +10 -0
  130. data/vendor/crispasr/ggml/src/ggml-cpu/arch/arm/cpu-feats.cpp +98 -0
  131. data/vendor/crispasr/ggml/src/ggml-cpu/arch/arm/quants.c +4244 -0
  132. data/vendor/crispasr/ggml/src/ggml-cpu/arch/arm/repack.cpp +5156 -0
  133. data/vendor/crispasr/ggml/src/ggml-cpu/arch/loongarch/quants.c +2158 -0
  134. data/vendor/crispasr/ggml/src/ggml-cpu/arch/powerpc/cpu-feats.cpp +82 -0
  135. data/vendor/crispasr/ggml/src/ggml-cpu/arch/powerpc/quants.c +2304 -0
  136. data/vendor/crispasr/ggml/src/ggml-cpu/arch/riscv/cpu-feats.cpp +38 -0
  137. data/vendor/crispasr/ggml/src/ggml-cpu/arch/riscv/quants.c +4455 -0
  138. data/vendor/crispasr/ggml/src/ggml-cpu/arch/riscv/repack.cpp +1703 -0
  139. data/vendor/crispasr/ggml/src/ggml-cpu/arch/s390/cpu-feats.cpp +50 -0
  140. data/vendor/crispasr/ggml/src/ggml-cpu/arch/s390/quants.c +1465 -0
  141. data/vendor/crispasr/ggml/src/ggml-cpu/arch/wasm/quants.c +1220 -0
  142. data/vendor/crispasr/ggml/src/ggml-cpu/arch/x86/cpu-feats.cpp +327 -0
  143. data/vendor/crispasr/ggml/src/ggml-cpu/arch/x86/quants.c +3970 -0
  144. data/vendor/crispasr/ggml/src/ggml-cpu/arch/x86/repack.cpp +6407 -0
  145. data/vendor/crispasr/ggml/src/ggml-cpu/arch-fallback.h +349 -0
  146. data/vendor/crispasr/ggml/src/ggml-cpu/binary-ops.cpp +154 -0
  147. data/vendor/crispasr/ggml/src/ggml-cpu/binary-ops.h +16 -0
  148. data/vendor/crispasr/ggml/src/ggml-cpu/cmake/FindSIMD.cmake +100 -0
  149. data/vendor/crispasr/ggml/src/ggml-cpu/common.h +95 -0
  150. data/vendor/crispasr/ggml/src/ggml-cpu/ggml-cpu-impl.h +539 -0
  151. data/vendor/crispasr/ggml/src/ggml-cpu/ggml-cpu.c +3791 -0
  152. data/vendor/crispasr/ggml/src/ggml-cpu/ggml-cpu.cpp +703 -0
  153. data/vendor/crispasr/ggml/src/ggml-cpu/hbm.cpp +55 -0
  154. data/vendor/crispasr/ggml/src/ggml-cpu/hbm.h +8 -0
  155. data/vendor/crispasr/ggml/src/ggml-cpu/kleidiai/kernels.cpp +939 -0
  156. data/vendor/crispasr/ggml/src/ggml-cpu/kleidiai/kernels.h +90 -0
  157. data/vendor/crispasr/ggml/src/ggml-cpu/kleidiai/kleidiai.cpp +1513 -0
  158. data/vendor/crispasr/ggml/src/ggml-cpu/kleidiai/kleidiai.h +17 -0
  159. data/vendor/crispasr/ggml/src/ggml-cpu/llamafile/sgemm.cpp +4051 -0
  160. data/vendor/crispasr/ggml/src/ggml-cpu/llamafile/sgemm.h +25 -0
  161. data/vendor/crispasr/ggml/src/ggml-cpu/ops.cpp +11662 -0
  162. data/vendor/crispasr/ggml/src/ggml-cpu/ops.h +121 -0
  163. data/vendor/crispasr/ggml/src/ggml-cpu/quants.c +1288 -0
  164. data/vendor/crispasr/ggml/src/ggml-cpu/quants.h +103 -0
  165. data/vendor/crispasr/ggml/src/ggml-cpu/repack.cpp +4836 -0
  166. data/vendor/crispasr/ggml/src/ggml-cpu/repack.h +245 -0
  167. data/vendor/crispasr/ggml/src/ggml-cpu/simd-gemm.h +226 -0
  168. data/vendor/crispasr/ggml/src/ggml-cpu/simd-mappings.h +1329 -0
  169. data/vendor/crispasr/ggml/src/ggml-cpu/spacemit/ime.cpp +1025 -0
  170. data/vendor/crispasr/ggml/src/ggml-cpu/spacemit/ime.h +13 -0
  171. data/vendor/crispasr/ggml/src/ggml-cpu/spacemit/ime1_kernels.cpp +3196 -0
  172. data/vendor/crispasr/ggml/src/ggml-cpu/spacemit/ime_kernels.h +26 -0
  173. data/vendor/crispasr/ggml/src/ggml-cpu/traits.cpp +36 -0
  174. data/vendor/crispasr/ggml/src/ggml-cpu/traits.h +38 -0
  175. data/vendor/crispasr/ggml/src/ggml-cpu/unary-ops.cpp +336 -0
  176. data/vendor/crispasr/ggml/src/ggml-cpu/unary-ops.h +35 -0
  177. data/vendor/crispasr/ggml/src/ggml-cpu/vec.cpp +681 -0
  178. data/vendor/crispasr/ggml/src/ggml-cpu/vec.h +1606 -0
  179. data/vendor/crispasr/ggml/src/ggml-cuda/CMakeLists.txt +272 -0
  180. data/vendor/crispasr/ggml/src/ggml-cuda/acc.cu +61 -0
  181. data/vendor/crispasr/ggml/src/ggml-cuda/acc.cuh +5 -0
  182. data/vendor/crispasr/ggml/src/ggml-cuda/add-id.cu +58 -0
  183. data/vendor/crispasr/ggml/src/ggml-cuda/add-id.cuh +3 -0
  184. data/vendor/crispasr/ggml/src/ggml-cuda/arange.cu +34 -0
  185. data/vendor/crispasr/ggml/src/ggml-cuda/arange.cuh +5 -0
  186. data/vendor/crispasr/ggml/src/ggml-cuda/argmax.cu +91 -0
  187. data/vendor/crispasr/ggml/src/ggml-cuda/argmax.cuh +3 -0
  188. data/vendor/crispasr/ggml/src/ggml-cuda/argsort.cu +265 -0
  189. data/vendor/crispasr/ggml/src/ggml-cuda/argsort.cuh +19 -0
  190. data/vendor/crispasr/ggml/src/ggml-cuda/binbcast.cu +534 -0
  191. data/vendor/crispasr/ggml/src/ggml-cuda/binbcast.cuh +12 -0
  192. data/vendor/crispasr/ggml/src/ggml-cuda/clamp.cu +45 -0
  193. data/vendor/crispasr/ggml/src/ggml-cuda/clamp.cuh +5 -0
  194. data/vendor/crispasr/ggml/src/ggml-cuda/col2im-1d.cu +81 -0
  195. data/vendor/crispasr/ggml/src/ggml-cuda/col2im-1d.cuh +3 -0
  196. data/vendor/crispasr/ggml/src/ggml-cuda/common.cuh +1489 -0
  197. data/vendor/crispasr/ggml/src/ggml-cuda/concat.cu +204 -0
  198. data/vendor/crispasr/ggml/src/ggml-cuda/concat.cuh +5 -0
  199. data/vendor/crispasr/ggml/src/ggml-cuda/conv-transpose-1d.cu +97 -0
  200. data/vendor/crispasr/ggml/src/ggml-cuda/conv-transpose-1d.cuh +5 -0
  201. data/vendor/crispasr/ggml/src/ggml-cuda/conv2d-dw.cu +161 -0
  202. data/vendor/crispasr/ggml/src/ggml-cuda/conv2d-dw.cuh +5 -0
  203. data/vendor/crispasr/ggml/src/ggml-cuda/conv2d-transpose.cu +115 -0
  204. data/vendor/crispasr/ggml/src/ggml-cuda/conv2d-transpose.cuh +5 -0
  205. data/vendor/crispasr/ggml/src/ggml-cuda/conv2d.cu +166 -0
  206. data/vendor/crispasr/ggml/src/ggml-cuda/conv2d.cuh +5 -0
  207. data/vendor/crispasr/ggml/src/ggml-cuda/convert.cu +892 -0
  208. data/vendor/crispasr/ggml/src/ggml-cuda/convert.cuh +66 -0
  209. data/vendor/crispasr/ggml/src/ggml-cuda/count-equal.cu +64 -0
  210. data/vendor/crispasr/ggml/src/ggml-cuda/count-equal.cuh +5 -0
  211. data/vendor/crispasr/ggml/src/ggml-cuda/cp-async.cuh +57 -0
  212. data/vendor/crispasr/ggml/src/ggml-cuda/cpy-utils.cuh +217 -0
  213. data/vendor/crispasr/ggml/src/ggml-cuda/cpy.cu +581 -0
  214. data/vendor/crispasr/ggml/src/ggml-cuda/cpy.cuh +7 -0
  215. data/vendor/crispasr/ggml/src/ggml-cuda/cross-entropy-loss.cu +177 -0
  216. data/vendor/crispasr/ggml/src/ggml-cuda/cross-entropy-loss.cuh +7 -0
  217. data/vendor/crispasr/ggml/src/ggml-cuda/cumsum.cu +307 -0
  218. data/vendor/crispasr/ggml/src/ggml-cuda/cumsum.cuh +5 -0
  219. data/vendor/crispasr/ggml/src/ggml-cuda/dequantize.cuh +99 -0
  220. data/vendor/crispasr/ggml/src/ggml-cuda/diag.cu +77 -0
  221. data/vendor/crispasr/ggml/src/ggml-cuda/diag.cuh +5 -0
  222. data/vendor/crispasr/ggml/src/ggml-cuda/diagmask.cu +40 -0
  223. data/vendor/crispasr/ggml/src/ggml-cuda/diagmask.cuh +5 -0
  224. data/vendor/crispasr/ggml/src/ggml-cuda/fattn-common.cuh +1212 -0
  225. data/vendor/crispasr/ggml/src/ggml-cuda/fattn-mma-f16.cuh +1860 -0
  226. data/vendor/crispasr/ggml/src/ggml-cuda/fattn-tile.cu +57 -0
  227. data/vendor/crispasr/ggml/src/ggml-cuda/fattn-tile.cuh +1309 -0
  228. data/vendor/crispasr/ggml/src/ggml-cuda/fattn-vec.cuh +600 -0
  229. data/vendor/crispasr/ggml/src/ggml-cuda/fattn-wmma-f16.cu +696 -0
  230. data/vendor/crispasr/ggml/src/ggml-cuda/fattn-wmma-f16.cuh +51 -0
  231. data/vendor/crispasr/ggml/src/ggml-cuda/fattn.cu +620 -0
  232. data/vendor/crispasr/ggml/src/ggml-cuda/fattn.cuh +5 -0
  233. data/vendor/crispasr/ggml/src/ggml-cuda/fill.cu +37 -0
  234. data/vendor/crispasr/ggml/src/ggml-cuda/fill.cuh +3 -0
  235. data/vendor/crispasr/ggml/src/ggml-cuda/gated_delta_net.cu +273 -0
  236. data/vendor/crispasr/ggml/src/ggml-cuda/gated_delta_net.cuh +4 -0
  237. data/vendor/crispasr/ggml/src/ggml-cuda/getrows.cu +332 -0
  238. data/vendor/crispasr/ggml/src/ggml-cuda/getrows.cuh +15 -0
  239. data/vendor/crispasr/ggml/src/ggml-cuda/ggml-cuda.cu +5580 -0
  240. data/vendor/crispasr/ggml/src/ggml-cuda/gla.cu +93 -0
  241. data/vendor/crispasr/ggml/src/ggml-cuda/gla.cuh +3 -0
  242. data/vendor/crispasr/ggml/src/ggml-cuda/im2col.cu +274 -0
  243. data/vendor/crispasr/ggml/src/ggml-cuda/im2col.cuh +6 -0
  244. data/vendor/crispasr/ggml/src/ggml-cuda/mean.cu +75 -0
  245. data/vendor/crispasr/ggml/src/ggml-cuda/mean.cuh +3 -0
  246. data/vendor/crispasr/ggml/src/ggml-cuda/mma.cuh +1333 -0
  247. data/vendor/crispasr/ggml/src/ggml-cuda/mmf.cu +191 -0
  248. data/vendor/crispasr/ggml/src/ggml-cuda/mmf.cuh +908 -0
  249. data/vendor/crispasr/ggml/src/ggml-cuda/mmid.cu +164 -0
  250. data/vendor/crispasr/ggml/src/ggml-cuda/mmid.cuh +5 -0
  251. data/vendor/crispasr/ggml/src/ggml-cuda/mmq.cu +372 -0
  252. data/vendor/crispasr/ggml/src/ggml-cuda/mmq.cuh +4175 -0
  253. data/vendor/crispasr/ggml/src/ggml-cuda/mmvf.cu +862 -0
  254. data/vendor/crispasr/ggml/src/ggml-cuda/mmvf.cuh +14 -0
  255. data/vendor/crispasr/ggml/src/ggml-cuda/mmvq.cu +1161 -0
  256. data/vendor/crispasr/ggml/src/ggml-cuda/mmvq.cuh +16 -0
  257. data/vendor/crispasr/ggml/src/ggml-cuda/norm.cu +756 -0
  258. data/vendor/crispasr/ggml/src/ggml-cuda/norm.cuh +20 -0
  259. data/vendor/crispasr/ggml/src/ggml-cuda/opt-step-adamw.cu +78 -0
  260. data/vendor/crispasr/ggml/src/ggml-cuda/opt-step-adamw.cuh +5 -0
  261. data/vendor/crispasr/ggml/src/ggml-cuda/opt-step-sgd.cu +49 -0
  262. data/vendor/crispasr/ggml/src/ggml-cuda/opt-step-sgd.cuh +5 -0
  263. data/vendor/crispasr/ggml/src/ggml-cuda/out-prod.cu +68 -0
  264. data/vendor/crispasr/ggml/src/ggml-cuda/out-prod.cuh +3 -0
  265. data/vendor/crispasr/ggml/src/ggml-cuda/pad.cu +106 -0
  266. data/vendor/crispasr/ggml/src/ggml-cuda/pad.cuh +5 -0
  267. data/vendor/crispasr/ggml/src/ggml-cuda/pad_reflect_1d.cu +91 -0
  268. data/vendor/crispasr/ggml/src/ggml-cuda/pad_reflect_1d.cuh +5 -0
  269. data/vendor/crispasr/ggml/src/ggml-cuda/pool2d.cu +94 -0
  270. data/vendor/crispasr/ggml/src/ggml-cuda/pool2d.cuh +5 -0
  271. data/vendor/crispasr/ggml/src/ggml-cuda/quantize.cu +443 -0
  272. data/vendor/crispasr/ggml/src/ggml-cuda/quantize.cuh +41 -0
  273. data/vendor/crispasr/ggml/src/ggml-cuda/reduce_rows.cuh +39 -0
  274. data/vendor/crispasr/ggml/src/ggml-cuda/roll.cu +67 -0
  275. data/vendor/crispasr/ggml/src/ggml-cuda/roll.cuh +5 -0
  276. data/vendor/crispasr/ggml/src/ggml-cuda/rope.cu +665 -0
  277. data/vendor/crispasr/ggml/src/ggml-cuda/rope.cuh +9 -0
  278. data/vendor/crispasr/ggml/src/ggml-cuda/scale.cu +34 -0
  279. data/vendor/crispasr/ggml/src/ggml-cuda/scale.cuh +5 -0
  280. data/vendor/crispasr/ggml/src/ggml-cuda/set-rows.cu +330 -0
  281. data/vendor/crispasr/ggml/src/ggml-cuda/set-rows.cuh +7 -0
  282. data/vendor/crispasr/ggml/src/ggml-cuda/set.cu +39 -0
  283. data/vendor/crispasr/ggml/src/ggml-cuda/set.cuh +7 -0
  284. data/vendor/crispasr/ggml/src/ggml-cuda/softcap.cu +34 -0
  285. data/vendor/crispasr/ggml/src/ggml-cuda/softcap.cuh +5 -0
  286. data/vendor/crispasr/ggml/src/ggml-cuda/softmax.cu +472 -0
  287. data/vendor/crispasr/ggml/src/ggml-cuda/softmax.cuh +7 -0
  288. data/vendor/crispasr/ggml/src/ggml-cuda/solve_tri.cu +275 -0
  289. data/vendor/crispasr/ggml/src/ggml-cuda/solve_tri.cuh +3 -0
  290. data/vendor/crispasr/ggml/src/ggml-cuda/ssm-conv.cu +197 -0
  291. data/vendor/crispasr/ggml/src/ggml-cuda/ssm-conv.cuh +3 -0
  292. data/vendor/crispasr/ggml/src/ggml-cuda/ssm-scan.cu +342 -0
  293. data/vendor/crispasr/ggml/src/ggml-cuda/ssm-scan.cuh +3 -0
  294. data/vendor/crispasr/ggml/src/ggml-cuda/sum.cu +41 -0
  295. data/vendor/crispasr/ggml/src/ggml-cuda/sum.cuh +5 -0
  296. data/vendor/crispasr/ggml/src/ggml-cuda/sumrows.cu +43 -0
  297. data/vendor/crispasr/ggml/src/ggml-cuda/sumrows.cuh +4 -0
  298. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_1-ncols2_16.cu +5 -0
  299. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_1-ncols2_32.cu +6 -0
  300. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_1-ncols2_8.cu +11 -0
  301. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_16-ncols2_1.cu +10 -0
  302. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_16-ncols2_2.cu +10 -0
  303. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_16-ncols2_4.cu +12 -0
  304. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_16.cu +5 -0
  305. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_32.cu +6 -0
  306. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_4.cu +12 -0
  307. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_2-ncols2_8.cu +11 -0
  308. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_32-ncols2_1.cu +10 -0
  309. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_32-ncols2_2.cu +10 -0
  310. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_16.cu +5 -0
  311. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_2.cu +10 -0
  312. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_4.cu +12 -0
  313. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_4-ncols2_8.cu +11 -0
  314. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_64-ncols2_1.cu +10 -0
  315. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_8-ncols2_1.cu +10 -0
  316. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_8-ncols2_2.cu +10 -0
  317. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_8-ncols2_4.cu +12 -0
  318. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-mma-f16-instance-ncols1_8-ncols2_8.cu +11 -0
  319. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq112-dv112.cu +5 -0
  320. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq128-dv128.cu +5 -0
  321. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq256-dv256.cu +5 -0
  322. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq320-dv256.cu +5 -0
  323. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq40-dv40.cu +5 -0
  324. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq512-dv512.cu +5 -0
  325. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq576-dv512.cu +5 -0
  326. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq64-dv64.cu +5 -0
  327. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq72-dv72.cu +5 -0
  328. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq80-dv80.cu +5 -0
  329. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-tile-instance-dkq96-dv96.cu +5 -0
  330. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-bf16.cu +7 -0
  331. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-f16.cu +7 -0
  332. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q4_0.cu +7 -0
  333. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q4_1.cu +7 -0
  334. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q5_0.cu +7 -0
  335. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q5_1.cu +7 -0
  336. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-bf16-q8_0.cu +7 -0
  337. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-bf16.cu +7 -0
  338. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-f16.cu +7 -0
  339. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-q4_0.cu +7 -0
  340. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-q4_1.cu +7 -0
  341. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-q5_0.cu +7 -0
  342. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-q5_1.cu +7 -0
  343. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-f16-q8_0.cu +7 -0
  344. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-bf16.cu +7 -0
  345. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-f16.cu +7 -0
  346. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-q4_0.cu +7 -0
  347. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-q4_1.cu +7 -0
  348. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-q5_0.cu +7 -0
  349. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-q5_1.cu +7 -0
  350. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_0-q8_0.cu +7 -0
  351. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-bf16.cu +7 -0
  352. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-f16.cu +7 -0
  353. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-q4_0.cu +7 -0
  354. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-q4_1.cu +7 -0
  355. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-q5_0.cu +7 -0
  356. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-q5_1.cu +7 -0
  357. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q4_1-q8_0.cu +7 -0
  358. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-bf16.cu +7 -0
  359. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-f16.cu +7 -0
  360. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-q4_0.cu +7 -0
  361. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-q4_1.cu +7 -0
  362. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-q5_0.cu +7 -0
  363. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-q5_1.cu +7 -0
  364. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_0-q8_0.cu +7 -0
  365. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-bf16.cu +7 -0
  366. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-f16.cu +7 -0
  367. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-q4_0.cu +7 -0
  368. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-q4_1.cu +7 -0
  369. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-q5_0.cu +7 -0
  370. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-q5_1.cu +7 -0
  371. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q5_1-q8_0.cu +7 -0
  372. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-bf16.cu +7 -0
  373. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-f16.cu +7 -0
  374. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-q4_0.cu +7 -0
  375. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-q4_1.cu +7 -0
  376. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-q5_0.cu +7 -0
  377. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-q5_1.cu +7 -0
  378. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/fattn-vec-instance-q8_0-q8_0.cu +7 -0
  379. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_1.cu +5 -0
  380. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_10.cu +5 -0
  381. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_11.cu +5 -0
  382. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_12.cu +5 -0
  383. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_13.cu +5 -0
  384. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_14.cu +5 -0
  385. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_15.cu +5 -0
  386. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_16.cu +5 -0
  387. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_2.cu +5 -0
  388. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_3.cu +5 -0
  389. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_4.cu +5 -0
  390. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_5.cu +5 -0
  391. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_6.cu +5 -0
  392. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_7.cu +5 -0
  393. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_8.cu +5 -0
  394. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmf-instance-ncols_9.cu +5 -0
  395. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-iq1_s.cu +5 -0
  396. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-iq2_s.cu +5 -0
  397. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-iq2_xs.cu +5 -0
  398. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-iq2_xxs.cu +5 -0
  399. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-iq3_s.cu +5 -0
  400. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-iq3_xxs.cu +5 -0
  401. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-iq4_nl.cu +5 -0
  402. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-iq4_xs.cu +5 -0
  403. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-mxfp4.cu +5 -0
  404. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-nvfp4.cu +5 -0
  405. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-q1_0.cu +5 -0
  406. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-q2_k.cu +5 -0
  407. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-q3_k.cu +5 -0
  408. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-q4_0.cu +5 -0
  409. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-q4_1.cu +5 -0
  410. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-q4_k.cu +5 -0
  411. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-q5_0.cu +5 -0
  412. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-q5_1.cu +5 -0
  413. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-q5_k.cu +5 -0
  414. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-q6_k.cu +5 -0
  415. data/vendor/crispasr/ggml/src/ggml-cuda/template-instances/mmq-instance-q8_0.cu +5 -0
  416. data/vendor/crispasr/ggml/src/ggml-cuda/top-k.cu +95 -0
  417. data/vendor/crispasr/ggml/src/ggml-cuda/top-k.cuh +3 -0
  418. data/vendor/crispasr/ggml/src/ggml-cuda/topk-moe.cu +415 -0
  419. data/vendor/crispasr/ggml/src/ggml-cuda/topk-moe.cuh +27 -0
  420. data/vendor/crispasr/ggml/src/ggml-cuda/tri.cu +136 -0
  421. data/vendor/crispasr/ggml/src/ggml-cuda/tri.cuh +5 -0
  422. data/vendor/crispasr/ggml/src/ggml-cuda/tsembd.cu +47 -0
  423. data/vendor/crispasr/ggml/src/ggml-cuda/tsembd.cuh +5 -0
  424. data/vendor/crispasr/ggml/src/ggml-cuda/unary.cu +644 -0
  425. data/vendor/crispasr/ggml/src/ggml-cuda/unary.cuh +116 -0
  426. data/vendor/crispasr/ggml/src/ggml-cuda/upscale.cu +293 -0
  427. data/vendor/crispasr/ggml/src/ggml-cuda/upscale.cuh +5 -0
  428. data/vendor/crispasr/ggml/src/ggml-cuda/vecdotq.cuh +1317 -0
  429. data/vendor/crispasr/ggml/src/ggml-cuda/vendors/cuda.h +28 -0
  430. data/vendor/crispasr/ggml/src/ggml-cuda/vendors/hip.h +306 -0
  431. data/vendor/crispasr/ggml/src/ggml-cuda/vendors/musa.h +148 -0
  432. data/vendor/crispasr/ggml/src/ggml-cuda/wkv.cu +199 -0
  433. data/vendor/crispasr/ggml/src/ggml-cuda/wkv.cuh +7 -0
  434. data/vendor/crispasr/ggml/src/ggml-impl.h +783 -0
  435. data/vendor/crispasr/ggml/src/ggml-metal/CMakeLists.txt +124 -0
  436. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal-common.cpp +457 -0
  437. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal-common.h +52 -0
  438. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal-context.h +41 -0
  439. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal-context.m +778 -0
  440. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal-device.cpp +2117 -0
  441. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal-device.h +299 -0
  442. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal-device.m +2093 -0
  443. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal-impl.h +1267 -0
  444. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal-ops.cpp +5023 -0
  445. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal-ops.h +111 -0
  446. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal.cpp +954 -0
  447. data/vendor/crispasr/ggml/src/ggml-metal/ggml-metal.metal +11756 -0
  448. data/vendor/crispasr/ggml/src/ggml-opt.cpp +1094 -0
  449. data/vendor/crispasr/ggml/src/ggml-quants.c +5491 -0
  450. data/vendor/crispasr/ggml/src/ggml-quants.h +112 -0
  451. data/vendor/crispasr/ggml/src/ggml-threading.cpp +12 -0
  452. data/vendor/crispasr/ggml/src/ggml-threading.h +14 -0
  453. data/vendor/crispasr/ggml/src/ggml.c +7925 -0
  454. data/vendor/crispasr/ggml/src/ggml.cpp +26 -0
  455. data/vendor/crispasr/ggml/src/gguf.cpp +1556 -0
  456. data/vendor/crispasr/src/cohere-arch.h +137 -0
  457. data/vendor/crispasr/src/cohere.cpp +5642 -0
  458. data/vendor/crispasr/src/cohere.h +327 -0
  459. data/vendor/crispasr/src/cohere_batch_planner.h +82 -0
  460. data/vendor/crispasr/src/cohere_chunking.h +64 -0
  461. data/vendor/crispasr/src/cohere_decoder_batch_layout.h +60 -0
  462. data/vendor/crispasr/src/cohere_encoder_padded_layout.h +27 -0
  463. data/vendor/crispasr/src/cohere_frontend.cpp +189 -0
  464. data/vendor/crispasr/src/cohere_frontend.h +31 -0
  465. data/vendor/crispasr/src/cohere_ragged_controller.h +149 -0
  466. data/vendor/crispasr/src/cohere_token_renderer.h +181 -0
  467. data/vendor/crispasr/src/core/attention.h +924 -0
  468. data/vendor/crispasr/src/core/audio_chunking.h +97 -0
  469. data/vendor/crispasr/src/core/beam_decode.h +486 -0
  470. data/vendor/crispasr/src/core/cpu_ops.h +135 -0
  471. data/vendor/crispasr/src/core/gguf_loader.cpp +1021 -0
  472. data/vendor/crispasr/src/core/gguf_loader.h +216 -0
  473. data/vendor/crispasr/src/core/gpu_backend_pref.h +119 -0
  474. data/vendor/crispasr/src/core/mel.cpp +519 -0
  475. data/vendor/crispasr/src/core/mel.h +265 -0
  476. data/vendor/crispasr/src/core/ngram_loop_fix.h +173 -0
  477. data/vendor/crispasr/src/core/repetition_loop_guard.h +54 -0
  478. data/vendor/crispasr/src/crispasr_imatrix.cpp +255 -0
  479. data/vendor/crispasr/src/crispasr_imatrix.h +38 -0
  480. metadata +596 -0
@@ -0,0 +1,1329 @@
1
+ #pragma once
2
+
3
+ #include "ggml-cpu-impl.h"
4
+
5
+ #ifdef __ARM_FEATURE_SVE
6
+ #include <arm_sve.h>
7
+ #endif // __ARM_FEATURE_SVE
8
+
9
+ #if defined(__ARM_NEON) && !defined(__CUDACC__) && !defined(__MUSACC__)
10
+ // if YCM cannot find <arm_neon.h>, make a symbolic link to it, for example:
11
+ //
12
+ // $ ln -sfn /Library/Developer/CommandLineTools/usr/lib/clang/13.1.6/include/arm_neon.h ./src/
13
+ //
14
+ #include <arm_neon.h>
15
+ #endif
16
+
17
+ #if defined(__riscv_v_intrinsic)
18
+ #include <riscv_vector.h>
19
+ #endif
20
+
21
+ #ifdef __cplusplus
22
+ extern "C" {
23
+ #endif
24
+
25
+ //
26
+ // simd mappings
27
+ //
28
+
29
+ // FP16 to FP32 conversion
30
+
31
+ // 16-bit float
32
+ // on Arm, we use __fp16
33
+ // on x86, we use uint16_t
34
+ //
35
+ // for old CUDA compilers (<= 11), we use uint16_t: ref https://github.com/ggml-org/llama.cpp/pull/10616
36
+ // for MUSA compilers , we use uint16_t: ref https://github.com/ggml-org/llama.cpp/pull/11843
37
+ //
38
+ #if defined(__ARM_NEON) && !(defined(__CUDACC__) && __CUDACC_VER_MAJOR__ <= 11) && !defined(__MUSACC__)
39
+ #define GGML_CPU_COMPUTE_FP16_TO_FP32(x) neon_compute_fp16_to_fp32(x)
40
+ #define GGML_CPU_COMPUTE_FP32_TO_FP16(x) neon_compute_fp32_to_fp16(x)
41
+
42
+ #define GGML_CPU_FP16_TO_FP32(x) GGML_CPU_COMPUTE_FP16_TO_FP32(x)
43
+
44
+ static inline float neon_compute_fp16_to_fp32(ggml_fp16_t h) {
45
+ __fp16 tmp;
46
+ memcpy(&tmp, &h, sizeof(ggml_fp16_t));
47
+ return (float)tmp;
48
+ }
49
+
50
+ static inline ggml_fp16_t neon_compute_fp32_to_fp16(float f) {
51
+ ggml_fp16_t res;
52
+ __fp16 tmp = f;
53
+ memcpy(&res, &tmp, sizeof(ggml_fp16_t));
54
+ return res;
55
+ }
56
+ #elif defined(__F16C__)
57
+ #ifdef _MSC_VER
58
+ #define GGML_CPU_COMPUTE_FP16_TO_FP32(x) _mm_cvtss_f32(_mm_cvtph_ps(_mm_cvtsi32_si128(x)))
59
+ #define GGML_CPU_COMPUTE_FP32_TO_FP16(x) _mm_extract_epi16(_mm_cvtps_ph(_mm_set_ss(x), 0), 0)
60
+ #else
61
+ #define GGML_CPU_COMPUTE_FP16_TO_FP32(x) _cvtsh_ss(x)
62
+ #define GGML_CPU_COMPUTE_FP32_TO_FP16(x) _cvtss_sh(x, 0)
63
+ #endif
64
+ #elif defined(__POWER9_VECTOR__)
65
+ #define GGML_CPU_COMPUTE_FP16_TO_FP32(x) power_compute_fp16_to_fp32(x)
66
+ #define GGML_CPU_COMPUTE_FP32_TO_FP16(x) power_compute_fp32_to_fp16(x)
67
+ /* the inline asm below is about 12% faster than the lookup method */
68
+ #define GGML_CPU_FP16_TO_FP32(x) GGML_CPU_COMPUTE_FP16_TO_FP32(x)
69
+ #define GGML_CPU_FP32_TO_FP16(x) GGML_CPU_COMPUTE_FP32_TO_FP16(x)
70
+
71
+ static inline float power_compute_fp16_to_fp32(ggml_fp16_t h) {
72
+ float f;
73
+ double d;
74
+ __asm__(
75
+ "mtfprd %0,%2\n"
76
+ "xscvhpdp %0,%0\n"
77
+ "frsp %1,%0\n" :
78
+ /* temp */ "=d"(d),
79
+ /* out */ "=f"(f):
80
+ /* in */ "r"(h));
81
+ return f;
82
+ }
83
+
84
+ static inline ggml_fp16_t power_compute_fp32_to_fp16(float f) {
85
+ double d;
86
+ ggml_fp16_t r;
87
+ __asm__( /* xscvdphp can work on double or single precision */
88
+ "xscvdphp %0,%2\n"
89
+ "mffprd %1,%0\n" :
90
+ /* temp */ "=d"(d),
91
+ /* out */ "=r"(r):
92
+ /* in */ "f"(f));
93
+ return r;
94
+ }
95
+ #elif defined(__riscv) && defined(__riscv_zfhmin)
96
+ static inline float riscv_compute_fp16_to_fp32(ggml_fp16_t h) {
97
+ _Float16 hf;
98
+ memcpy(&hf, &h, sizeof(ggml_fp16_t));
99
+ return hf;
100
+ }
101
+
102
+ static inline ggml_fp16_t riscv_compute_fp32_to_fp16(float f) {
103
+ ggml_fp16_t res;
104
+ _Float16 hf = (_Float16)f;
105
+ memcpy(&res, &hf, sizeof(ggml_fp16_t));
106
+ return res;
107
+ }
108
+
109
+ #define GGML_CPU_COMPUTE_FP16_TO_FP32(x) riscv_compute_fp16_to_fp32(x)
110
+ #define GGML_CPU_COMPUTE_FP32_TO_FP16(x) riscv_compute_fp32_to_fp16(x)
111
+ #define GGML_CPU_FP16_TO_FP32(x) GGML_CPU_COMPUTE_FP16_TO_FP32(x)
112
+ #define GGML_CPU_FP32_TO_FP16(x) GGML_CPU_COMPUTE_FP32_TO_FP16(x)
113
+ #endif
114
+
115
+ // precomputed f32 table for f16 (256 KB)
116
+ // defined in ggml-cpu.c, initialized in ggml_cpu_init()
117
+ extern float ggml_table_f32_f16[1 << 16];
118
+
119
+ // precomputed f32 table for e8m0 half (1 KB)
120
+ // defined in ggml-cpu.c, initialized in ggml_cpu_init()
121
+ extern float ggml_table_f32_e8m0_half[1 << 8];
122
+
123
+ // Use lookup table for E8M0 on x86 (faster than bit manipulation)
124
+ #if defined(__AVX__) || defined(__AVX2__) || defined(__AVX512F__)
125
+ #define GGML_CPU_E8M0_TO_FP32_HALF(x) ggml_table_f32_e8m0_half[(uint8_t)(x)]
126
+ #else
127
+ #define GGML_CPU_E8M0_TO_FP32_HALF(x) GGML_E8M0_TO_FP32_HALF(x)
128
+ #endif
129
+
130
+ // On ARM NEON, it's quicker to directly convert x -> x instead of calling into ggml_lookup_fp16_to_fp32,
131
+ // so we define GGML_CPU_FP16_TO_FP32 and GGML_CPU_FP32_TO_FP16 elsewhere for NEON.
132
+ // This is also true for POWER9.
133
+ #if !defined(GGML_CPU_FP16_TO_FP32)
134
+ inline static float ggml_lookup_fp16_to_fp32(ggml_fp16_t f) {
135
+ uint16_t s;
136
+ memcpy(&s, &f, sizeof(uint16_t));
137
+ return ggml_table_f32_f16[s];
138
+ }
139
+
140
+ #define GGML_CPU_FP16_TO_FP32(x) ggml_lookup_fp16_to_fp32(x)
141
+ #endif
142
+
143
+ #if !defined(GGML_CPU_FP32_TO_FP16)
144
+ #define GGML_CPU_FP32_TO_FP16(x) GGML_COMPUTE_FP32_TO_FP16(x)
145
+ #endif
146
+
147
+
148
+ // we define a common set of C macros which map to specific intrinsics based on the current architecture
149
+ // we then implement the fundamental computation operations below using only these macros
150
+ // adding support for new architectures requires to define the corresponding SIMD macros
151
+ //
152
+ // GGML_F32_STEP / GGML_F16_STEP
153
+ // number of elements to process in a single step
154
+ //
155
+ // GGML_F32_EPR / GGML_F16_EPR
156
+ // number of elements to fit in a single register
157
+ //
158
+
159
+ #if defined(__ARM_FEATURE_SVE) && defined(__ARM_FEATURE_FMA)
160
+
161
+ #define GGML_SIMD
162
+
163
+ // F32 SVE
164
+ #define GGML_F32_EPR 8
165
+ #define DEFAULT_PG svptrue_b32()
166
+
167
+ #define GGML_F32xt svfloat32_t
168
+ #define GGML_F32xt_ZERO svdup_n_f32(0.0f)
169
+ #define GGML_F32xt_SET1(x) svdup_n_f32(x)
170
+ #define GGML_F32xt_LOAD_IMPL(pg, a) svld1_f32(pg, a)
171
+ #define GGML_F32xt_LOAD(a) GGML_F32xt_LOAD_IMPL(DEFAULT_PG, a)
172
+ #define GGML_F32xt_STORE_IMPL(pg, a, b) svst1_f32(pg, a, b)
173
+ #define GGML_F32xt_STORE(a, b) GGML_F32xt_STORE_IMPL(DEFAULT_PG, a, b)
174
+ #define GGML_F32xt_FMA_IMPL(pg, a, b, c) svmad_f32_m(pg, b, c, a)
175
+ #define GGML_F32xt_FMA(a, b, c) GGML_F32xt_FMA_IMPL(DEFAULT_PG, a, b, c)
176
+ #define GGML_F32xt_ADD_IMPL(pg, a, b) svadd_f32_m(pg, a, b)
177
+ #define GGML_F32xt_ADD(a, b) GGML_F32xt_ADD_IMPL(DEFAULT_PG, a, b)
178
+ #define GGML_F32xt_MUL_IMPL(pg, a, b) svmul_f32_m(pg, a, b)
179
+ #define GGML_F32xt_MUL(a, b) GGML_F32xt_MUL_IMPL(DEFAULT_PG, a, b)
180
+ #define GGML_F32xt_REDUCE_ONE_IMPL(pg, a) svaddv(pg, a)
181
+ #define GGML_F32xt_REDUCE_ONE(a) GGML_F32xt_REDUCE_ONE_IMPL(DEFAULT_PG, a)
182
+ #define GGML_F32xt_REDUCE_IMPL(pg, res, sum1, sum2, sum3, sum4, sum5, sum6, sum7, sum8) \
183
+ { \
184
+ sum1 = svadd_f32_m(DEFAULT_PG, sum1, sum2); \
185
+ sum3 = svadd_f32_m(DEFAULT_PG, sum3, sum4); \
186
+ sum5 = svadd_f32_m(DEFAULT_PG, sum5, sum6); \
187
+ sum7 = svadd_f32_m(DEFAULT_PG, sum7, sum8); \
188
+ sum1 = svadd_f32_m(DEFAULT_PG, sum1, sum3); \
189
+ sum5 = svadd_f32_m(DEFAULT_PG, sum5, sum7); \
190
+ sum1 = svadd_f32_m(DEFAULT_PG, sum1, sum5); \
191
+ (res) = (ggml_float) GGML_F32xt_REDUCE_ONE(sum1); \
192
+ }
193
+ #define GGML_F32xt_REDUCE(res, sum1, sum2, sum3, sum4, sum5, sum6, sum7, sum8) \
194
+ GGML_F32xt_REDUCE_IMPL(DEFAULT_PG, res, sum1, sum2, sum3, sum4, sum5, sum6, sum7, sum8)
195
+
196
+ #define GGML_F32_VEC GGML_F32xt
197
+ #define GGML_F32_VEC_ZERO GGML_F32xt_ZERO
198
+ #define GGML_F32_VEC_SET1 GGML_F32xt_SET1
199
+ #define GGML_F32_VEC_LOAD GGML_F32xt_LOAD
200
+ #define GGML_F32_VEC_STORE GGML_F32xt_STORE
201
+ #define GGML_F32_VEC_FMA GGML_F32xt_FMA
202
+ #define GGML_F32_VEC_ADD GGML_F32xt_ADD
203
+ #define GGML_F32_VEC_MUL GGML_F32xt_MUL
204
+ #define GGML_F32_VEC_REDUCE GGML_F32xt_REDUCE
205
+
206
+ // F16 SVE
207
+ #define DEFAULT_PG32 svptrue_b32()
208
+ #define DEFAULT_PG16 svptrue_b16()
209
+
210
+ #define GGML_F32Cxt svfloat16_t
211
+ #define GGML_F32Cxt_ZERO svdup_n_f16(0.0f)
212
+ #define GGML_F32Cxt_SET1(x) svdup_n_f16(x)
213
+ #define GGML_F32Cxt_LOAD(p) svld1_f16(DEFAULT_PG16, (const __fp16 *)(p))
214
+ #define GGML_F32Cxt_STORE(dst_ptr, src_vec) svst1_f16(DEFAULT_PG16, (__fp16 *)(dst_ptr), (src_vec))
215
+
216
+ #define GGML_F32Cxt_FMA_IMPL(pg, a, b, c) svmad_f16_x(pg, b, c, a)
217
+ #define GGML_F32Cxt_FMA(a, b, c) GGML_F32Cxt_FMA_IMPL(DEFAULT_PG16, a, b, c)
218
+ #define GGML_F32Cxt_ADD_IMPL(pg, a, b) svadd_f16_x(pg, a, b)
219
+ #define GGML_F32Cxt_ADD(a, b) GGML_F32Cxt_ADD_IMPL(DEFAULT_PG16, a, b)
220
+ #define GGML_F32Cxt_MUL_IMPL(pg, a, b) svmul_f16_x(pg, a, b)
221
+ #define GGML_F32Cxt_MUL(a, b) GGML_F32Cxt_MUL_IMPL(DEFAULT_PG16, a, b)
222
+ #define GGML_F32Cxt_REDUCE GGML_F16xt_REDUCE_MIXED
223
+
224
+ #define GGML_F16x_VEC GGML_F32Cxt
225
+ #define GGML_F16x_VEC_ZERO GGML_F32Cxt_ZERO
226
+ #define GGML_F16x_VEC_SET1 GGML_F32Cxt_SET1
227
+ #define GGML_F16x_VEC_LOAD(p, i) GGML_F32Cxt_LOAD(p)
228
+ #define GGML_F16x_VEC_STORE(p, r, i) GGML_F32Cxt_STORE((__fp16 *)(p), r)
229
+ #define GGML_F16x_VEC_FMA GGML_F32Cxt_FMA
230
+ #define GGML_F16x_VEC_ADD GGML_F32Cxt_ADD
231
+ #define GGML_F16x_VEC_MUL GGML_F32Cxt_MUL
232
+ #define GGML_F16x_VEC_REDUCE GGML_F32Cxt_REDUCE
233
+
234
+ #define GGML_F16xt_REDUCE_ONE_IMPL(pg, a) svaddv_f16(pg, a)
235
+ #define GGML_F16xt_REDUCE_ONE(a) GGML_F16xt_REDUCE_ONE_IMPL(DEFAULT_PG16, a)
236
+
237
+ #define GGML_F16xt_REDUCE_MIXED_IMPL(pg16, res, sum1, sum2, sum3, sum4) \
238
+ { \
239
+ sum1 = svadd_f16_x(pg16, sum1, sum2); \
240
+ sum3 = svadd_f16_x(pg16, sum3, sum4); \
241
+ sum1 = svadd_f16_x(pg16, sum1, sum3); \
242
+ __fp16 sum_f16 = svaddv_f16(pg16, sum1); \
243
+ (res) = (ggml_float) sum_f16; \
244
+ }
245
+ #define GGML_F16xt_REDUCE_MIXED(res, sum1, sum2, sum3, sum4) \
246
+ GGML_F16xt_REDUCE_MIXED_IMPL(DEFAULT_PG16, res, sum1, sum2, sum3, sum4)
247
+
248
+ // F16 NEON
249
+
250
+ // CrispASR patch (issue #38): force F32 accumulator path. Upstream's
251
+ // vfmaq_f16 (F16 register accumulator) overflows at 65504 on long F16xF16
252
+ // dot products, producing Inf/NaN that propagates through the next layer.
253
+ // Disabling this branch routes to the existing F32-accumulator fallback
254
+ // (vcvt_f32_f16 + vfmaq_f32). MUST RE-APPLY after every ggml bump.
255
+ #if 0 && defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)
256
+ #define GGML_F16_STEP 32
257
+ #define GGML_F16_EPR 8
258
+
259
+ #define GGML_F16x8 float16x8_t
260
+ #define GGML_F16x8_ZERO vdupq_n_f16(0.0f)
261
+ #define GGML_F16x8_SET1(x) vdupq_n_f16(x)
262
+ #define GGML_F16x8_LOAD(x) vld1q_f16((const __fp16 *)(x))
263
+ #define GGML_F16x8_STORE vst1q_f16
264
+ #define GGML_F16x8_FMA(a, b, c) vfmaq_f16(a, b, c)
265
+ #define GGML_F16x8_ADD vaddq_f16
266
+ #define GGML_F16x8_MUL vmulq_f16
267
+ #define GGML_F16x8_REDUCE(res, x) \
268
+ do { \
269
+ int offset = GGML_F16_ARR >> 1; \
270
+ for (int i = 0; i < offset; ++i) { \
271
+ (x)[i] = vaddq_f16((x)[i], (x)[offset+i]); \
272
+ } \
273
+ offset >>= 1; \
274
+ for (int i = 0; i < offset; ++i) { \
275
+ (x)[i] = vaddq_f16((x)[i], (x)[offset+i]); \
276
+ } \
277
+ offset >>= 1; \
278
+ for (int i = 0; i < offset; ++i) { \
279
+ (x)[i] = vaddq_f16((x)[i], (x)[offset+i]); \
280
+ } \
281
+ const float32x4_t t0 = vcvt_f32_f16(vget_low_f16 ((x)[0])); \
282
+ const float32x4_t t1 = vcvt_f32_f16(vget_high_f16((x)[0])); \
283
+ (res) = (ggml_float) vaddvq_f32(vaddq_f32(t0, t1)); \
284
+ } while (0)
285
+
286
+ #define GGML_F16_VEC GGML_F16x8
287
+ #define GGML_F16_VEC_ZERO GGML_F16x8_ZERO
288
+ #define GGML_F16_VEC_SET1 GGML_F16x8_SET1
289
+ #define GGML_F16_VEC_LOAD(p, i) GGML_F16x8_LOAD(p)
290
+ #define GGML_F16_VEC_STORE(p, r, i) GGML_F16x8_STORE((__fp16 *)(p), (r)[i])
291
+ #define GGML_F16_VEC_FMA GGML_F16x8_FMA
292
+ #define GGML_F16_VEC_ADD GGML_F16x8_ADD
293
+ #define GGML_F16_VEC_MUL GGML_F16x8_MUL
294
+ #define GGML_F16_VEC_REDUCE GGML_F16x8_REDUCE
295
+ #else
296
+ // if FP16 vector arithmetic is not supported, we use FP32 instead
297
+ // and take advantage of the vcvt_ functions to convert to/from FP16
298
+
299
+ #define GGML_F16_STEP 16
300
+ #define GGML_F16_EPR 4
301
+
302
+ #define GGML_F32Cx4 float32x4_t
303
+ #define GGML_F32Cx4_ZERO vdupq_n_f32(0.0f)
304
+ #define GGML_F32Cx4_SET1(x) vdupq_n_f32(x)
305
+ #define GGML_F32Cx4_LOAD(x) vcvt_f32_f16(vld1_f16((const __fp16 *)(x)))
306
+ #define GGML_F32Cx4_STORE(x, y) vst1_f16(x, vcvt_f16_f32(y))
307
+ #define GGML_F32Cx4_FMA(a, b, c) vfmaq_f32(a, b, c)
308
+ #define GGML_F32Cx4_ADD vaddq_f32
309
+ #define GGML_F32Cx4_MUL vmulq_f32
310
+ #define GGML_F32Cx4_REDUCE GGML_F32x4_REDUCE
311
+
312
+ #define GGML_F16_VEC GGML_F32Cx4
313
+ #define GGML_F16_VEC_ZERO GGML_F32Cx4_ZERO
314
+ #define GGML_F16_VEC_SET1 GGML_F32Cx4_SET1
315
+ #define GGML_F16_VEC_LOAD(p, i) GGML_F32Cx4_LOAD(p)
316
+ #define GGML_F16_VEC_STORE(p, r, i) GGML_F32Cx4_STORE((__fp16 *)(p), r[i])
317
+ #define GGML_F16_VEC_FMA GGML_F32Cx4_FMA
318
+ #define GGML_F16_VEC_ADD GGML_F32Cx4_ADD
319
+ #define GGML_F16_VEC_MUL GGML_F32Cx4_MUL
320
+ #define GGML_F16_VEC_REDUCE GGML_F32Cx4_REDUCE
321
+ #endif
322
+
323
+ #elif defined(__ARM_NEON) && defined(__ARM_FEATURE_FMA)
324
+
325
+ #define GGML_SIMD
326
+
327
+ // F32 NEON
328
+
329
+ #define GGML_F32_STEP 16
330
+ #define GGML_F32_EPR 4
331
+
332
+ #define GGML_F32x4 float32x4_t
333
+ #define GGML_F32x4_ZERO vdupq_n_f32(0.0f)
334
+ #define GGML_F32x4_SET1(x) vdupq_n_f32(x)
335
+ #define GGML_F32x4_LOAD vld1q_f32
336
+ #define GGML_F32x4_STORE vst1q_f32
337
+ #define GGML_F32x4_FMA(a, b, c) vfmaq_f32(a, b, c)
338
+ #define GGML_F32x4_ADD vaddq_f32
339
+ #define GGML_F32x4_MUL vmulq_f32
340
+ #define GGML_F32x4_REDUCE_ONE(x) vaddvq_f32(x)
341
+ #define GGML_F32x4_REDUCE(res, x) \
342
+ { \
343
+ int offset = GGML_F32_ARR >> 1; \
344
+ for (int i = 0; i < offset; ++i) { \
345
+ (x)[i] = vaddq_f32((x)[i], (x)[offset+i]); \
346
+ } \
347
+ offset >>= 1; \
348
+ for (int i = 0; i < offset; ++i) { \
349
+ (x)[i] = vaddq_f32((x)[i], (x)[offset+i]); \
350
+ } \
351
+ offset >>= 1; \
352
+ for (int i = 0; i < offset; ++i) { \
353
+ (x)[i] = vaddq_f32((x)[i], (x)[offset+i]); \
354
+ } \
355
+ (res) = (ggml_float) GGML_F32x4_REDUCE_ONE((x)[0]); \
356
+ }
357
+
358
+ #define GGML_F32_VEC GGML_F32x4
359
+ #define GGML_F32_VEC_ZERO GGML_F32x4_ZERO
360
+ #define GGML_F32_VEC_SET1 GGML_F32x4_SET1
361
+ #define GGML_F32_VEC_LOAD GGML_F32x4_LOAD
362
+ #define GGML_F32_VEC_STORE GGML_F32x4_STORE
363
+ #define GGML_F32_VEC_FMA GGML_F32x4_FMA
364
+ #define GGML_F32_VEC_ADD GGML_F32x4_ADD
365
+ #define GGML_F32_VEC_MUL GGML_F32x4_MUL
366
+ #define GGML_F32_VEC_REDUCE GGML_F32x4_REDUCE
367
+
368
+ // F16 NEON
369
+
370
+ // CrispASR patch (issue #38): force F32 accumulator path. Upstream's
371
+ // vfmaq_f16 (F16 register accumulator) overflows at 65504 on long F16xF16
372
+ // dot products, producing Inf/NaN that propagates through the next layer.
373
+ // Disabling this branch routes to the existing F32-accumulator fallback
374
+ // (vcvt_f32_f16 + vfmaq_f32). MUST RE-APPLY after every ggml bump.
375
+ #if 0 && defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)
376
+ #define GGML_F16_STEP 32
377
+ #define GGML_F16_EPR 8
378
+
379
+ #define GGML_F16x8 float16x8_t
380
+ #define GGML_F16x8_ZERO vdupq_n_f16(0.0f)
381
+ #define GGML_F16x8_SET1(x) vdupq_n_f16(x)
382
+ #define GGML_F16x8_LOAD(x) vld1q_f16((const __fp16 *)(x))
383
+ #define GGML_F16x8_STORE vst1q_f16
384
+ #define GGML_F16x8_FMA(a, b, c) vfmaq_f16(a, b, c)
385
+ #define GGML_F16x8_ADD vaddq_f16
386
+ #define GGML_F16x8_MUL vmulq_f16
387
+ #define GGML_F16x8_REDUCE(res, x) \
388
+ do { \
389
+ int offset = GGML_F16_ARR >> 1; \
390
+ for (int i = 0; i < offset; ++i) { \
391
+ (x)[i] = vaddq_f16((x)[i], (x)[offset+i]); \
392
+ } \
393
+ offset >>= 1; \
394
+ for (int i = 0; i < offset; ++i) { \
395
+ (x)[i] = vaddq_f16((x)[i], (x)[offset+i]); \
396
+ } \
397
+ offset >>= 1; \
398
+ for (int i = 0; i < offset; ++i) { \
399
+ (x)[i] = vaddq_f16((x)[i], (x)[offset+i]); \
400
+ } \
401
+ const float32x4_t t0 = vcvt_f32_f16(vget_low_f16 ((x)[0])); \
402
+ const float32x4_t t1 = vcvt_f32_f16(vget_high_f16((x)[0])); \
403
+ (res) = (ggml_float) vaddvq_f32(vaddq_f32(t0, t1)); \
404
+ } while (0)
405
+
406
+ #define GGML_F16_VEC GGML_F16x8
407
+ #define GGML_F16_VEC_ZERO GGML_F16x8_ZERO
408
+ #define GGML_F16_VEC_SET1 GGML_F16x8_SET1
409
+ #define GGML_F16_VEC_LOAD(p, i) GGML_F16x8_LOAD(p)
410
+ #define GGML_F16_VEC_STORE(p, r, i) GGML_F16x8_STORE((__fp16 *)(p), (r)[i])
411
+ #define GGML_F16_VEC_FMA GGML_F16x8_FMA
412
+ #define GGML_F16_VEC_ADD GGML_F16x8_ADD
413
+ #define GGML_F16_VEC_MUL GGML_F16x8_MUL
414
+ #define GGML_F16_VEC_REDUCE GGML_F16x8_REDUCE
415
+ #else
416
+ // if FP16 vector arithmetic is not supported, we use FP32 instead
417
+ // and take advantage of the vcvt_ functions to convert to/from FP16
418
+
419
+ #define GGML_F16_STEP 16
420
+ #define GGML_F16_EPR 4
421
+
422
+ #define GGML_F32Cx4 float32x4_t
423
+ #define GGML_F32Cx4_ZERO vdupq_n_f32(0.0f)
424
+ #define GGML_F32Cx4_SET1(x) vdupq_n_f32(x)
425
+ #define GGML_F32Cx4_LOAD(x) vcvt_f32_f16(vld1_f16((const __fp16 *)(x)))
426
+ #define GGML_F32Cx4_STORE(x, y) vst1_f16(x, vcvt_f16_f32(y))
427
+ #define GGML_F32Cx4_FMA(a, b, c) vfmaq_f32(a, b, c)
428
+ #define GGML_F32Cx4_ADD vaddq_f32
429
+ #define GGML_F32Cx4_MUL vmulq_f32
430
+ #define GGML_F32Cx4_REDUCE GGML_F32x4_REDUCE
431
+
432
+ #define GGML_F16_VEC GGML_F32Cx4
433
+ #define GGML_F16_VEC_ZERO GGML_F32Cx4_ZERO
434
+ #define GGML_F16_VEC_SET1 GGML_F32Cx4_SET1
435
+ #define GGML_F16_VEC_LOAD(p, i) GGML_F32Cx4_LOAD(p)
436
+ #define GGML_F16_VEC_STORE(p, r, i) GGML_F32Cx4_STORE((__fp16 *)(p), r[i])
437
+ #define GGML_F16_VEC_FMA GGML_F32Cx4_FMA
438
+ #define GGML_F16_VEC_ADD GGML_F32Cx4_ADD
439
+ #define GGML_F16_VEC_MUL GGML_F32Cx4_MUL
440
+ #define GGML_F16_VEC_REDUCE GGML_F32Cx4_REDUCE
441
+ #endif
442
+
443
+ #elif defined(__AVX512F__)
444
+
445
+ #define GGML_SIMD
446
+
447
+ // F32 AVX512
448
+
449
+ #define GGML_F32_STEP 64
450
+ #define GGML_F32_EPR 16
451
+
452
+ #define GGML_F32x16 __m512
453
+ #define GGML_F32x16_ZERO _mm512_setzero_ps()
454
+ #define GGML_F32x16_SET1(x) _mm512_set1_ps(x)
455
+ #define GGML_F32x16_LOAD _mm512_loadu_ps
456
+ #define GGML_F32x16_STORE _mm512_storeu_ps
457
+ // _mm512_fmadd_ps is defined in AVX512F so no guard is required
458
+ #define GGML_F32x16_FMA(a, b, c) _mm512_fmadd_ps(b, c, a)
459
+ #define GGML_F32x16_ADD _mm512_add_ps
460
+ #define GGML_F32x16_MUL _mm512_mul_ps
461
+ #define GGML_F32x16_REDUCE(res, x) \
462
+ do { \
463
+ int offset = GGML_F32_ARR >> 1; \
464
+ for (int i = 0; i < offset; ++i) { \
465
+ x[i] = _mm512_add_ps(x[i], x[offset+i]); \
466
+ } \
467
+ offset >>= 1; \
468
+ for (int i = 0; i < offset; ++i) { \
469
+ x[i] = _mm512_add_ps(x[i], x[offset+i]); \
470
+ } \
471
+ offset >>= 1; \
472
+ for (int i = 0; i < offset; ++i) { \
473
+ x[i] = _mm512_add_ps(x[i], x[offset+i]); \
474
+ } \
475
+ res = (ggml_float) _mm512_reduce_add_ps(x[0]); \
476
+ } while (0)
477
+
478
+ // TODO: is this optimal ?
479
+
480
+ #define GGML_F32_VEC GGML_F32x16
481
+ #define GGML_F32_VEC_ZERO GGML_F32x16_ZERO
482
+ #define GGML_F32_VEC_SET1 GGML_F32x16_SET1
483
+ #define GGML_F32_VEC_LOAD GGML_F32x16_LOAD
484
+ #define GGML_F32_VEC_STORE GGML_F32x16_STORE
485
+ #define GGML_F32_VEC_FMA GGML_F32x16_FMA
486
+ #define GGML_F32_VEC_ADD GGML_F32x16_ADD
487
+ #define GGML_F32_VEC_MUL GGML_F32x16_MUL
488
+ #define GGML_F32_VEC_REDUCE GGML_F32x16_REDUCE
489
+
490
+ // F16 AVX512
491
+
492
+ #if defined(__AVX512FP16__)
493
+
494
+ #define GGML_F16_STEP 128
495
+ #define GGML_F16_EPR 32
496
+
497
+ #define GGML_F16x32 __m512h
498
+ #define GGML_F16x32_ZERO _mm512_setzero_ph()
499
+ #define GGML_F16x32_SET1(x) _mm512_set1_ph(__extension__(_Float16)(x))
500
+ #define GGML_F16x32_LOAD(x) _mm512_loadu_ph(x)
501
+ #define GGML_F16x32_STORE(x, y) _mm512_storeu_ph(x, y)
502
+ #define GGML_F16x32_FMA(a, b, c) _mm512_fmadd_ph(b, c, a)
503
+ #define GGML_F16x32_ADD _mm512_add_ph
504
+ #define GGML_F16x32_MUL _mm512_mul_ph
505
+ #define GGML_F16x32_REDUCE(res, x) \
506
+ do { \
507
+ int offset = GGML_F16_ARR >> 1; \
508
+ for (int i = 0; i < offset; ++i) { \
509
+ x[i] = _mm512_add_ph(x[i], x[offset+i]); \
510
+ } \
511
+ offset >>= 1; \
512
+ for (int i = 0; i < offset; ++i) { \
513
+ x[i] = _mm512_add_ph(x[i], x[offset+i]); \
514
+ } \
515
+ offset >>= 1; \
516
+ for (int i = 0; i < offset; ++i) { \
517
+ x[i] = _mm512_add_ph(x[i], x[offset+i]); \
518
+ } \
519
+ res = (ggml_float) _mm512_reduce_add_ph(x[0]); \
520
+ } while (0)
521
+
522
+ #define GGML_F16_VEC GGML_F16x32
523
+ #define GGML_F16_VEC_ZERO GGML_F16x32_ZERO
524
+ #define GGML_F16_VEC_SET1 GGML_F16x32_SET1
525
+ #define GGML_F16_VEC_LOAD(p, i) GGML_F16x32_LOAD(p)
526
+ #define GGML_F16_VEC_STORE(p, r, i) GGML_F16x32_STORE(p, r[i])
527
+ #define GGML_F16_VEC_FMA GGML_F16x32_FMA
528
+ #define GGML_F16_VEC_ADD GGML_F16x32_ADD
529
+ #define GGML_F16_VEC_MUL GGML_F16x32_MUL
530
+ #define GGML_F16_VEC_REDUCE GGML_F16x32_REDUCE
531
+
532
+ #else // Fallback FP16 <-> FP32
533
+
534
+ #define GGML_F16_STEP 64
535
+ #define GGML_F16_EPR 16
536
+
537
+ #define GGML_F32Cx16 __m512
538
+ #define GGML_F32Cx16_ZERO _mm512_setzero_ps()
539
+ #define GGML_F32Cx16_SET1(x) _mm512_set1_ps(x)
540
+
541
+ // unlike _mm256_cvt intrinsics that require F16C, _mm512_cvt is defined in AVX512F
542
+ // so F16C guard isn't required
543
+ #define GGML_F32Cx16_LOAD(x) _mm512_cvtph_ps(_mm256_loadu_si256((const __m256i *)(x)))
544
+ #define GGML_F32Cx16_STORE(x, y) _mm256_storeu_si256((__m256i *)(x), _mm512_cvtps_ph(y, 0))
545
+
546
+ #define GGML_F32Cx16_FMA(a, b, c) _mm512_fmadd_ps(b, c, a)
547
+ #define GGML_F32Cx16_ADD _mm512_add_ps
548
+ #define GGML_F32Cx16_MUL _mm512_mul_ps
549
+ #define GGML_F32Cx16_REDUCE(res, x) \
550
+ do { \
551
+ int offset = GGML_F32_ARR >> 1; \
552
+ for (int i = 0; i < offset; ++i) { \
553
+ x[i] = _mm512_add_ps(x[i], x[offset+i]); \
554
+ } \
555
+ offset >>= 1; \
556
+ for (int i = 0; i < offset; ++i) { \
557
+ x[i] = _mm512_add_ps(x[i], x[offset+i]); \
558
+ } \
559
+ offset >>= 1; \
560
+ for (int i = 0; i < offset; ++i) { \
561
+ x[i] = _mm512_add_ps(x[i], x[offset+i]); \
562
+ } \
563
+ res = (ggml_float) _mm512_reduce_add_ps(x[0]); \
564
+ } while (0)
565
+
566
+ #define GGML_F16_VEC GGML_F32Cx16
567
+ #define GGML_F16_VEC_ZERO GGML_F32Cx16_ZERO
568
+ #define GGML_F16_VEC_SET1 GGML_F32Cx16_SET1
569
+ #define GGML_F16_VEC_LOAD(p, i) GGML_F32Cx16_LOAD(p)
570
+ #define GGML_F16_VEC_STORE(p, r, i) GGML_F32Cx16_STORE(p, r[i])
571
+ #define GGML_F16_VEC_FMA GGML_F32Cx16_FMA
572
+ #define GGML_F16_VEC_ADD GGML_F32Cx16_ADD
573
+ #define GGML_F16_VEC_MUL GGML_F32Cx16_MUL
574
+
575
+ #define GGML_F16_VEC_REDUCE GGML_F32Cx16_REDUCE
576
+
577
+ #endif // __AVX512FP16__
578
+ #elif defined(__AVX__)
579
+
580
+ #define GGML_SIMD
581
+
582
+ // F32 AVX
583
+
584
+ #define GGML_F32_STEP 32
585
+ #define GGML_F32_EPR 8
586
+
587
+ #define GGML_F32x8 __m256
588
+ #define GGML_F32x8_ZERO _mm256_setzero_ps()
589
+ #define GGML_F32x8_SET1(x) _mm256_set1_ps(x)
590
+ #define GGML_F32x8_LOAD _mm256_loadu_ps
591
+ #define GGML_F32x8_STORE _mm256_storeu_ps
592
+ #if defined(__FMA__)
593
+ #define GGML_F32x8_FMA(a, b, c) _mm256_fmadd_ps(b, c, a)
594
+ #else
595
+ #define GGML_F32x8_FMA(a, b, c) _mm256_add_ps(_mm256_mul_ps(b, c), a)
596
+ #endif
597
+ #define GGML_F32x8_ADD _mm256_add_ps
598
+ #define GGML_F32x8_MUL _mm256_mul_ps
599
+ #define GGML_F32x8_REDUCE(res, x) \
600
+ do { \
601
+ int offset = GGML_F32_ARR >> 1; \
602
+ for (int i = 0; i < offset; ++i) { \
603
+ x[i] = _mm256_add_ps(x[i], x[offset+i]); \
604
+ } \
605
+ offset >>= 1; \
606
+ for (int i = 0; i < offset; ++i) { \
607
+ x[i] = _mm256_add_ps(x[i], x[offset+i]); \
608
+ } \
609
+ offset >>= 1; \
610
+ for (int i = 0; i < offset; ++i) { \
611
+ x[i] = _mm256_add_ps(x[i], x[offset+i]); \
612
+ } \
613
+ const __m128 t0 = _mm_add_ps(_mm256_castps256_ps128(x[0]), \
614
+ _mm256_extractf128_ps(x[0], 1)); \
615
+ const __m128 t1 = _mm_hadd_ps(t0, t0); \
616
+ res = (ggml_float) _mm_cvtss_f32(_mm_hadd_ps(t1, t1)); \
617
+ } while (0)
618
+ // TODO: is this optimal ?
619
+
620
+ #define GGML_F32_VEC GGML_F32x8
621
+ #define GGML_F32_VEC_ZERO GGML_F32x8_ZERO
622
+ #define GGML_F32_VEC_SET1 GGML_F32x8_SET1
623
+ #define GGML_F32_VEC_LOAD GGML_F32x8_LOAD
624
+ #define GGML_F32_VEC_STORE GGML_F32x8_STORE
625
+ #define GGML_F32_VEC_FMA GGML_F32x8_FMA
626
+ #define GGML_F32_VEC_ADD GGML_F32x8_ADD
627
+ #define GGML_F32_VEC_MUL GGML_F32x8_MUL
628
+ #define GGML_F32_VEC_REDUCE GGML_F32x8_REDUCE
629
+
630
+ // F16 AVX
631
+
632
+ #define GGML_F16_STEP 32
633
+ #define GGML_F16_EPR 8
634
+
635
+ // F16 arithmetic is not supported by AVX, so we use F32 instead
636
+
637
+ #define GGML_F32Cx8 __m256
638
+ #define GGML_F32Cx8_ZERO _mm256_setzero_ps()
639
+ #define GGML_F32Cx8_SET1(x) _mm256_set1_ps(x)
640
+
641
+ #if defined(__F16C__)
642
+ // the _mm256_cvt intrinsics require F16C
643
+ #define GGML_F32Cx8_LOAD(x) _mm256_cvtph_ps(_mm_loadu_si128((const __m128i *)(x)))
644
+ #define GGML_F32Cx8_STORE(x, y) _mm_storeu_si128((__m128i *)(x), _mm256_cvtps_ph(y, 0))
645
+ #else
646
+ static inline __m256 __avx_f32cx8_load(const ggml_fp16_t * x) {
647
+ float tmp[8];
648
+
649
+ for (int i = 0; i < 8; i++) {
650
+ tmp[i] = GGML_CPU_FP16_TO_FP32(x[i]);
651
+ }
652
+
653
+ return _mm256_loadu_ps(tmp);
654
+ }
655
+ static inline void __avx_f32cx8_store(ggml_fp16_t *x, __m256 y) {
656
+ float arr[8];
657
+
658
+ _mm256_storeu_ps(arr, y);
659
+
660
+ for (int i = 0; i < 8; i++)
661
+ x[i] = GGML_CPU_FP32_TO_FP16(arr[i]);
662
+ }
663
+ #define GGML_F32Cx8_LOAD(x) __avx_f32cx8_load(x)
664
+ #define GGML_F32Cx8_STORE(x, y) __avx_f32cx8_store(x, y)
665
+ #endif
666
+
667
+ #define GGML_F32Cx8_FMA GGML_F32x8_FMA
668
+ #define GGML_F32Cx8_ADD _mm256_add_ps
669
+ #define GGML_F32Cx8_MUL _mm256_mul_ps
670
+ #define GGML_F32Cx8_REDUCE GGML_F32x8_REDUCE
671
+
672
+ #define GGML_F16_VEC GGML_F32Cx8
673
+ #define GGML_F16_VEC_ZERO GGML_F32Cx8_ZERO
674
+ #define GGML_F16_VEC_SET1 GGML_F32Cx8_SET1
675
+ #define GGML_F16_VEC_LOAD(p, i) GGML_F32Cx8_LOAD(p)
676
+ #define GGML_F16_VEC_STORE(p, r, i) GGML_F32Cx8_STORE(p, r[i])
677
+ #define GGML_F16_VEC_FMA GGML_F32Cx8_FMA
678
+ #define GGML_F16_VEC_ADD GGML_F32Cx8_ADD
679
+ #define GGML_F16_VEC_MUL GGML_F32Cx8_MUL
680
+ #define GGML_F16_VEC_REDUCE GGML_F32Cx8_REDUCE
681
+
682
+ #elif defined(__POWER9_VECTOR__)
683
+
684
+ #define GGML_SIMD
685
+
686
+ // F32 POWER9
687
+
688
+ #define GGML_F32_STEP 32
689
+ #define GGML_F32_EPR 4
690
+
691
+ #define GGML_F32x4 vector float
692
+ #define GGML_F32x4_ZERO {0.0f}
693
+ #define GGML_F32x4_SET1 vec_splats
694
+ #define GGML_F32x4_LOAD(p) vec_xl(0, p)
695
+ #define GGML_F32x4_STORE(p, r) vec_xst(r, 0, p)
696
+ #define GGML_F32x4_FMA(a, b, c) vec_madd(b, c, a)
697
+ #define GGML_F32x4_ADD vec_add
698
+ #define GGML_F32x4_MUL vec_mul
699
+ #define GGML_F32x4_REDUCE(res, x) \
700
+ { \
701
+ int offset = GGML_F32_ARR >> 1; \
702
+ for (int i = 0; i < offset; ++i) { \
703
+ x[i] = vec_add(x[i], x[offset+i]); \
704
+ } \
705
+ offset >>= 1; \
706
+ for (int i = 0; i < offset; ++i) { \
707
+ x[i] = vec_add(x[i], x[offset+i]); \
708
+ } \
709
+ offset >>= 1; \
710
+ for (int i = 0; i < offset; ++i) { \
711
+ x[i] = vec_add(x[i], x[offset+i]); \
712
+ } \
713
+ res = vec_extract(x[0], 0) + \
714
+ vec_extract(x[0], 1) + \
715
+ vec_extract(x[0], 2) + \
716
+ vec_extract(x[0], 3); \
717
+ }
718
+ #define GGML_F32x4_REDUCE_4(res, s0, s1, s2, s3) \
719
+ { \
720
+ vector float v = vec_add(vec_add(s0, s1), \
721
+ vec_add(s2, s3)); \
722
+ v = vec_add(v, vec_sld(v, v, 8)); \
723
+ v = vec_add(v, vec_sld(v, v, 4)); \
724
+ res += (ggml_float) vec_extract(v, 0); \
725
+ }
726
+
727
+ #define GGML_F32_VEC GGML_F32x4
728
+ #define GGML_F32_VEC_ZERO GGML_F32x4_ZERO
729
+ #define GGML_F32_VEC_SET1 GGML_F32x4_SET1
730
+ #define GGML_F32_VEC_LOAD GGML_F32x4_LOAD
731
+ #define GGML_F32_VEC_STORE GGML_F32x4_STORE
732
+ #define GGML_F32_VEC_FMA GGML_F32x4_FMA
733
+ #define GGML_F32_VEC_ADD GGML_F32x4_ADD
734
+ #define GGML_F32_VEC_MUL GGML_F32x4_MUL
735
+ #define GGML_F32_VEC_REDUCE GGML_F32x4_REDUCE
736
+
737
+ // F16 POWER9
738
+ #define GGML_F16_STEP GGML_F32_STEP
739
+ #define GGML_F16_EPR GGML_F32_EPR
740
+ #define GGML_F16_VEC GGML_F32x4
741
+ #define GGML_F16_VEC_ZERO GGML_F32x4_ZERO
742
+ #define GGML_F16_VEC_SET1 GGML_F32x4_SET1
743
+ #define GGML_F16_VEC_FMA GGML_F32x4_FMA
744
+ #define GGML_F16_VEC_ADD GGML_F32x4_ADD
745
+ #define GGML_F16_VEC_MUL GGML_F32x4_MUL
746
+ #define GGML_F16_VEC_REDUCE GGML_F32x4_REDUCE
747
+ // Use vec_xl, not vec_ld, in case the load address is not aligned.
748
+ #define GGML_F16_VEC_LOAD(p, i) (i & 0x1) ? \
749
+ vec_extract_fp32_from_shorth(vec_xl(0, p - GGML_F16_EPR)) : \
750
+ vec_extract_fp32_from_shortl(vec_xl(0, p))
751
+ static inline unsigned char ggml_endian_byte(int i) {
752
+ uint16_t tmp_val = 1;
753
+ return ((unsigned char *)&tmp_val)[i];
754
+ }
755
+ #define GGML_ENDIAN_BYTE(i) ggml_endian_byte(i)
756
+ #define GGML_F16_VEC_STORE(p, r, i) \
757
+ if (i & 0x1) \
758
+ vec_xst(vec_pack_to_short_fp32(r[i - GGML_ENDIAN_BYTE(1)], \
759
+ r[i - GGML_ENDIAN_BYTE(0)]), \
760
+ 0, p - GGML_F16_EPR)
761
+
762
+ //BF16 POWER9
763
+ #define GGML_BF16_STEP 16
764
+ #define GGML_BF16_EPR 8
765
+
766
+ #define GGML_BF16x8 vector unsigned short
767
+ #define GGML_BF16x8_ZERO vec_splats((unsigned short)0)
768
+ #define GGML_BF16x8_LOAD(p) vec_xl(0, (const unsigned short *)(p))
769
+
770
+ #define GGML_BF16_VEC GGML_BF16x8
771
+ #define GGML_BF16_VEC_ZERO GGML_BF16x8_ZERO
772
+ #define GGML_BF16_VEC_LOAD GGML_BF16x8_LOAD
773
+ #if defined(__LITTLE_ENDIAN__)
774
+ #define GGML_BF16_TO_F32_LO(v) ((vector float) vec_mergel(GGML_BF16_VEC_ZERO, (v)))
775
+ #define GGML_BF16_TO_F32_HI(v) ((vector float) vec_mergeh(GGML_BF16_VEC_ZERO, (v)))
776
+ #else
777
+ #define GGML_BF16_TO_F32_LO(v) ((vector float) vec_mergel((v), GGML_BF16_VEC_ZERO))
778
+ #define GGML_BF16_TO_F32_HI(v) ((vector float) vec_mergeh((v), GGML_BF16_VEC_ZERO))
779
+ #endif
780
+ #define GGML_BF16_FMA_LO(acc, x, y) \
781
+ (acc) = GGML_F32x4_FMA((acc), GGML_BF16_TO_F32_LO(x), GGML_BF16_TO_F32_LO(y))
782
+ #define GGML_BF16_FMA_HI(acc, x, y) \
783
+ (acc) = GGML_F32x4_FMA((acc), GGML_BF16_TO_F32_HI(x), GGML_BF16_TO_F32_HI(y))
784
+
785
+ #elif defined(__wasm_simd128__)
786
+
787
+ #define GGML_SIMD
788
+
789
+ // F32 WASM
790
+
791
+ #define GGML_F32_STEP 16
792
+ #define GGML_F32_EPR 4
793
+
794
+ #define GGML_F32x4 v128_t
795
+ #define GGML_F32x4_ZERO wasm_f32x4_splat(0.0f)
796
+ #define GGML_F32x4_SET1(x) wasm_f32x4_splat(x)
797
+ #define GGML_F32x4_LOAD wasm_v128_load
798
+ #define GGML_F32x4_STORE wasm_v128_store
799
+ #define GGML_F32x4_FMA(a, b, c) wasm_f32x4_add(wasm_f32x4_mul(b, c), a)
800
+ #define GGML_F32x4_ADD wasm_f32x4_add
801
+ #define GGML_F32x4_MUL wasm_f32x4_mul
802
+ #define GGML_F32x4_REDUCE(res, x) \
803
+ { \
804
+ int offset = GGML_F32_ARR >> 1; \
805
+ for (int i = 0; i < offset; ++i) { \
806
+ x[i] = wasm_f32x4_add(x[i], x[offset+i]); \
807
+ } \
808
+ offset >>= 1; \
809
+ for (int i = 0; i < offset; ++i) { \
810
+ x[i] = wasm_f32x4_add(x[i], x[offset+i]); \
811
+ } \
812
+ offset >>= 1; \
813
+ for (int i = 0; i < offset; ++i) { \
814
+ x[i] = wasm_f32x4_add(x[i], x[offset+i]); \
815
+ } \
816
+ res = wasm_f32x4_extract_lane(x[0], 0) + \
817
+ wasm_f32x4_extract_lane(x[0], 1) + \
818
+ wasm_f32x4_extract_lane(x[0], 2) + \
819
+ wasm_f32x4_extract_lane(x[0], 3); \
820
+ }
821
+
822
+ #define GGML_F32_VEC GGML_F32x4
823
+ #define GGML_F32_VEC_ZERO GGML_F32x4_ZERO
824
+ #define GGML_F32_VEC_SET1 GGML_F32x4_SET1
825
+ #define GGML_F32_VEC_LOAD GGML_F32x4_LOAD
826
+ #define GGML_F32_VEC_STORE GGML_F32x4_STORE
827
+ #define GGML_F32_VEC_FMA GGML_F32x4_FMA
828
+ #define GGML_F32_VEC_ADD GGML_F32x4_ADD
829
+ #define GGML_F32_VEC_MUL GGML_F32x4_MUL
830
+ #define GGML_F32_VEC_REDUCE GGML_F32x4_REDUCE
831
+
832
+ // F16 WASM
833
+
834
+ #define GGML_F16_STEP 16
835
+ #define GGML_F16_EPR 4
836
+
837
+ inline static v128_t __wasm_f16x4_load(const ggml_fp16_t * p) {
838
+ float tmp[4];
839
+
840
+ tmp[0] = GGML_CPU_FP16_TO_FP32(p[0]);
841
+ tmp[1] = GGML_CPU_FP16_TO_FP32(p[1]);
842
+ tmp[2] = GGML_CPU_FP16_TO_FP32(p[2]);
843
+ tmp[3] = GGML_CPU_FP16_TO_FP32(p[3]);
844
+
845
+ return wasm_v128_load(tmp);
846
+ }
847
+
848
+ inline static void __wasm_f16x4_store(ggml_fp16_t * p, v128_t x) {
849
+ float tmp[4];
850
+
851
+ wasm_v128_store(tmp, x);
852
+
853
+ p[0] = GGML_CPU_FP32_TO_FP16(tmp[0]);
854
+ p[1] = GGML_CPU_FP32_TO_FP16(tmp[1]);
855
+ p[2] = GGML_CPU_FP32_TO_FP16(tmp[2]);
856
+ p[3] = GGML_CPU_FP32_TO_FP16(tmp[3]);
857
+ }
858
+
859
+ #define GGML_F16x4 v128_t
860
+ #define GGML_F16x4_ZERO wasm_f32x4_splat(0.0f)
861
+ #define GGML_F16x4_SET1(x) wasm_f32x4_splat(x)
862
+ #define GGML_F16x4_LOAD(x) __wasm_f16x4_load(x)
863
+ #define GGML_F16x4_STORE(x, y) __wasm_f16x4_store(x, y)
864
+ #define GGML_F16x4_FMA GGML_F32x4_FMA
865
+ #define GGML_F16x4_ADD wasm_f32x4_add
866
+ #define GGML_F16x4_MUL wasm_f32x4_mul
867
+ #define GGML_F16x4_REDUCE(res, x) \
868
+ { \
869
+ int offset = GGML_F16_ARR >> 1; \
870
+ for (int i = 0; i < offset; ++i) { \
871
+ x[i] = wasm_f32x4_add(x[i], x[offset+i]); \
872
+ } \
873
+ offset >>= 1; \
874
+ for (int i = 0; i < offset; ++i) { \
875
+ x[i] = wasm_f32x4_add(x[i], x[offset+i]); \
876
+ } \
877
+ offset >>= 1; \
878
+ for (int i = 0; i < offset; ++i) { \
879
+ x[i] = wasm_f32x4_add(x[i], x[offset+i]); \
880
+ } \
881
+ res = (ggml_float) (wasm_f32x4_extract_lane(x[0], 0) + \
882
+ wasm_f32x4_extract_lane(x[0], 1) + \
883
+ wasm_f32x4_extract_lane(x[0], 2) + \
884
+ wasm_f32x4_extract_lane(x[0], 3)); \
885
+ }
886
+
887
+ #define GGML_F16_VEC GGML_F16x4
888
+ #define GGML_F16_VEC_ZERO GGML_F16x4_ZERO
889
+ #define GGML_F16_VEC_SET1 GGML_F16x4_SET1
890
+ #define GGML_F16_VEC_LOAD(p, i) GGML_F16x4_LOAD(p)
891
+ #define GGML_F16_VEC_STORE(p, r, i) GGML_F16x4_STORE(p, r[i])
892
+ #define GGML_F16_VEC_FMA GGML_F16x4_FMA
893
+ #define GGML_F16_VEC_ADD GGML_F16x4_ADD
894
+ #define GGML_F16_VEC_MUL GGML_F16x4_MUL
895
+ #define GGML_F16_VEC_REDUCE GGML_F16x4_REDUCE
896
+
897
+ #elif defined(__SSE3__)
898
+
899
+ #define GGML_SIMD
900
+
901
+ // F32 SSE
902
+
903
+ #define GGML_F32_STEP 32
904
+ #define GGML_F32_EPR 4
905
+
906
+ #define GGML_F32x4 __m128
907
+ #define GGML_F32x4_ZERO _mm_setzero_ps()
908
+ #define GGML_F32x4_SET1(x) _mm_set1_ps(x)
909
+ #define GGML_F32x4_LOAD _mm_loadu_ps
910
+ #define GGML_F32x4_STORE _mm_storeu_ps
911
+ #if defined(__FMA__)
912
+ // TODO: Does this work?
913
+ #define GGML_F32x4_FMA(a, b, c) _mm_fmadd_ps(b, c, a)
914
+ #else
915
+ #define GGML_F32x4_FMA(a, b, c) _mm_add_ps(_mm_mul_ps(b, c), a)
916
+ #endif
917
+ #define GGML_F32x4_ADD _mm_add_ps
918
+ #define GGML_F32x4_MUL _mm_mul_ps
919
+ #define GGML_F32x4_REDUCE(res, x) \
920
+ { \
921
+ int offset = GGML_F32_ARR >> 1; \
922
+ for (int i = 0; i < offset; ++i) { \
923
+ x[i] = _mm_add_ps(x[i], x[offset+i]); \
924
+ } \
925
+ offset >>= 1; \
926
+ for (int i = 0; i < offset; ++i) { \
927
+ x[i] = _mm_add_ps(x[i], x[offset+i]); \
928
+ } \
929
+ offset >>= 1; \
930
+ for (int i = 0; i < offset; ++i) { \
931
+ x[i] = _mm_add_ps(x[i], x[offset+i]); \
932
+ } \
933
+ const __m128 t0 = _mm_hadd_ps(x[0], x[0]); \
934
+ res = (ggml_float) _mm_cvtss_f32(_mm_hadd_ps(t0, t0)); \
935
+ }
936
+ // TODO: is this optimal ?
937
+
938
+ #define GGML_F32_VEC GGML_F32x4
939
+ #define GGML_F32_VEC_ZERO GGML_F32x4_ZERO
940
+ #define GGML_F32_VEC_SET1 GGML_F32x4_SET1
941
+ #define GGML_F32_VEC_LOAD GGML_F32x4_LOAD
942
+ #define GGML_F32_VEC_STORE GGML_F32x4_STORE
943
+ #define GGML_F32_VEC_FMA GGML_F32x4_FMA
944
+ #define GGML_F32_VEC_ADD GGML_F32x4_ADD
945
+ #define GGML_F32_VEC_MUL GGML_F32x4_MUL
946
+ #define GGML_F32_VEC_REDUCE GGML_F32x4_REDUCE
947
+
948
+ // F16 SSE
949
+
950
+ #define GGML_F16_STEP 32
951
+ #define GGML_F16_EPR 4
952
+
953
+ static inline __m128 __sse_f16x4_load(const ggml_fp16_t * x) {
954
+ float tmp[4];
955
+
956
+ tmp[0] = GGML_CPU_FP16_TO_FP32(x[0]);
957
+ tmp[1] = GGML_CPU_FP16_TO_FP32(x[1]);
958
+ tmp[2] = GGML_CPU_FP16_TO_FP32(x[2]);
959
+ tmp[3] = GGML_CPU_FP16_TO_FP32(x[3]);
960
+
961
+ return _mm_loadu_ps(tmp);
962
+ }
963
+
964
+ static inline void __sse_f16x4_store(ggml_fp16_t * x, __m128 y) {
965
+ float arr[4];
966
+
967
+ _mm_storeu_ps(arr, y);
968
+
969
+ x[0] = GGML_CPU_FP32_TO_FP16(arr[0]);
970
+ x[1] = GGML_CPU_FP32_TO_FP16(arr[1]);
971
+ x[2] = GGML_CPU_FP32_TO_FP16(arr[2]);
972
+ x[3] = GGML_CPU_FP32_TO_FP16(arr[3]);
973
+ }
974
+
975
+ #define GGML_F32Cx4 __m128
976
+ #define GGML_F32Cx4_ZERO _mm_setzero_ps()
977
+ #define GGML_F32Cx4_SET1(x) _mm_set1_ps(x)
978
+ #define GGML_F32Cx4_LOAD(x) __sse_f16x4_load(x)
979
+ #define GGML_F32Cx4_STORE(x, y) __sse_f16x4_store(x, y)
980
+ #define GGML_F32Cx4_FMA GGML_F32x4_FMA
981
+ #define GGML_F32Cx4_ADD _mm_add_ps
982
+ #define GGML_F32Cx4_MUL _mm_mul_ps
983
+ #define GGML_F32Cx4_REDUCE GGML_F32x4_REDUCE
984
+
985
+ #define GGML_F16_VEC GGML_F32Cx4
986
+ #define GGML_F16_VEC_ZERO GGML_F32Cx4_ZERO
987
+ #define GGML_F16_VEC_SET1 GGML_F32Cx4_SET1
988
+ #define GGML_F16_VEC_LOAD(p, i) GGML_F32Cx4_LOAD(p)
989
+ #define GGML_F16_VEC_STORE(p, r, i) GGML_F32Cx4_STORE(p, r[i])
990
+ #define GGML_F16_VEC_FMA GGML_F32Cx4_FMA
991
+ #define GGML_F16_VEC_ADD GGML_F32Cx4_ADD
992
+ #define GGML_F16_VEC_MUL GGML_F32Cx4_MUL
993
+ #define GGML_F16_VEC_REDUCE GGML_F32Cx4_REDUCE
994
+
995
+ #elif defined(__loongarch_asx)
996
+
997
+ #define GGML_SIMD
998
+
999
+ // F32 LASX
1000
+ #define GGML_F32_STEP 32
1001
+ #define GGML_F32_EPR 8
1002
+
1003
+ #define GGML_F32x8 __m256
1004
+ #define GGML_F32x8_ZERO (__m256)__lasx_xvldi(0)
1005
+ #define GGML_F32x8_SET1(x) (__m256)__lasx_xvreplfr2vr_s((x))
1006
+ #define GGML_F32x8_LOAD(x) (__m256)__lasx_xvld((x), 0)
1007
+ #define GGML_F32x8_STORE(x,y) __lasx_xvst((y), (x), 0)
1008
+ #define GGML_F32x8_FMA(a, b, c) __lasx_xvfmadd_s(b, c, a)
1009
+ #define GGML_F32x8_ADD __lasx_xvfadd_s
1010
+ #define GGML_F32x8_MUL __lasx_xvfmul_s
1011
+ #define GGML_F32x8_REDUCE(res, x) \
1012
+ do { \
1013
+ int offset = GGML_F32_ARR >> 1; \
1014
+ for (int i = 0; i < offset; ++i) { \
1015
+ x[i] = __lasx_xvfadd_s(x[i], x[offset+i]); \
1016
+ } \
1017
+ offset >>= 1; \
1018
+ for (int i = 0; i < offset; ++i) { \
1019
+ x[i] = __lasx_xvfadd_s(x[i], x[offset+i]); \
1020
+ } \
1021
+ offset >>= 1; \
1022
+ for (int i = 0; i < offset; ++i) { \
1023
+ x[i] = __lasx_xvfadd_s(x[i], x[offset+i]); \
1024
+ } \
1025
+ float *tmp_p = (float *)&x[0]; \
1026
+ res = tmp_p[0] + tmp_p[1] + tmp_p[2] + tmp_p[3] + tmp_p[4] + tmp_p[5] + tmp_p[6] + tmp_p[7]; \
1027
+ } while (0)
1028
+ // TODO: is this optimal ?
1029
+
1030
+ #define GGML_F32_VEC GGML_F32x8
1031
+ #define GGML_F32_VEC_ZERO GGML_F32x8_ZERO
1032
+ #define GGML_F32_VEC_SET1 GGML_F32x8_SET1
1033
+ #define GGML_F32_VEC_LOAD GGML_F32x8_LOAD
1034
+ #define GGML_F32_VEC_STORE GGML_F32x8_STORE
1035
+ #define GGML_F32_VEC_FMA GGML_F32x8_FMA
1036
+ #define GGML_F32_VEC_ADD GGML_F32x8_ADD
1037
+ #define GGML_F32_VEC_MUL GGML_F32x8_MUL
1038
+ #define GGML_F32_VEC_REDUCE GGML_F32x8_REDUCE
1039
+
1040
+ // F16 LASX
1041
+
1042
+ #define GGML_F16_STEP 32
1043
+ #define GGML_F16_EPR 8
1044
+
1045
+ // F16 arithmetic is not supported by LASX, so we use F32 instead
1046
+
1047
+ #define GGML_F32Cx8 __m256
1048
+ #define GGML_F32Cx8_ZERO (__m256)__lasx_xvldi(0)
1049
+ #define GGML_F32Cx8_SET1(x) (__m256)__lasx_xvreplfr2vr_s((x))
1050
+
1051
+ static inline __m256 __lasx_f32cx8_load(const ggml_fp16_t * x) {
1052
+ __m256i a;
1053
+ memcpy(&a, x, sizeof(ggml_fp16_t) * 8);
1054
+ a = __lasx_xvpermi_d(a, 0 | (1 << 4));
1055
+ return __lasx_xvfcvtl_s_h(a);
1056
+ }
1057
+
1058
+ static inline void __lasx_f32cx8_store(ggml_fp16_t * x, __m256 y) {
1059
+ __m256i a = __lasx_xvfcvt_h_s(y, y);
1060
+ a = __lasx_xvpermi_d(a, 0 | (2 << 2));
1061
+ memcpy(x, &a, sizeof(ggml_fp16_t) * 8);
1062
+ }
1063
+ #define GGML_F32Cx8_LOAD(x) __lasx_f32cx8_load(x)
1064
+ #define GGML_F32Cx8_STORE(x, y) __lasx_f32cx8_store(x, y)
1065
+
1066
+ #define GGML_F32Cx8_FMA GGML_F32x8_FMA
1067
+ #define GGML_F32Cx8_ADD __lasx_xvfadd_s
1068
+ #define GGML_F32Cx8_MUL __lasx_xvfmul_s
1069
+ #define GGML_F32Cx8_REDUCE GGML_F32x8_REDUCE
1070
+
1071
+ #define GGML_F16_VEC GGML_F32Cx8
1072
+ #define GGML_F16_VEC_ZERO GGML_F32Cx8_ZERO
1073
+ #define GGML_F16_VEC_SET1 GGML_F32Cx8_SET1
1074
+ #define GGML_F16_VEC_LOAD(p, i) GGML_F32Cx8_LOAD(p)
1075
+ #define GGML_F16_VEC_STORE(p, r, i) GGML_F32Cx8_STORE(p, r[i])
1076
+ #define GGML_F16_VEC_FMA GGML_F32Cx8_FMA
1077
+ #define GGML_F16_VEC_ADD GGML_F32Cx8_ADD
1078
+ #define GGML_F16_VEC_MUL GGML_F32Cx8_MUL
1079
+ #define GGML_F16_VEC_REDUCE GGML_F32Cx8_REDUCE
1080
+
1081
+ #elif defined(__loongarch_sx)
1082
+
1083
+ #define GGML_SIMD
1084
+
1085
+ // F32 LSX
1086
+
1087
+ #define GGML_F32_STEP 32
1088
+ #define GGML_F32_EPR 4
1089
+
1090
+ #define GGML_F32x4 __m128
1091
+ #define GGML_F32x4_ZERO (__m128)__lsx_vldi(0)
1092
+ #define GGML_F32x4_SET1(x) (__m128)__lsx_vreplfr2vr_s((x))
1093
+ #define GGML_F32x4_LOAD(x) (__m128)__lsx_vld((x), 0)
1094
+ #define GGML_F32x4_STORE(x, y) __lsx_vst(y, x, 0)
1095
+ #define GGML_F32x4_FMA(a, b, c) __lsx_vfmadd_s(b, c, a)
1096
+ #define GGML_F32x4_ADD __lsx_vfadd_s
1097
+ #define GGML_F32x4_MUL __lsx_vfmul_s
1098
+
1099
+ #define GGML_F32x4_REDUCE(res, x) \
1100
+ { \
1101
+ int offset = GGML_F32_ARR >> 1; \
1102
+ for (int i = 0; i < offset; ++i) { \
1103
+ x[i] = __lsx_vfadd_s(x[i], x[offset+i]); \
1104
+ } \
1105
+ offset >>= 1; \
1106
+ for (int i = 0; i < offset; ++i) { \
1107
+ x[i] = __lsx_vfadd_s(x[i], x[offset+i]); \
1108
+ } \
1109
+ offset >>= 1; \
1110
+ for (int i = 0; i < offset; ++i) { \
1111
+ x[i] = __lsx_vfadd_s(x[i], x[offset+i]); \
1112
+ } \
1113
+ __m128i t0 = __lsx_vpickev_w((__m128i)x[0], (__m128i)x[0]); \
1114
+ __m128i t1 = __lsx_vpickod_w((__m128i)x[0], (__m128i)x[0]); \
1115
+ __m128 t2 = __lsx_vfadd_s((__m128)t0, (__m128)t1); \
1116
+ __m128i t3 = __lsx_vpickev_w((__m128i)t2, (__m128i)t2); \
1117
+ __m128i t4 = __lsx_vpickod_w((__m128i)t2, (__m128i)t2); \
1118
+ __m128 t5 = __lsx_vfadd_s((__m128)t3, (__m128)t4); \
1119
+ res = (ggml_float) ((v4f32)t5)[0]; \
1120
+ }
1121
+
1122
+ #define GGML_F32_VEC GGML_F32x4
1123
+ #define GGML_F32_VEC_ZERO GGML_F32x4_ZERO
1124
+ #define GGML_F32_VEC_SET1 GGML_F32x4_SET1
1125
+ #define GGML_F32_VEC_LOAD GGML_F32x4_LOAD
1126
+ #define GGML_F32_VEC_STORE GGML_F32x4_STORE
1127
+ #define GGML_F32_VEC_FMA GGML_F32x4_FMA
1128
+ #define GGML_F32_VEC_ADD GGML_F32x4_ADD
1129
+ #define GGML_F32_VEC_MUL GGML_F32x4_MUL
1130
+ #define GGML_F32_VEC_REDUCE GGML_F32x4_REDUCE
1131
+
1132
+ // F16 LSX
1133
+
1134
+ #define GGML_F16_STEP 32
1135
+ #define GGML_F16_EPR 4
1136
+
1137
+ static inline __m128 __lsx_f16x4_load(const ggml_fp16_t * x) {
1138
+ float tmp[4];
1139
+
1140
+ tmp[0] = GGML_CPU_FP16_TO_FP32(x[0]);
1141
+ tmp[1] = GGML_CPU_FP16_TO_FP32(x[1]);
1142
+ tmp[2] = GGML_CPU_FP16_TO_FP32(x[2]);
1143
+ tmp[3] = GGML_CPU_FP16_TO_FP32(x[3]);
1144
+
1145
+ return (__m128)__lsx_vld(tmp, 0);
1146
+ }
1147
+
1148
+ static inline void __lsx_f16x4_store(ggml_fp16_t * x, __m128 y) {
1149
+ float arr[4];
1150
+
1151
+ __lsx_vst(y, arr, 0);
1152
+
1153
+ x[0] = GGML_CPU_FP32_TO_FP16(arr[0]);
1154
+ x[1] = GGML_CPU_FP32_TO_FP16(arr[1]);
1155
+ x[2] = GGML_CPU_FP32_TO_FP16(arr[2]);
1156
+ x[3] = GGML_CPU_FP32_TO_FP16(arr[3]);
1157
+ }
1158
+
1159
+ #define GGML_F32Cx4 __m128
1160
+ #define GGML_F32Cx4_ZERO (__m128)__lsx_vldi(0)
1161
+ #define GGML_F32Cx4_SET1(x) (__m128)__lsx_vreplfr2vr_s((x))
1162
+ #define GGML_F32Cx4_LOAD(x) (__m128)__lsx_f16x4_load(x)
1163
+ #define GGML_F32Cx4_STORE(x, y) __lsx_f16x4_store(x, y)
1164
+ #define GGML_F32Cx4_FMA GGML_F32x4_FMA
1165
+ #define GGML_F32Cx4_ADD __lsx_vfadd_s
1166
+ #define GGML_F32Cx4_MUL __lsx_vfmul_s
1167
+ #define GGML_F32Cx4_REDUCE GGML_F32x4_REDUCE
1168
+
1169
+ #define GGML_F16_VEC GGML_F32Cx4
1170
+ #define GGML_F16_VEC_ZERO GGML_F32Cx4_ZERO
1171
+ #define GGML_F16_VEC_SET1 GGML_F32Cx4_SET1
1172
+ #define GGML_F16_VEC_LOAD(p, i) GGML_F32Cx4_LOAD(p)
1173
+ #define GGML_F16_VEC_STORE(p, r, i) GGML_F32Cx4_STORE(p, r[i])
1174
+ #define GGML_F16_VEC_FMA GGML_F32Cx4_FMA
1175
+ #define GGML_F16_VEC_ADD GGML_F32Cx4_ADD
1176
+ #define GGML_F16_VEC_MUL GGML_F32Cx4_MUL
1177
+ #define GGML_F16_VEC_REDUCE GGML_F32Cx4_REDUCE
1178
+
1179
+ #elif defined(__VXE__) || defined(__VXE2__)
1180
+
1181
+ #define GGML_SIMD
1182
+
1183
+ // F32 s390x
1184
+
1185
+ #define GGML_F32_STEP 32
1186
+ #define GGML_F32_EPR 4
1187
+
1188
+ #define GGML_F32x4 float32x4_t
1189
+ #define GGML_F32x4_ZERO vec_splats(0.0f)
1190
+ #define GGML_F32x4_SET1 vec_splats
1191
+ #define GGML_F32x4_LOAD(p) vec_xl(0, p)
1192
+ #define GGML_F32x4_STORE(p, r) vec_xst(r, 0, p)
1193
+ #define GGML_F32x4_FMA(a, b, c) vec_madd(b, c, a)
1194
+ #define GGML_F32x4_ADD vec_add
1195
+ #define GGML_F32x4_MUL vec_mul
1196
+ #define GGML_F32x4_REDUCE(res, x) \
1197
+ { \
1198
+ int offset = GGML_F32_ARR >> 1; \
1199
+ for (int i = 0; i < offset; ++i) { \
1200
+ x[i] = vec_add(x[i], x[offset + i]); \
1201
+ } \
1202
+ offset >>= 1; \
1203
+ for (int i = 0; i < offset; ++i) { \
1204
+ x[i] = vec_add(x[i], x[offset + i]); \
1205
+ } \
1206
+ offset >>= 1; \
1207
+ for (int i = 0; i < offset; ++i) { \
1208
+ x[i] = vec_add(x[i], x[offset + i]); \
1209
+ } \
1210
+ float32x4_t tmp = x[0] + vec_reve(x[0]); \
1211
+ res = tmp[0] + tmp[1]; \
1212
+ }
1213
+ #define GGML_F32x4_REDUCE_4(res, s0, s1, s2, s3) \
1214
+ { \
1215
+ float32x4_t v = vec_add(vec_add(s0, s1), \
1216
+ vec_add(s2, s3)); \
1217
+ v = vec_add(v, vec_sld(v, v, 8)); \
1218
+ v = vec_add(v, vec_sld(v, v, 4)); \
1219
+ res += (ggml_float)vec_extract(v, 0); \
1220
+ }
1221
+
1222
+ #define GGML_F32_VEC GGML_F32x4
1223
+ #define GGML_F32_VEC_ZERO GGML_F32x4_ZERO
1224
+ #define GGML_F32_VEC_SET1 GGML_F32x4_SET1
1225
+ #define GGML_F32_VEC_LOAD GGML_F32x4_LOAD
1226
+ #define GGML_F32_VEC_STORE GGML_F32x4_STORE
1227
+ #define GGML_F32_VEC_FMA GGML_F32x4_FMA
1228
+ #define GGML_F32_VEC_ADD GGML_F32x4_ADD
1229
+ #define GGML_F32_VEC_MUL GGML_F32x4_MUL
1230
+ #define GGML_F32_VEC_REDUCE GGML_F32x4_REDUCE
1231
+
1232
+ // F16 s390x
1233
+ #define GGML_F16_STEP GGML_F32_STEP
1234
+ #define GGML_F16_EPR GGML_F32_EPR
1235
+
1236
+ static inline float32x4_t __lzs_f16cx4_load(const ggml_fp16_t * x) {
1237
+ float tmp[4];
1238
+
1239
+ for (int i = 0; i < 4; i++) {
1240
+ tmp[i] = GGML_CPU_FP16_TO_FP32(x[i]);
1241
+ }
1242
+
1243
+ // note: keep type-cast here to prevent compiler bugs
1244
+ // see: https://github.com/ggml-org/llama.cpp/issues/12846
1245
+ return vec_xl(0, (const float *)(tmp));
1246
+ }
1247
+
1248
+ static inline void __lzs_f16cx4_store(ggml_fp16_t * x, float32x4_t v_y) {
1249
+ float arr[4];
1250
+
1251
+ // note: keep type-cast here to prevent compiler bugs
1252
+ // see: https://github.com/ggml-org/llama.cpp/issues/12846
1253
+ vec_xst(v_y, 0, (float *)(arr));
1254
+
1255
+ for (int i = 0; i < 4; i++) {
1256
+ x[i] = GGML_CPU_FP32_TO_FP16(arr[i]);
1257
+ }
1258
+ }
1259
+
1260
+ #define GGML_F16_VEC GGML_F32x4
1261
+ #define GGML_F16_VEC_ZERO GGML_F32x4_ZERO
1262
+ #define GGML_F16_VEC_SET1 GGML_F32x4_SET1
1263
+ #define GGML_F16_VEC_LOAD(p, i) __lzs_f16cx4_load(p)
1264
+ #define GGML_F16_VEC_STORE(p, r, i) __lzs_f16cx4_store(p, r[i])
1265
+ #define GGML_F16_VEC_FMA GGML_F32x4_FMA
1266
+ #define GGML_F16_VEC_ADD GGML_F32x4_ADD
1267
+ #define GGML_F16_VEC_MUL GGML_F32x4_MUL
1268
+ #define GGML_F16_VEC_REDUCE GGML_F32x4_REDUCE
1269
+
1270
+ // BF16 s390x
1271
+ #define GGML_BF16_STEP 16
1272
+ #define GGML_BF16_EPR 8
1273
+
1274
+ #define GGML_BF16x8 __vector unsigned short
1275
+ #define GGML_BF16x8_ZERO vec_splats((unsigned short)0)
1276
+ #define GGML_BF16x8_LOAD(p) vec_xl(0, (const unsigned short *)(p))
1277
+
1278
+ #define GGML_BF16_VEC GGML_BF16x8
1279
+ #define GGML_BF16_VEC_ZERO GGML_BF16x8_ZERO
1280
+ #define GGML_BF16_VEC_LOAD GGML_BF16x8_LOAD
1281
+ #define GGML_BF16_TO_F32_LO(v) ((float32x4_t) vec_mergel((v), GGML_BF16_VEC_ZERO))
1282
+ #define GGML_BF16_TO_F32_HI(v) ((float32x4_t) vec_mergeh((v), GGML_BF16_VEC_ZERO))
1283
+ #define GGML_BF16_FMA_LO(acc, x, y) \
1284
+ (acc) = GGML_F32x4_FMA((acc), GGML_BF16_TO_F32_LO(x), GGML_BF16_TO_F32_LO(y))
1285
+ #define GGML_BF16_FMA_HI(acc, x, y) \
1286
+ (acc) = GGML_F32x4_FMA((acc), GGML_BF16_TO_F32_HI(x), GGML_BF16_TO_F32_HI(y))
1287
+
1288
+ #elif defined(__riscv_v_intrinsic)
1289
+
1290
+ // compatible with vlen >= 128
1291
+
1292
+ #define GGML_SIMD
1293
+
1294
+ // F32
1295
+
1296
+ #define GGML_F32_STEP 16
1297
+ #define GGML_F32_EPR 4
1298
+
1299
+ #define GGML_F32x4 vfloat32m1_t
1300
+ #define GGML_F32x4_ZERO __riscv_vfmv_v_f_f32m1(0.0f, GGML_F32_EPR)
1301
+ #define GGML_F32x4_SET1(x) __riscv_vfmv_v_f_f32m1(x, GGML_F32_EPR)
1302
+ #define GGML_F32x4_LOAD(x) __riscv_vle32_v_f32m1(x, GGML_F32_EPR)
1303
+ #define GGML_F32x4_STORE(b, v) __riscv_vse32_v_f32m1(b, v, GGML_F32_EPR)
1304
+ #define GGML_F32x4_FMA(a, b, c) __riscv_vfmacc_vv_f32m1(a, b, c, GGML_F32_EPR)
1305
+ #define GGML_F32x4_ADD(a, b) __riscv_vfadd_vv_f32m1(a, b, GGML_F32_EPR)
1306
+ #define GGML_F32x4_MUL(a, b) __riscv_vfmul_vv_f32m1(a, b, GGML_F32_EPR)
1307
+
1308
+ #define GGML_F32_VEC GGML_F32x4
1309
+ #define GGML_F32_VEC_ZERO GGML_F32x4_ZERO
1310
+ #define GGML_F32_VEC_SET1 GGML_F32x4_SET1
1311
+ #define GGML_F32_VEC_LOAD GGML_F32x4_LOAD
1312
+ #define GGML_F32_VEC_STORE GGML_F32x4_STORE
1313
+ #define GGML_F32_VEC_FMA GGML_F32x4_FMA
1314
+ #define GGML_F32_VEC_ADD GGML_F32x4_ADD
1315
+ #define GGML_F32_VEC_MUL GGML_F32x4_MUL
1316
+ #define GGML_F32_VEC_REDUCE GGML_F32x4_REDUCE
1317
+
1318
+ #endif
1319
+
1320
+ // GGML_F32_ARR / GGML_F16_ARR
1321
+ // number of registers to use per step
1322
+ #ifdef GGML_SIMD
1323
+ #define GGML_F32_ARR (GGML_F32_STEP/GGML_F32_EPR)
1324
+ #define GGML_F16_ARR (GGML_F16_STEP/GGML_F16_EPR)
1325
+ #endif
1326
+
1327
+ #ifdef __cplusplus
1328
+ }
1329
+ #endif