usearch 2.21.4 → 2.25.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 (602) hide show
  1. package/README.md +24 -24
  2. package/binding.gyp +15 -37
  3. package/c/CMakeLists.txt +4 -5
  4. package/c/README.md +7 -7
  5. package/c/lib.cpp +32 -14
  6. package/c/test.c +83 -1
  7. package/c/usearch.h +24 -3
  8. package/cpp/CMakeLists.txt +4 -0
  9. package/cpp/README.md +5 -5
  10. package/cpp/bench.cpp +97 -116
  11. package/cpp/test.cpp +117 -20
  12. package/include/usearch/index.hpp +224 -48
  13. package/include/usearch/index_dense.hpp +105 -40
  14. package/include/usearch/index_plugins.hpp +1387 -204
  15. package/javascript/dist/cjs/usearch.d.ts +8 -3
  16. package/javascript/dist/cjs/usearch.js +12 -4
  17. package/javascript/dist/esm/usearch.d.ts +8 -3
  18. package/javascript/dist/esm/usearch.js +12 -4
  19. package/javascript/lib.cpp +17 -0
  20. package/javascript/usearch.ts +14 -6
  21. package/numkong/.clang-tidy +30 -0
  22. package/{simsimd → numkong}/.cmake-format.py +18 -0
  23. package/numkong/.editorconfig +12 -0
  24. package/numkong/.git-blame-ignore-revs +123 -0
  25. package/numkong/.mailmap +15 -0
  26. package/numkong/.spi.yml +11 -0
  27. package/numkong/.swift-format +14 -0
  28. package/numkong/CITATION.cff +81 -0
  29. package/numkong/CONTRIBUTING.md +500 -0
  30. package/numkong/Cargo.toml +54 -0
  31. package/numkong/MANIFEST.in +8 -0
  32. package/numkong/Package.swift +84 -0
  33. package/numkong/README.md +569 -0
  34. package/numkong/bench/README.md +217 -0
  35. package/numkong/bench/bench-browser.html +323 -0
  36. package/numkong/bench/bench.cpp +344 -0
  37. package/numkong/bench/bench.hpp +816 -0
  38. package/numkong/bench/bench.js +148 -0
  39. package/numkong/bench/bench.mjs +616 -0
  40. package/numkong/bench/bench_attention.cpp +113 -0
  41. package/numkong/bench/bench_cast.cpp +264 -0
  42. package/numkong/bench/bench_cross_amx.cpp +62 -0
  43. package/numkong/bench/bench_cross_arm.cpp +245 -0
  44. package/numkong/bench/bench_cross_blas.cpp +309 -0
  45. package/numkong/bench/bench_cross_loongarch.cpp +106 -0
  46. package/numkong/bench/bench_cross_power.cpp +84 -0
  47. package/numkong/bench/bench_cross_rvv.cpp +121 -0
  48. package/numkong/bench/bench_cross_serial.cpp +151 -0
  49. package/numkong/bench/bench_cross_sme.cpp +163 -0
  50. package/numkong/bench/bench_cross_wasm.cpp +142 -0
  51. package/numkong/bench/bench_cross_x86.cpp +455 -0
  52. package/numkong/bench/bench_curved.cpp +210 -0
  53. package/numkong/bench/bench_dot.cpp +315 -0
  54. package/numkong/bench/bench_each.cpp +503 -0
  55. package/numkong/bench/bench_geospatial.cpp +112 -0
  56. package/numkong/bench/bench_maxsim.cpp +154 -0
  57. package/numkong/bench/bench_mesh.cpp +148 -0
  58. package/numkong/bench/bench_probability.cpp +60 -0
  59. package/numkong/bench/bench_reduce.cpp +371 -0
  60. package/numkong/bench/bench_set.cpp +73 -0
  61. package/numkong/bench/bench_sparse.cpp +198 -0
  62. package/numkong/bench/bench_spatial.cpp +347 -0
  63. package/numkong/bench/bench_trigonometry.cpp +137 -0
  64. package/numkong/bench/swift/Bench.swift +506 -0
  65. package/numkong/binding.gyp +169 -0
  66. package/numkong/build.rs +484 -0
  67. package/numkong/c/dispatch.h +512 -0
  68. package/numkong/c/dispatch_bf16.c +447 -0
  69. package/numkong/c/dispatch_bf16c.c +52 -0
  70. package/numkong/c/dispatch_e2m3.c +296 -0
  71. package/numkong/c/dispatch_e3m2.c +284 -0
  72. package/numkong/c/dispatch_e4m3.c +318 -0
  73. package/numkong/c/dispatch_e5m2.c +316 -0
  74. package/numkong/c/dispatch_f16.c +452 -0
  75. package/numkong/c/dispatch_f16c.c +58 -0
  76. package/numkong/c/dispatch_f32.c +434 -0
  77. package/numkong/c/dispatch_f32c.c +99 -0
  78. package/numkong/c/dispatch_f64.c +348 -0
  79. package/numkong/c/dispatch_f64c.c +98 -0
  80. package/numkong/c/dispatch_i16.c +96 -0
  81. package/numkong/c/dispatch_i32.c +89 -0
  82. package/numkong/c/dispatch_i4.c +153 -0
  83. package/numkong/c/dispatch_i64.c +86 -0
  84. package/numkong/c/dispatch_i8.c +348 -0
  85. package/numkong/c/dispatch_other.c +348 -0
  86. package/numkong/c/dispatch_u1.c +193 -0
  87. package/numkong/c/dispatch_u16.c +124 -0
  88. package/numkong/c/dispatch_u32.c +118 -0
  89. package/numkong/c/dispatch_u4.c +153 -0
  90. package/numkong/c/dispatch_u64.c +102 -0
  91. package/numkong/c/dispatch_u8.c +364 -0
  92. package/numkong/c/numkong.c +940 -0
  93. package/numkong/cmake/nk_arm_isa_probes.cmake +61 -0
  94. package/numkong/cmake/nk_isa_probe.cmake +90 -0
  95. package/numkong/cmake/nk_loongarch_isa_probes.cmake +15 -0
  96. package/numkong/cmake/nk_math_lib.cmake +46 -0
  97. package/numkong/cmake/nk_power_isa_probes.cmake +15 -0
  98. package/numkong/cmake/nk_riscv_isa_probes.cmake +19 -0
  99. package/numkong/cmake/nk_x86_isa_probes.cmake +35 -0
  100. package/numkong/cmake/toolchain-aarch64-gnu.cmake +86 -0
  101. package/numkong/cmake/toolchain-android-arm64.cmake +25 -0
  102. package/numkong/cmake/toolchain-android-armv7.cmake +25 -0
  103. package/numkong/cmake/toolchain-loongarch64-gnu.cmake +68 -0
  104. package/numkong/cmake/toolchain-ppc64le-gnu.cmake +74 -0
  105. package/numkong/cmake/toolchain-riscv64-gnu.cmake +107 -0
  106. package/numkong/cmake/toolchain-riscv64-llvm.cmake +114 -0
  107. package/numkong/cmake/toolchain-wasi.cmake +77 -0
  108. package/numkong/cmake/toolchain-wasm.cmake +70 -0
  109. package/numkong/cmake/toolchain-wasm64.cmake +62 -0
  110. package/numkong/cmake/toolchain-x86_64-llvm.cmake +47 -0
  111. package/numkong/include/README.md +643 -0
  112. package/numkong/include/module.modulemap +129 -0
  113. package/numkong/include/numkong/attention/sapphireamx.h +1363 -0
  114. package/numkong/include/numkong/attention/sme.h +2075 -0
  115. package/numkong/include/numkong/attention.h +49 -0
  116. package/numkong/include/numkong/capabilities.h +930 -0
  117. package/numkong/include/numkong/cast/README.md +262 -0
  118. package/numkong/include/numkong/cast/diamond.h +64 -0
  119. package/numkong/include/numkong/cast/haswell.h +823 -0
  120. package/numkong/include/numkong/cast/icelake.h +475 -0
  121. package/numkong/include/numkong/cast/loongsonasx.h +252 -0
  122. package/numkong/include/numkong/cast/neon.h +1174 -0
  123. package/numkong/include/numkong/cast/powervsx.h +449 -0
  124. package/numkong/include/numkong/cast/rvv.h +970 -0
  125. package/numkong/include/numkong/cast/sapphire.h +262 -0
  126. package/numkong/include/numkong/cast/serial.h +2336 -0
  127. package/numkong/include/numkong/cast/skylake.h +915 -0
  128. package/numkong/include/numkong/cast/v128relaxed.h +537 -0
  129. package/numkong/include/numkong/cast.h +254 -0
  130. package/numkong/include/numkong/cast.hpp +44 -0
  131. package/numkong/include/numkong/curved/README.md +223 -0
  132. package/numkong/include/numkong/curved/genoa.h +182 -0
  133. package/numkong/include/numkong/curved/haswell.h +276 -0
  134. package/numkong/include/numkong/curved/neon.h +329 -0
  135. package/numkong/include/numkong/curved/neonbfdot.h +211 -0
  136. package/numkong/include/numkong/curved/rvv.h +305 -0
  137. package/numkong/include/numkong/curved/serial.h +207 -0
  138. package/numkong/include/numkong/curved/skylake.h +457 -0
  139. package/numkong/include/numkong/curved/smef64.h +530 -0
  140. package/numkong/include/numkong/curved.h +513 -0
  141. package/numkong/include/numkong/curved.hpp +144 -0
  142. package/numkong/include/numkong/dot/README.md +442 -0
  143. package/numkong/include/numkong/dot/alder.h +563 -0
  144. package/numkong/include/numkong/dot/diamond.h +158 -0
  145. package/numkong/include/numkong/dot/genoa.h +289 -0
  146. package/numkong/include/numkong/dot/haswell.h +1723 -0
  147. package/numkong/include/numkong/dot/icelake.h +997 -0
  148. package/numkong/include/numkong/dot/loongsonasx.h +671 -0
  149. package/numkong/include/numkong/dot/neon.h +869 -0
  150. package/numkong/include/numkong/dot/neonbfdot.h +243 -0
  151. package/numkong/include/numkong/dot/neonfhm.h +358 -0
  152. package/numkong/include/numkong/dot/neonfp8.h +323 -0
  153. package/numkong/include/numkong/dot/neonsdot.h +622 -0
  154. package/numkong/include/numkong/dot/powervsx.h +752 -0
  155. package/numkong/include/numkong/dot/rvv.h +722 -0
  156. package/numkong/include/numkong/dot/rvvbb.h +72 -0
  157. package/numkong/include/numkong/dot/rvvbf16.h +123 -0
  158. package/numkong/include/numkong/dot/rvvhalf.h +129 -0
  159. package/numkong/include/numkong/dot/sapphire.h +141 -0
  160. package/numkong/include/numkong/dot/serial.h +874 -0
  161. package/numkong/include/numkong/dot/sierra.h +405 -0
  162. package/numkong/include/numkong/dot/skylake.h +1116 -0
  163. package/numkong/include/numkong/dot/sve.h +420 -0
  164. package/numkong/include/numkong/dot/svebfdot.h +75 -0
  165. package/numkong/include/numkong/dot/svehalf.h +168 -0
  166. package/numkong/include/numkong/dot/svesdot.h +90 -0
  167. package/numkong/include/numkong/dot/v128relaxed.h +1293 -0
  168. package/numkong/include/numkong/dot.h +1136 -0
  169. package/numkong/include/numkong/dot.hpp +94 -0
  170. package/numkong/include/numkong/dots/README.md +496 -0
  171. package/numkong/include/numkong/dots/alder.h +117 -0
  172. package/numkong/include/numkong/dots/diamond.h +86 -0
  173. package/numkong/include/numkong/dots/genoa.h +100 -0
  174. package/numkong/include/numkong/dots/graniteamx.h +733 -0
  175. package/numkong/include/numkong/dots/haswell.h +310 -0
  176. package/numkong/include/numkong/dots/icelake.h +180 -0
  177. package/numkong/include/numkong/dots/loongsonasx.h +176 -0
  178. package/numkong/include/numkong/dots/neon.h +123 -0
  179. package/numkong/include/numkong/dots/neonbfdot.h +59 -0
  180. package/numkong/include/numkong/dots/neonfhm.h +96 -0
  181. package/numkong/include/numkong/dots/neonfp8.h +99 -0
  182. package/numkong/include/numkong/dots/neonsdot.h +144 -0
  183. package/numkong/include/numkong/dots/powervsx.h +194 -0
  184. package/numkong/include/numkong/dots/rvv.h +2593 -0
  185. package/numkong/include/numkong/dots/sapphireamx.h +4017 -0
  186. package/numkong/include/numkong/dots/serial.h +2867 -0
  187. package/numkong/include/numkong/dots/sierra.h +100 -0
  188. package/numkong/include/numkong/dots/skylake.h +207 -0
  189. package/numkong/include/numkong/dots/sme.h +5041 -0
  190. package/numkong/include/numkong/dots/smebi32.h +477 -0
  191. package/numkong/include/numkong/dots/smef64.h +1328 -0
  192. package/numkong/include/numkong/dots/smehalf.h +47 -0
  193. package/numkong/include/numkong/dots/v128relaxed.h +317 -0
  194. package/numkong/include/numkong/dots.h +3110 -0
  195. package/numkong/include/numkong/dots.hpp +641 -0
  196. package/numkong/include/numkong/each/README.md +465 -0
  197. package/numkong/include/numkong/each/haswell.h +1658 -0
  198. package/numkong/include/numkong/each/icelake.h +272 -0
  199. package/numkong/include/numkong/each/neon.h +1138 -0
  200. package/numkong/include/numkong/each/neonbfdot.h +211 -0
  201. package/numkong/include/numkong/each/neonhalf.h +318 -0
  202. package/numkong/include/numkong/each/rvv.h +1121 -0
  203. package/numkong/include/numkong/each/sapphire.h +343 -0
  204. package/numkong/include/numkong/each/serial.h +282 -0
  205. package/numkong/include/numkong/each/skylake.h +1562 -0
  206. package/numkong/include/numkong/each/v128relaxed.h +562 -0
  207. package/numkong/include/numkong/each.h +2232 -0
  208. package/numkong/include/numkong/each.hpp +434 -0
  209. package/numkong/include/numkong/geospatial/README.md +147 -0
  210. package/numkong/include/numkong/geospatial/haswell.h +633 -0
  211. package/numkong/include/numkong/geospatial/neon.h +615 -0
  212. package/numkong/include/numkong/geospatial/rvv.h +701 -0
  213. package/numkong/include/numkong/geospatial/serial.h +309 -0
  214. package/numkong/include/numkong/geospatial/skylake.h +613 -0
  215. package/numkong/include/numkong/geospatial/v128relaxed.h +652 -0
  216. package/numkong/include/numkong/geospatial.h +453 -0
  217. package/numkong/include/numkong/geospatial.hpp +235 -0
  218. package/numkong/include/numkong/matrix.hpp +336 -0
  219. package/numkong/include/numkong/maxsim/README.md +187 -0
  220. package/numkong/include/numkong/maxsim/alder.h +511 -0
  221. package/numkong/include/numkong/maxsim/genoa.h +115 -0
  222. package/numkong/include/numkong/maxsim/haswell.h +553 -0
  223. package/numkong/include/numkong/maxsim/icelake.h +480 -0
  224. package/numkong/include/numkong/maxsim/neonsdot.h +394 -0
  225. package/numkong/include/numkong/maxsim/sapphireamx.h +877 -0
  226. package/numkong/include/numkong/maxsim/serial.h +490 -0
  227. package/numkong/include/numkong/maxsim/sme.h +993 -0
  228. package/numkong/include/numkong/maxsim/v128relaxed.h +280 -0
  229. package/numkong/include/numkong/maxsim.h +571 -0
  230. package/numkong/include/numkong/maxsim.hpp +133 -0
  231. package/numkong/include/numkong/mesh/README.md +219 -0
  232. package/numkong/include/numkong/mesh/haswell.h +2013 -0
  233. package/numkong/include/numkong/mesh/neon.h +1821 -0
  234. package/numkong/include/numkong/mesh/neonbfdot.h +771 -0
  235. package/numkong/include/numkong/mesh/rvv.h +936 -0
  236. package/numkong/include/numkong/mesh/serial.h +721 -0
  237. package/numkong/include/numkong/mesh/skylake.h +2344 -0
  238. package/numkong/include/numkong/mesh/v128relaxed.h +1081 -0
  239. package/numkong/include/numkong/mesh.h +666 -0
  240. package/numkong/include/numkong/mesh.hpp +701 -0
  241. package/numkong/include/numkong/numkong.h +78 -0
  242. package/numkong/include/numkong/numkong.hpp +58 -0
  243. package/numkong/include/numkong/probability/README.md +177 -0
  244. package/numkong/include/numkong/probability/haswell.h +267 -0
  245. package/numkong/include/numkong/probability/neon.h +255 -0
  246. package/numkong/include/numkong/probability/rvv.h +414 -0
  247. package/numkong/include/numkong/probability/serial.h +181 -0
  248. package/numkong/include/numkong/probability/skylake.h +324 -0
  249. package/numkong/include/numkong/probability.h +380 -0
  250. package/numkong/include/numkong/probability.hpp +120 -0
  251. package/numkong/include/numkong/random.h +50 -0
  252. package/numkong/include/numkong/random.hpp +285 -0
  253. package/numkong/include/numkong/reduce/README.md +552 -0
  254. package/numkong/include/numkong/reduce/alder.h +636 -0
  255. package/numkong/include/numkong/reduce/genoa.h +201 -0
  256. package/numkong/include/numkong/reduce/haswell.h +3785 -0
  257. package/numkong/include/numkong/reduce/icelake.h +549 -0
  258. package/numkong/include/numkong/reduce/neon.h +3980 -0
  259. package/numkong/include/numkong/reduce/neonbfdot.h +142 -0
  260. package/numkong/include/numkong/reduce/neonfhm.h +293 -0
  261. package/numkong/include/numkong/reduce/neonsdot.h +357 -0
  262. package/numkong/include/numkong/reduce/rvv.h +3533 -0
  263. package/numkong/include/numkong/reduce/serial.h +753 -0
  264. package/numkong/include/numkong/reduce/sierra.h +338 -0
  265. package/numkong/include/numkong/reduce/skylake.h +3794 -0
  266. package/numkong/include/numkong/reduce/sve.h +52 -0
  267. package/numkong/include/numkong/reduce/v128relaxed.h +2302 -0
  268. package/numkong/include/numkong/reduce.h +1582 -0
  269. package/numkong/include/numkong/reduce.hpp +778 -0
  270. package/numkong/include/numkong/scalar/README.md +89 -0
  271. package/numkong/include/numkong/scalar/haswell.h +122 -0
  272. package/numkong/include/numkong/scalar/loongsonasx.h +74 -0
  273. package/numkong/include/numkong/scalar/neon.h +122 -0
  274. package/numkong/include/numkong/scalar/neonhalf.h +70 -0
  275. package/numkong/include/numkong/scalar/powervsx.h +96 -0
  276. package/numkong/include/numkong/scalar/rvv.h +211 -0
  277. package/numkong/include/numkong/scalar/sapphire.h +74 -0
  278. package/numkong/include/numkong/scalar/serial.h +332 -0
  279. package/numkong/include/numkong/scalar/v128relaxed.h +56 -0
  280. package/numkong/include/numkong/scalar.h +696 -0
  281. package/numkong/include/numkong/set/README.md +179 -0
  282. package/numkong/include/numkong/set/haswell.h +334 -0
  283. package/numkong/include/numkong/set/icelake.h +485 -0
  284. package/numkong/include/numkong/set/loongsonasx.h +181 -0
  285. package/numkong/include/numkong/set/neon.h +363 -0
  286. package/numkong/include/numkong/set/powervsx.h +326 -0
  287. package/numkong/include/numkong/set/rvv.h +226 -0
  288. package/numkong/include/numkong/set/rvvbb.h +117 -0
  289. package/numkong/include/numkong/set/serial.h +174 -0
  290. package/numkong/include/numkong/set/sve.h +187 -0
  291. package/numkong/include/numkong/set/v128relaxed.h +240 -0
  292. package/numkong/include/numkong/set.h +471 -0
  293. package/numkong/include/numkong/set.hpp +114 -0
  294. package/numkong/include/numkong/sets/README.md +149 -0
  295. package/numkong/include/numkong/sets/haswell.h +63 -0
  296. package/numkong/include/numkong/sets/icelake.h +66 -0
  297. package/numkong/include/numkong/sets/loongsonasx.h +52 -0
  298. package/numkong/include/numkong/sets/neon.h +61 -0
  299. package/numkong/include/numkong/sets/powervsx.h +65 -0
  300. package/numkong/include/numkong/sets/serial.h +43 -0
  301. package/numkong/include/numkong/sets/smebi32.h +1135 -0
  302. package/numkong/include/numkong/sets/v128relaxed.h +58 -0
  303. package/numkong/include/numkong/sets.h +382 -0
  304. package/numkong/include/numkong/sparse/README.md +156 -0
  305. package/numkong/include/numkong/sparse/icelake.h +463 -0
  306. package/numkong/include/numkong/sparse/neon.h +288 -0
  307. package/numkong/include/numkong/sparse/serial.h +117 -0
  308. package/numkong/include/numkong/sparse/sve2.h +504 -0
  309. package/numkong/include/numkong/sparse/turin.h +322 -0
  310. package/numkong/include/numkong/sparse.h +363 -0
  311. package/numkong/include/numkong/sparse.hpp +113 -0
  312. package/numkong/include/numkong/spatial/README.md +439 -0
  313. package/numkong/include/numkong/spatial/alder.h +604 -0
  314. package/numkong/include/numkong/spatial/diamond.h +240 -0
  315. package/numkong/include/numkong/spatial/genoa.h +222 -0
  316. package/numkong/include/numkong/spatial/haswell.h +979 -0
  317. package/numkong/include/numkong/spatial/icelake.h +1067 -0
  318. package/numkong/include/numkong/spatial/loongsonasx.h +483 -0
  319. package/numkong/include/numkong/spatial/neon.h +846 -0
  320. package/numkong/include/numkong/spatial/neonbfdot.h +164 -0
  321. package/numkong/include/numkong/spatial/neonfp8.h +258 -0
  322. package/numkong/include/numkong/spatial/neonsdot.h +429 -0
  323. package/numkong/include/numkong/spatial/powervsx.h +738 -0
  324. package/numkong/include/numkong/spatial/rvv.h +991 -0
  325. package/numkong/include/numkong/spatial/rvvbf16.h +128 -0
  326. package/numkong/include/numkong/spatial/rvvhalf.h +120 -0
  327. package/numkong/include/numkong/spatial/serial.h +347 -0
  328. package/numkong/include/numkong/spatial/sierra.h +516 -0
  329. package/numkong/include/numkong/spatial/skylake.h +605 -0
  330. package/numkong/include/numkong/spatial/sve.h +246 -0
  331. package/numkong/include/numkong/spatial/svebfdot.h +125 -0
  332. package/numkong/include/numkong/spatial/svehalf.h +136 -0
  333. package/numkong/include/numkong/spatial/svesdot.h +143 -0
  334. package/numkong/include/numkong/spatial/v128relaxed.h +969 -0
  335. package/numkong/include/numkong/spatial.h +1681 -0
  336. package/numkong/include/numkong/spatial.hpp +183 -0
  337. package/numkong/include/numkong/spatials/README.md +580 -0
  338. package/numkong/include/numkong/spatials/alder.h +94 -0
  339. package/numkong/include/numkong/spatials/diamond.h +82 -0
  340. package/numkong/include/numkong/spatials/genoa.h +94 -0
  341. package/numkong/include/numkong/spatials/graniteamx.h +173 -0
  342. package/numkong/include/numkong/spatials/haswell.h +219 -0
  343. package/numkong/include/numkong/spatials/icelake.h +113 -0
  344. package/numkong/include/numkong/spatials/loongsonasx.h +153 -0
  345. package/numkong/include/numkong/spatials/neon.h +109 -0
  346. package/numkong/include/numkong/spatials/neonbfdot.h +60 -0
  347. package/numkong/include/numkong/spatials/neonfhm.h +92 -0
  348. package/numkong/include/numkong/spatials/neonfp8.h +111 -0
  349. package/numkong/include/numkong/spatials/neonsdot.h +143 -0
  350. package/numkong/include/numkong/spatials/powervsx.h +153 -0
  351. package/numkong/include/numkong/spatials/rvv.h +1976 -0
  352. package/numkong/include/numkong/spatials/sapphireamx.h +1149 -0
  353. package/numkong/include/numkong/spatials/serial.h +248 -0
  354. package/numkong/include/numkong/spatials/sierra.h +96 -0
  355. package/numkong/include/numkong/spatials/skylake.h +184 -0
  356. package/numkong/include/numkong/spatials/sme.h +1927 -0
  357. package/numkong/include/numkong/spatials/smef64.h +483 -0
  358. package/numkong/include/numkong/spatials/v128relaxed.h +240 -0
  359. package/numkong/include/numkong/spatials.h +3374 -0
  360. package/numkong/include/numkong/spatials.hpp +509 -0
  361. package/numkong/include/numkong/tensor.hpp +1981 -0
  362. package/numkong/include/numkong/trigonometry/README.md +184 -0
  363. package/numkong/include/numkong/trigonometry/haswell.h +653 -0
  364. package/numkong/include/numkong/trigonometry/neon.h +638 -0
  365. package/numkong/include/numkong/trigonometry/rvv.h +700 -0
  366. package/numkong/include/numkong/trigonometry/serial.h +703 -0
  367. package/numkong/include/numkong/trigonometry/skylake.h +725 -0
  368. package/numkong/include/numkong/trigonometry/v128relaxed.h +667 -0
  369. package/numkong/include/numkong/trigonometry.h +467 -0
  370. package/numkong/include/numkong/trigonometry.hpp +166 -0
  371. package/numkong/include/numkong/types.h +1695 -0
  372. package/numkong/include/numkong/types.hpp +6027 -0
  373. package/numkong/include/numkong/vector.hpp +766 -0
  374. package/numkong/javascript/@numkong-darwin-arm64/package.json +26 -0
  375. package/numkong/javascript/@numkong-darwin-x64/package.json +26 -0
  376. package/numkong/javascript/@numkong-linux-arm64/package.json +25 -0
  377. package/numkong/javascript/@numkong-linux-x64/package.json +25 -0
  378. package/numkong/javascript/@numkong-win32-arm64/package.json +25 -0
  379. package/numkong/javascript/@numkong-win32-x64/package.json +25 -0
  380. package/numkong/javascript/README.md +254 -0
  381. package/numkong/javascript/node-gyp-build.d.ts +4 -0
  382. package/numkong/javascript/numkong-browser.ts +40 -0
  383. package/numkong/javascript/numkong-wasm.ts +750 -0
  384. package/numkong/javascript/numkong.c +712 -0
  385. package/numkong/javascript/numkong.ts +613 -0
  386. package/{simsimd → numkong}/javascript/tsconfig-base.json +6 -3
  387. package/numkong/javascript/tsconfig-cjs.json +13 -0
  388. package/{simsimd → numkong}/javascript/tsconfig-esm.json +1 -1
  389. package/numkong/javascript/types.ts +784 -0
  390. package/numkong/numkong.gypi +104 -0
  391. package/numkong/package.json +108 -0
  392. package/numkong/probes/arm_neon.c +8 -0
  393. package/numkong/probes/arm_neon_bfdot.c +9 -0
  394. package/numkong/probes/arm_neon_fhm.c +9 -0
  395. package/numkong/probes/arm_neon_half.c +8 -0
  396. package/numkong/probes/arm_neon_sdot.c +9 -0
  397. package/numkong/probes/arm_neonfp8.c +9 -0
  398. package/numkong/probes/arm_sme.c +16 -0
  399. package/numkong/probes/arm_sme2.c +16 -0
  400. package/numkong/probes/arm_sme2p1.c +16 -0
  401. package/numkong/probes/arm_sme_bf16.c +16 -0
  402. package/numkong/probes/arm_sme_bi32.c +16 -0
  403. package/numkong/probes/arm_sme_f64.c +16 -0
  404. package/numkong/probes/arm_sme_fa64.c +14 -0
  405. package/numkong/probes/arm_sme_half.c +16 -0
  406. package/numkong/probes/arm_sme_lut2.c +15 -0
  407. package/numkong/probes/arm_sve.c +18 -0
  408. package/numkong/probes/arm_sve2.c +20 -0
  409. package/numkong/probes/arm_sve2p1.c +18 -0
  410. package/numkong/probes/arm_sve_bfdot.c +20 -0
  411. package/numkong/probes/arm_sve_half.c +18 -0
  412. package/numkong/probes/arm_sve_sdot.c +21 -0
  413. package/numkong/probes/loongarch_lasx.c +12 -0
  414. package/numkong/probes/power_vsx.c +12 -0
  415. package/numkong/probes/probe.js +127 -0
  416. package/numkong/probes/riscv_rvv.c +14 -0
  417. package/numkong/probes/riscv_rvv_bb.c +15 -0
  418. package/numkong/probes/riscv_rvv_bf16.c +17 -0
  419. package/numkong/probes/riscv_rvv_half.c +14 -0
  420. package/numkong/probes/wasm_v128relaxed.c +11 -0
  421. package/numkong/probes/x86_alder.c +17 -0
  422. package/numkong/probes/x86_diamond.c +17 -0
  423. package/numkong/probes/x86_genoa.c +17 -0
  424. package/numkong/probes/x86_graniteamx.c +19 -0
  425. package/numkong/probes/x86_haswell.c +11 -0
  426. package/numkong/probes/x86_icelake.c +17 -0
  427. package/numkong/probes/x86_sapphire.c +16 -0
  428. package/numkong/probes/x86_sapphireamx.c +18 -0
  429. package/numkong/probes/x86_sierra.c +17 -0
  430. package/numkong/probes/x86_skylake.c +15 -0
  431. package/numkong/probes/x86_turin.c +17 -0
  432. package/numkong/rust/README.md +698 -0
  433. package/numkong/rust/capabilities.rs +96 -0
  434. package/numkong/rust/cast.rs +314 -0
  435. package/numkong/rust/curved.rs +391 -0
  436. package/numkong/rust/each.rs +2721 -0
  437. package/numkong/rust/geospatial.rs +343 -0
  438. package/numkong/rust/matrix.rs +5424 -0
  439. package/numkong/rust/maxsim.rs +540 -0
  440. package/numkong/rust/mesh.rs +837 -0
  441. package/numkong/rust/numkong.rs +409 -0
  442. package/numkong/rust/probability.rs +272 -0
  443. package/numkong/rust/reduce.rs +1249 -0
  444. package/numkong/rust/set.rs +194 -0
  445. package/numkong/rust/sparse.rs +513 -0
  446. package/numkong/rust/spatial.rs +1815 -0
  447. package/numkong/rust/tensor.rs +7565 -0
  448. package/numkong/rust/types.rs +3666 -0
  449. package/numkong/rust/vector.rs +1899 -0
  450. package/numkong/rustfmt.toml +2 -0
  451. package/numkong/swift/Matrix.swift +1388 -0
  452. package/numkong/swift/MaxSim.swift +151 -0
  453. package/numkong/swift/NumKong.swift +283 -0
  454. package/numkong/swift/Numerics.swift +329 -0
  455. package/numkong/swift/README.md +433 -0
  456. package/numkong/swift/Scalar.swift +741 -0
  457. package/numkong/swift/Tensor.swift +209 -0
  458. package/numkong/test/README.md +315 -0
  459. package/numkong/test/playwright.config.ts +16 -0
  460. package/numkong/test/swift/Test.swift +534 -0
  461. package/numkong/test/test-browser-bundle-runner.mjs +36 -0
  462. package/numkong/test/test-browser-bundle.html +188 -0
  463. package/numkong/test/test-browser-runner.mjs +43 -0
  464. package/numkong/test/test-browser.html +305 -0
  465. package/numkong/test/test-dtypes.mjs +453 -0
  466. package/numkong/test/test-wasm.mjs +267 -0
  467. package/numkong/test/test.cpp +442 -0
  468. package/numkong/test/test.hpp +580 -0
  469. package/numkong/test/test.mjs +363 -0
  470. package/numkong/test/test_base.py +1041 -0
  471. package/numkong/test/test_cast.cpp +242 -0
  472. package/numkong/test/test_cross.hpp +551 -0
  473. package/numkong/test/test_cross.py +467 -0
  474. package/numkong/test/test_cross_amx.cpp +50 -0
  475. package/numkong/test/test_cross_arm.cpp +225 -0
  476. package/numkong/test/test_cross_blas.cpp +354 -0
  477. package/numkong/test/test_cross_loongarch.cpp +90 -0
  478. package/numkong/test/test_cross_power.cpp +73 -0
  479. package/numkong/test/test_cross_rvv.cpp +109 -0
  480. package/numkong/test/test_cross_serial.cpp +181 -0
  481. package/numkong/test/test_cross_sme.cpp +148 -0
  482. package/numkong/test/test_cross_wasm.cpp +141 -0
  483. package/numkong/test/test_cross_x86.cpp +442 -0
  484. package/numkong/test/test_curved.cpp +182 -0
  485. package/numkong/test/test_curved.py +207 -0
  486. package/numkong/test/test_dot.cpp +353 -0
  487. package/numkong/test/test_dot.py +296 -0
  488. package/numkong/test/test_each.cpp +437 -0
  489. package/numkong/test/test_each.py +756 -0
  490. package/numkong/test/test_geospatial.cpp +155 -0
  491. package/numkong/test/test_geospatial.py +241 -0
  492. package/numkong/test/test_maxsim.cpp +138 -0
  493. package/numkong/test/test_maxsim.py +209 -0
  494. package/numkong/test/test_mesh.cpp +203 -0
  495. package/numkong/test/test_mesh.py +394 -0
  496. package/numkong/test/test_probability.cpp +136 -0
  497. package/numkong/test/test_probability.py +166 -0
  498. package/numkong/test/test_reduce.cpp +563 -0
  499. package/numkong/test/test_reduce.py +781 -0
  500. package/numkong/test/test_set.cpp +151 -0
  501. package/numkong/test/test_set.py +120 -0
  502. package/numkong/test/test_similarities.py +579 -0
  503. package/numkong/test/test_sparse.cpp +121 -0
  504. package/numkong/test/test_sparse.py +118 -0
  505. package/numkong/test/test_spatial.cpp +518 -0
  506. package/numkong/test/test_spatial.py +269 -0
  507. package/numkong/test/test_tensor.cpp +884 -0
  508. package/numkong/test/test_tensor.py +1417 -0
  509. package/numkong/test/test_trigonometry.cpp +156 -0
  510. package/numkong/test/test_trigonometry.py +180 -0
  511. package/package.json +7 -8
  512. package/prebuilds/darwin-arm64+x64/usearch.node +0 -0
  513. package/prebuilds/linux-arm64/usearch.node +0 -0
  514. package/prebuilds/linux-x64/usearch.node +0 -0
  515. package/fp16/CMakeLists.txt +0 -176
  516. package/fp16/LICENSE +0 -11
  517. package/fp16/README.md +0 -20
  518. package/fp16/bench/alt-element.cc +0 -89
  519. package/fp16/bench/from-alt-array.cc +0 -175
  520. package/fp16/bench/from-ieee-array.cc +0 -399
  521. package/fp16/bench/ieee-element.cc +0 -272
  522. package/fp16/bench/to-alt-array.cc +0 -91
  523. package/fp16/bench/to-ieee-array.cc +0 -303
  524. package/fp16/cmake/DownloadGoogleBenchmark.cmake +0 -15
  525. package/fp16/cmake/DownloadGoogleTest.cmake +0 -15
  526. package/fp16/cmake/DownloadPSimd.cmake +0 -15
  527. package/fp16/configure.py +0 -65
  528. package/fp16/confu.yaml +0 -8
  529. package/fp16/include/fp16/__init__.py +0 -0
  530. package/fp16/include/fp16/avx.py +0 -50
  531. package/fp16/include/fp16/avx2.py +0 -53
  532. package/fp16/include/fp16/bitcasts.h +0 -92
  533. package/fp16/include/fp16/fp16.h +0 -451
  534. package/fp16/include/fp16/psimd.h +0 -131
  535. package/fp16/include/fp16.h +0 -11
  536. package/fp16/jni/Android.mk +0 -6
  537. package/fp16/jni/Application.mk +0 -4
  538. package/fp16/test/alt-from-fp32-value.cc +0 -498
  539. package/fp16/test/alt-to-fp32-bits.cc +0 -263
  540. package/fp16/test/alt-to-fp32-psimd.cc +0 -145
  541. package/fp16/test/alt-to-fp32-value.cc +0 -348
  542. package/fp16/test/alt-to-fp32x2-psimd.cc +0 -245
  543. package/fp16/test/bitcasts.cc +0 -56
  544. package/fp16/test/ieee-from-fp32-value.cc +0 -523
  545. package/fp16/test/ieee-to-fp32-bits.cc +0 -333
  546. package/fp16/test/ieee-to-fp32-psimd.cc +0 -312
  547. package/fp16/test/ieee-to-fp32-value.cc +0 -420
  548. package/fp16/test/ieee-to-fp32x2-psimd.cc +0 -541
  549. package/fp16/test/peachpy/alt-xmm-to-fp32-xmm-avx.cc +0 -96
  550. package/fp16/test/peachpy/alt-xmm-to-fp32-ymm-avx2.cc +0 -96
  551. package/fp16/test/peachpy/stubs.py +0 -38
  552. package/fp16/test/tables.cc +0 -530
  553. package/fp16/test/tables.h +0 -13
  554. package/fp16/third-party/THHalf.h +0 -92
  555. package/fp16/third-party/eigen-half.h +0 -170
  556. package/fp16/third-party/float16-compressor.h +0 -80
  557. package/fp16/third-party/half.hpp +0 -2916
  558. package/fp16/third-party/npy-halffloat.h +0 -328
  559. package/simsimd/.git-blame-ignore-revs +0 -2
  560. package/simsimd/CONTRIBUTING.md +0 -321
  561. package/simsimd/Cargo.toml +0 -49
  562. package/simsimd/MANIFEST.in +0 -4
  563. package/simsimd/Package.swift +0 -28
  564. package/simsimd/README.md +0 -1493
  565. package/simsimd/binding.gyp +0 -35
  566. package/simsimd/build.rs +0 -70
  567. package/simsimd/c/lib.c +0 -374
  568. package/simsimd/include/module.modulemap +0 -4
  569. package/simsimd/include/simsimd/binary.h +0 -486
  570. package/simsimd/include/simsimd/curved.h +0 -1541
  571. package/simsimd/include/simsimd/dot.h +0 -1853
  572. package/simsimd/include/simsimd/elementwise.h +0 -2465
  573. package/simsimd/include/simsimd/geospatial.h +0 -43
  574. package/simsimd/include/simsimd/mesh.h +0 -69
  575. package/simsimd/include/simsimd/probability.h +0 -606
  576. package/simsimd/include/simsimd/simsimd.h +0 -2567
  577. package/simsimd/include/simsimd/sparse.h +0 -1384
  578. package/simsimd/include/simsimd/spatial.h +0 -2335
  579. package/simsimd/include/simsimd/types.h +0 -666
  580. package/simsimd/javascript/fallback.ts +0 -233
  581. package/simsimd/javascript/lib.c +0 -125
  582. package/simsimd/javascript/node-gyp-build.d.ts +0 -1
  583. package/simsimd/javascript/simsimd.ts +0 -179
  584. package/simsimd/javascript/tsconfig-cjs.json +0 -8
  585. package/simsimd/package-lock.json +0 -1761
  586. package/simsimd/package.json +0 -61
  587. package/simsimd/rust/lib.rs +0 -1821
  588. package/simsimd/scripts/bench.cxx +0 -1170
  589. package/simsimd/scripts/bench.ipynb +0 -187
  590. package/simsimd/scripts/bench.js +0 -127
  591. package/simsimd/scripts/bench.rs +0 -876
  592. package/simsimd/scripts/bench_vectors.py +0 -734
  593. package/simsimd/scripts/bench_vectors_live.py +0 -213
  594. package/simsimd/scripts/test.c +0 -187
  595. package/simsimd/scripts/test.mjs +0 -220
  596. package/simsimd/scripts/test.py +0 -1505
  597. package/simsimd/swift/SimSIMD.swift +0 -149
  598. package/simsimd/swift/Test.swift +0 -128
  599. /package/{simsimd → numkong}/CODE_OF_CONDUCT.md +0 -0
  600. /package/{simsimd → numkong}/LICENSE +0 -0
  601. /package/{simsimd → numkong}/javascript/dist-package-cjs.json +0 -0
  602. /package/{simsimd → numkong}/javascript/dist-package-esm.json +0 -0
@@ -0,0 +1,2232 @@
1
+ /**
2
+ * @brief SIMD-accelerated Elementwise Arithmetic.
3
+ * @file include/numkong/each.h
4
+ * @author Ash Vardanian
5
+ * @date October 16, 2024
6
+ *
7
+ * Contains following element-wise operations:
8
+ *
9
+ * - Scale (Multiply) with shift: result[i] = α·a[i] + β
10
+ * - Sum (Add): result[i] = a[i] + b[i]
11
+ * - Blend: result[i] = α·a[i] + β·b[i]
12
+ * - FMA (Fused Multiply-Add): result[i] = α·a[i]·b[i] + β·c[i]
13
+ *
14
+ * Beyond their obvious usecases, those can be reused for vector-scalar math and other operations:
15
+ *
16
+ * - Scale with β = 0 for a pure multiply.
17
+ * - Sum is equivalent to WSum with α = β = 1.
18
+ * - Average is WSum with α = β = 0.5.
19
+ * - Elementwise multiply is FMA with β = 0.
20
+ *
21
+ * For dtypes:
22
+ *
23
+ * - f64c: 64-bit complex × 64-bit complex scales
24
+ * - f32c: 32-bit complex × 32-bit complex scales
25
+ * - f64: 64-bit IEEE floating point × 64-bit scales
26
+ * - f32: 32-bit IEEE floating point × 32-bit scales
27
+ * - f16: 16-bit IEEE floating point × 32-bit scales
28
+ * - bf16: 16-bit brain floating point × 32-bit scales
29
+ * - e4m3: 8-bit e4m3 floating point × 32-bit scales
30
+ * - e5m2: 8-bit e5m2 floating point × 32-bit scales
31
+ * - e2m3: 8-bit e2m3 floating point (MX) × 32-bit scales
32
+ * - e3m2: 8-bit e3m2 floating point (MX) × 32-bit scales
33
+ * - i8/u8: 8-bit integers × 32-bit scales
34
+ * - i16/u16: 16-bit integers × 32-bit scales
35
+ * - i32/u32: 32-bit integers × 64-bit scales
36
+ * - i64/u64: 64-bit integers × 64-bit scales
37
+ *
38
+ * For hardware architectures:
39
+ *
40
+ * - Arm: NEON, NEON+F16, NEON+BF16
41
+ * - x86: Haswell, Skylake, Ice Lake, Sapphire Rapids
42
+ * - RISC-V: RVV
43
+ *
44
+ *
45
+ * @section numerical_stability Numerical Stability
46
+ *
47
+ * Integer sum is elementwise a[i]+b[i] clamped to the type's range. Serial widens to
48
+ * i64 then clamps on store. NEON uses hardware saturating adds (SQADD/UQADD).
49
+ * f16/bf16/FP8 sum: promoted to f32, added, truncated back — double rounding possible.
50
+ * Scale/blend/fma: float alpha/beta arithmetic, result rounded to nearest, ties to even, then clamped.
51
+ * f32/f64 operations are native precision with no widening.
52
+ *
53
+ * @section x86_instructions Relevant x86 Instructions
54
+ *
55
+ * FP16 conversions (VCVTPH2PS/VCVTPS2PH) are used for f16 scale/sum/blend/fma operations, converting
56
+ * to f32 for arithmetic then back. The 6-7 cycle latency is amortized over vector-width elements.
57
+ * Saturating integer adds (VPADDSW/VPADDUSW) provide overflow protection for i16/u16 sums without
58
+ * branching. FMA (VFMADD231PS) is the workhorse for scale (alpha*x+beta) and blend (alpha*a+beta*b).
59
+ *
60
+ * Intrinsic Instruction Icelake Genoa
61
+ * _mm512_cvtph_ps VCVTPH2PS (ZMM, YMM) 7cy @ p0+p5 6cy @ p12+p23
62
+ * _mm512_cvtps_ph VCVTPS2PH (YMM, ZMM, I8) 7cy @ p0+p5 7cy @ p12+p23
63
+ * _mm256_adds_epi16 VPADDSW (YMM, YMM, YMM) 1cy @ p01 n/a
64
+ * _mm256_adds_epu16 VPADDUSW (YMM, YMM, YMM) 1cy @ p01 n/a
65
+ * _mm512_fpclass_ps_mask VFPCLASSPS (K, ZMM, I8) 3cy @ p5 5cy @ p01
66
+ * _mm256_fmadd_ps VFMADD231PS (YMM, YMM, YMM) 4cy @ p01 4cy @ p01
67
+ *
68
+ * @section arm_instructions Relevant ARM NEON/SVE Instructions
69
+ *
70
+ * On ARM, i8/u8 elementwise operations convert to f16 intermediates using FCVT to maintain high
71
+ * vector throughput (8 elements per 128-bit register vs 4 for f32). Saturating adds (SQADD/UQADD)
72
+ * handle integer overflow. FMLA provides fused multiply-add for floating-point scale/blend/fma.
73
+ *
74
+ * Intrinsic Instruction M1 Firestorm Graviton 3 Graviton 4
75
+ * vfmaq_f32 FMLA.S (vec) 4cy @ V0123 4cy @ V0123 4cy @ V0123
76
+ * vqaddq_s16 SQADD (vec) 3cy @ V0123 2cy @ V0123 2cy @ V0123
77
+ * vqaddq_u16 UQADD (vec) 3cy @ V0123 2cy @ V0123 2cy @ V0123
78
+ * vcvtq_f32_s32 SCVTF (vec) 3cy @ V0123 3cy @ V01 3cy @ V01
79
+ * vcvtnq_s32_f32 FCVTNS (vec) 3cy @ V0123 3cy @ V01 3cy @ V01
80
+ *
81
+ * @section references References
82
+ *
83
+ * - x86 intrinsics: https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html
84
+ * - Arm intrinsics: https://developer.arm.com/architectures/instruction-sets/intrinsics/
85
+ *
86
+ */
87
+ #ifndef NK_EACH_H
88
+ #define NK_EACH_H
89
+
90
+ #include "numkong/types.h"
91
+
92
+ #if defined(__cplusplus)
93
+ extern "C" {
94
+ #endif
95
+
96
+ /**
97
+ * @brief Element-wise scale with shift: result[i] = alpha * a[i] + beta.
98
+ *
99
+ * @param[in] a The input vector.
100
+ * @param[in] n The number of elements in the vector.
101
+ * @param[in] alpha Pointer to the scaling factor (type depends on input precision).
102
+ * @param[in] beta Pointer to the shift (bias) value (type depends on input precision).
103
+ * @param[out] result The output vector.
104
+ */
105
+ NK_DYNAMIC void nk_each_scale_f64(nk_f64_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
106
+ nk_f64_t *result);
107
+ /** @copydoc nk_each_scale_f64 */
108
+ NK_DYNAMIC void nk_each_scale_f32(nk_f32_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
109
+ nk_f32_t *result);
110
+ /** @copydoc nk_each_scale_f64 */
111
+ NK_DYNAMIC void nk_each_scale_f16(nk_f16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
112
+ nk_f16_t *result);
113
+ /** @copydoc nk_each_scale_f64 */
114
+ NK_DYNAMIC void nk_each_scale_bf16(nk_bf16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
115
+ nk_bf16_t *result);
116
+ /** @copydoc nk_each_scale_f64 */
117
+ NK_DYNAMIC void nk_each_scale_i8(nk_i8_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
118
+ nk_i8_t *result);
119
+ /** @copydoc nk_each_scale_f64 */
120
+ NK_DYNAMIC void nk_each_scale_u8(nk_u8_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
121
+ nk_u8_t *result);
122
+ /** @copydoc nk_each_scale_f64 */
123
+ NK_DYNAMIC void nk_each_scale_i16(nk_i16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
124
+ nk_i16_t *result);
125
+ /** @copydoc nk_each_scale_f64 */
126
+ NK_DYNAMIC void nk_each_scale_u16(nk_u16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
127
+ nk_u16_t *result);
128
+ /** @copydoc nk_each_scale_f64 */
129
+ NK_DYNAMIC void nk_each_scale_i32(nk_i32_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
130
+ nk_i32_t *result);
131
+ /** @copydoc nk_each_scale_f64 */
132
+ NK_DYNAMIC void nk_each_scale_u32(nk_u32_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
133
+ nk_u32_t *result);
134
+ /** @copydoc nk_each_scale_f64 */
135
+ NK_DYNAMIC void nk_each_scale_i64(nk_i64_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
136
+ nk_i64_t *result);
137
+ /** @copydoc nk_each_scale_f64 */
138
+ NK_DYNAMIC void nk_each_scale_u64(nk_u64_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
139
+ nk_u64_t *result);
140
+
141
+ /**
142
+ * @brief Element-wise sum: result[i] = a[i] + b[i].
143
+ *
144
+ * @param[in] a The first input vector.
145
+ * @param[in] b The second input vector.
146
+ * @param[in] n The number of elements in the vectors.
147
+ * @param[out] result The output vector.
148
+ */
149
+ NK_DYNAMIC void nk_each_sum_f64(nk_f64_t const *a, nk_f64_t const *b, nk_size_t n, nk_f64_t *result);
150
+ /** @copydoc nk_each_sum_f64 */
151
+ NK_DYNAMIC void nk_each_sum_f32(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f32_t *result);
152
+ /** @copydoc nk_each_sum_f64 */
153
+ NK_DYNAMIC void nk_each_sum_f16(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f16_t *result);
154
+ /** @copydoc nk_each_sum_f64 */
155
+ NK_DYNAMIC void nk_each_sum_bf16(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_bf16_t *result);
156
+ /** @copydoc nk_each_sum_f64 */
157
+ NK_DYNAMIC void nk_each_sum_i8(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_i8_t *result);
158
+ /** @copydoc nk_each_sum_f64 */
159
+ NK_DYNAMIC void nk_each_sum_u8(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_u8_t *result);
160
+ /** @copydoc nk_each_sum_f64 */
161
+ NK_DYNAMIC void nk_each_sum_i16(nk_i16_t const *a, nk_i16_t const *b, nk_size_t n, nk_i16_t *result);
162
+ /** @copydoc nk_each_sum_f64 */
163
+ NK_DYNAMIC void nk_each_sum_u16(nk_u16_t const *a, nk_u16_t const *b, nk_size_t n, nk_u16_t *result);
164
+ /** @copydoc nk_each_sum_f64 */
165
+ NK_DYNAMIC void nk_each_sum_i32(nk_i32_t const *a, nk_i32_t const *b, nk_size_t n, nk_i32_t *result);
166
+ /** @copydoc nk_each_sum_f64 */
167
+ NK_DYNAMIC void nk_each_sum_u32(nk_u32_t const *a, nk_u32_t const *b, nk_size_t n, nk_u32_t *result);
168
+ /** @copydoc nk_each_sum_f64 */
169
+ NK_DYNAMIC void nk_each_sum_i64(nk_i64_t const *a, nk_i64_t const *b, nk_size_t n, nk_i64_t *result);
170
+ /** @copydoc nk_each_sum_f64 */
171
+ NK_DYNAMIC void nk_each_sum_u64(nk_u64_t const *a, nk_u64_t const *b, nk_size_t n, nk_u64_t *result);
172
+
173
+ /**
174
+ * @brief Weighted sum: result[i] = alpha * a[i] + beta * b[i].
175
+ *
176
+ * @param[in] a The first input vector.
177
+ * @param[in] b The second input vector.
178
+ * @param[in] n The number of elements in the vectors.
179
+ * @param[in] alpha Pointer to the first weight (type depends on input precision).
180
+ * @param[in] beta Pointer to the second weight (type depends on input precision).
181
+ * @param[out] result The output vector.
182
+ */
183
+ NK_DYNAMIC void nk_each_blend_f64(nk_f64_t const *a, nk_f64_t const *b, nk_size_t n, nk_f64_t const *alpha,
184
+ nk_f64_t const *beta, nk_f64_t *result);
185
+ /** @copydoc nk_each_blend_f64 */
186
+ NK_DYNAMIC void nk_each_blend_f32(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f32_t const *alpha,
187
+ nk_f32_t const *beta, nk_f32_t *result);
188
+ /** @copydoc nk_each_blend_f64 */
189
+ NK_DYNAMIC void nk_each_blend_f16(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f32_t const *alpha,
190
+ nk_f32_t const *beta, nk_f16_t *result);
191
+ /** @copydoc nk_each_blend_f64 */
192
+ NK_DYNAMIC void nk_each_blend_bf16(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_f32_t const *alpha,
193
+ nk_f32_t const *beta, nk_bf16_t *result);
194
+ /** @copydoc nk_each_blend_f64 */
195
+ NK_DYNAMIC void nk_each_blend_i8(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_f32_t const *alpha,
196
+ nk_f32_t const *beta, nk_i8_t *result);
197
+ /** @copydoc nk_each_blend_f64 */
198
+ NK_DYNAMIC void nk_each_blend_u8(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_f32_t const *alpha,
199
+ nk_f32_t const *beta, nk_u8_t *result);
200
+ /** @copydoc nk_each_blend_f64 */
201
+ NK_DYNAMIC void nk_each_blend_i16(nk_i16_t const *a, nk_i16_t const *b, nk_size_t n, nk_f32_t const *alpha,
202
+ nk_f32_t const *beta, nk_i16_t *result);
203
+ /** @copydoc nk_each_blend_f64 */
204
+ NK_DYNAMIC void nk_each_blend_u16(nk_u16_t const *a, nk_u16_t const *b, nk_size_t n, nk_f32_t const *alpha,
205
+ nk_f32_t const *beta, nk_u16_t *result);
206
+ /** @copydoc nk_each_blend_f64 */
207
+ NK_DYNAMIC void nk_each_blend_i32(nk_i32_t const *a, nk_i32_t const *b, nk_size_t n, nk_f64_t const *alpha,
208
+ nk_f64_t const *beta, nk_i32_t *result);
209
+ /** @copydoc nk_each_blend_f64 */
210
+ NK_DYNAMIC void nk_each_blend_u32(nk_u32_t const *a, nk_u32_t const *b, nk_size_t n, nk_f64_t const *alpha,
211
+ nk_f64_t const *beta, nk_u32_t *result);
212
+ /** @copydoc nk_each_blend_f64 */
213
+ NK_DYNAMIC void nk_each_blend_i64(nk_i64_t const *a, nk_i64_t const *b, nk_size_t n, nk_f64_t const *alpha,
214
+ nk_f64_t const *beta, nk_i64_t *result);
215
+ /** @copydoc nk_each_blend_f64 */
216
+ NK_DYNAMIC void nk_each_blend_u64(nk_u64_t const *a, nk_u64_t const *b, nk_size_t n, nk_f64_t const *alpha,
217
+ nk_f64_t const *beta, nk_u64_t *result);
218
+
219
+ /**
220
+ * @brief Fused multiply-add: result[i] = alpha * a[i] * b[i] + beta * c[i].
221
+ *
222
+ * @param[in] a The first input vector.
223
+ * @param[in] b The second input vector.
224
+ * @param[in] c The third input vector.
225
+ * @param[in] n The number of elements in the vectors.
226
+ * @param[in] alpha Pointer to the scaling factor for a[i] * b[i] (type depends on input precision).
227
+ * @param[in] beta Pointer to the scaling factor for c[i] (type depends on input precision).
228
+ * @param[out] result The output vector.
229
+ */
230
+ NK_DYNAMIC void nk_each_fma_f64(nk_f64_t const *a, nk_f64_t const *b, nk_f64_t const *c, nk_size_t n,
231
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_f64_t *result);
232
+ /** @copydoc nk_each_fma_f64 */
233
+ NK_DYNAMIC void nk_each_fma_f32(nk_f32_t const *a, nk_f32_t const *b, nk_f32_t const *c, nk_size_t n,
234
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_f32_t *result);
235
+ /** @copydoc nk_each_fma_f64 */
236
+ NK_DYNAMIC void nk_each_fma_f16(nk_f16_t const *a, nk_f16_t const *b, nk_f16_t const *c, nk_size_t n,
237
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_f16_t *result);
238
+ /** @copydoc nk_each_fma_f64 */
239
+ NK_DYNAMIC void nk_each_fma_bf16(nk_bf16_t const *a, nk_bf16_t const *b, nk_bf16_t const *c, nk_size_t n,
240
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_bf16_t *result);
241
+ /** @copydoc nk_each_fma_f64 */
242
+ NK_DYNAMIC void nk_each_fma_i8(nk_i8_t const *a, nk_i8_t const *b, nk_i8_t const *c, nk_size_t n, nk_f32_t const *alpha,
243
+ nk_f32_t const *beta, nk_i8_t *result);
244
+ /** @copydoc nk_each_fma_f64 */
245
+ NK_DYNAMIC void nk_each_fma_u8(nk_u8_t const *a, nk_u8_t const *b, nk_u8_t const *c, nk_size_t n, nk_f32_t const *alpha,
246
+ nk_f32_t const *beta, nk_u8_t *result);
247
+ /** @copydoc nk_each_fma_f64 */
248
+ NK_DYNAMIC void nk_each_fma_i16(nk_i16_t const *a, nk_i16_t const *b, nk_i16_t const *c, nk_size_t n,
249
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_i16_t *result);
250
+
251
+ /** @copydoc nk_each_sum_f64 */
252
+ NK_DYNAMIC void nk_each_sum_e4m3(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_e4m3_t *result);
253
+ /** @copydoc nk_each_sum_f64 */
254
+ NK_DYNAMIC void nk_each_sum_e5m2(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_e5m2_t *result);
255
+ /** @copydoc nk_each_scale_f64 */
256
+ NK_DYNAMIC void nk_each_scale_e4m3(nk_e4m3_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
257
+ nk_e4m3_t *result);
258
+ /** @copydoc nk_each_scale_f64 */
259
+ NK_DYNAMIC void nk_each_scale_e5m2(nk_e5m2_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
260
+ nk_e5m2_t *result);
261
+ /** @copydoc nk_each_blend_f64 */
262
+ NK_DYNAMIC void nk_each_blend_e4m3(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_f32_t const *alpha,
263
+ nk_f32_t const *beta, nk_e4m3_t *result);
264
+ /** @copydoc nk_each_blend_f64 */
265
+ NK_DYNAMIC void nk_each_blend_e5m2(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_f32_t const *alpha,
266
+ nk_f32_t const *beta, nk_e5m2_t *result);
267
+ /** @copydoc nk_each_fma_f64 */
268
+ NK_DYNAMIC void nk_each_fma_e4m3(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_e4m3_t const *c, nk_size_t n,
269
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_e4m3_t *result);
270
+ /** @copydoc nk_each_fma_f64 */
271
+ NK_DYNAMIC void nk_each_fma_e5m2(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_e5m2_t const *c, nk_size_t n,
272
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_e5m2_t *result);
273
+ /** @copydoc nk_each_sum_f64 */
274
+ NK_DYNAMIC void nk_each_sum_e2m3(nk_e2m3_t const *a, nk_e2m3_t const *b, nk_size_t n, nk_e2m3_t *result);
275
+ /** @copydoc nk_each_sum_f64 */
276
+ NK_DYNAMIC void nk_each_sum_e3m2(nk_e3m2_t const *a, nk_e3m2_t const *b, nk_size_t n, nk_e3m2_t *result);
277
+ /** @copydoc nk_each_scale_f64 */
278
+ NK_DYNAMIC void nk_each_scale_e2m3(nk_e2m3_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
279
+ nk_e2m3_t *result);
280
+ /** @copydoc nk_each_scale_f64 */
281
+ NK_DYNAMIC void nk_each_scale_e3m2(nk_e3m2_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
282
+ nk_e3m2_t *result);
283
+ /** @copydoc nk_each_blend_f64 */
284
+ NK_DYNAMIC void nk_each_blend_e2m3(nk_e2m3_t const *a, nk_e2m3_t const *b, nk_size_t n, nk_f32_t const *alpha,
285
+ nk_f32_t const *beta, nk_e2m3_t *result);
286
+ /** @copydoc nk_each_blend_f64 */
287
+ NK_DYNAMIC void nk_each_blend_e3m2(nk_e3m2_t const *a, nk_e3m2_t const *b, nk_size_t n, nk_f32_t const *alpha,
288
+ nk_f32_t const *beta, nk_e3m2_t *result);
289
+ /** @copydoc nk_each_fma_f64 */
290
+ NK_DYNAMIC void nk_each_fma_e2m3(nk_e2m3_t const *a, nk_e2m3_t const *b, nk_e2m3_t const *c, nk_size_t n,
291
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_e2m3_t *result);
292
+ /** @copydoc nk_each_fma_f64 */
293
+ NK_DYNAMIC void nk_each_fma_e3m2(nk_e3m2_t const *a, nk_e3m2_t const *b, nk_e3m2_t const *c, nk_size_t n,
294
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_e3m2_t *result);
295
+ /** @copydoc nk_each_fma_f64 */
296
+ NK_DYNAMIC void nk_each_fma_u16(nk_u16_t const *a, nk_u16_t const *b, nk_u16_t const *c, nk_size_t n,
297
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_u16_t *result);
298
+ /** @copydoc nk_each_fma_f64 */
299
+ NK_DYNAMIC void nk_each_fma_i32(nk_i32_t const *a, nk_i32_t const *b, nk_i32_t const *c, nk_size_t n,
300
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_i32_t *result);
301
+ /** @copydoc nk_each_fma_f64 */
302
+ NK_DYNAMIC void nk_each_fma_u32(nk_u32_t const *a, nk_u32_t const *b, nk_u32_t const *c, nk_size_t n,
303
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_u32_t *result);
304
+ /** @copydoc nk_each_fma_f64 */
305
+ NK_DYNAMIC void nk_each_fma_i64(nk_i64_t const *a, nk_i64_t const *b, nk_i64_t const *c, nk_size_t n,
306
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_i64_t *result);
307
+ /** @copydoc nk_each_fma_f64 */
308
+ NK_DYNAMIC void nk_each_fma_u64(nk_u64_t const *a, nk_u64_t const *b, nk_u64_t const *c, nk_size_t n,
309
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_u64_t *result);
310
+
311
+ /** @copydoc nk_each_sum_f64 */
312
+ NK_DYNAMIC void nk_each_sum_f32c(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f32c_t *result);
313
+ /** @copydoc nk_each_sum_f64 */
314
+ NK_DYNAMIC void nk_each_sum_f64c(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t *result);
315
+ /** @copydoc nk_each_scale_f64 */
316
+ NK_DYNAMIC void nk_each_scale_f32c(nk_f32c_t const *a, nk_size_t n, nk_f32c_t const *alpha, nk_f32c_t const *beta,
317
+ nk_f32c_t *result);
318
+ /** @copydoc nk_each_scale_f64 */
319
+ NK_DYNAMIC void nk_each_scale_f64c(nk_f64c_t const *a, nk_size_t n, nk_f64c_t const *alpha, nk_f64c_t const *beta,
320
+ nk_f64c_t *result);
321
+ /** @copydoc nk_each_blend_f64 */
322
+ NK_DYNAMIC void nk_each_blend_f32c(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f32c_t const *alpha,
323
+ nk_f32c_t const *beta, nk_f32c_t *result);
324
+ /** @copydoc nk_each_blend_f64 */
325
+ NK_DYNAMIC void nk_each_blend_f64c(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t const *alpha,
326
+ nk_f64c_t const *beta, nk_f64c_t *result);
327
+ /** @copydoc nk_each_fma_f64 */
328
+ NK_DYNAMIC void nk_each_fma_f32c(nk_f32c_t const *a, nk_f32c_t const *b, nk_f32c_t const *c, nk_size_t n,
329
+ nk_f32c_t const *alpha, nk_f32c_t const *beta, nk_f32c_t *result);
330
+ /** @copydoc nk_each_fma_f64 */
331
+ NK_DYNAMIC void nk_each_fma_f64c(nk_f64c_t const *a, nk_f64c_t const *b, nk_f64c_t const *c, nk_size_t n,
332
+ nk_f64c_t const *alpha, nk_f64c_t const *beta, nk_f64c_t *result);
333
+
334
+ /** @copydoc nk_each_scale_f64 */
335
+ NK_PUBLIC void nk_each_scale_f64_serial(nk_f64_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
336
+ nk_f64_t *result);
337
+ /** @copydoc nk_each_scale_f64 */
338
+ NK_PUBLIC void nk_each_scale_f32_serial(nk_f32_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
339
+ nk_f32_t *result);
340
+ /** @copydoc nk_each_scale_f64 */
341
+ NK_PUBLIC void nk_each_scale_f16_serial(nk_f16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
342
+ nk_f16_t *result);
343
+ /** @copydoc nk_each_scale_f64 */
344
+ NK_PUBLIC void nk_each_scale_bf16_serial(nk_bf16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
345
+ nk_bf16_t *result);
346
+ /** @copydoc nk_each_scale_f64 */
347
+ NK_PUBLIC void nk_each_scale_i8_serial(nk_i8_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
348
+ nk_i8_t *result);
349
+ /** @copydoc nk_each_scale_f64 */
350
+ NK_PUBLIC void nk_each_scale_u8_serial(nk_u8_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
351
+ nk_u8_t *result);
352
+ /** @copydoc nk_each_scale_f64 */
353
+ NK_PUBLIC void nk_each_scale_i16_serial(nk_i16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
354
+ nk_i16_t *result);
355
+ /** @copydoc nk_each_scale_f64 */
356
+ NK_PUBLIC void nk_each_scale_u16_serial(nk_u16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
357
+ nk_u16_t *result);
358
+ /** @copydoc nk_each_scale_f64 */
359
+ NK_PUBLIC void nk_each_scale_i32_serial(nk_i32_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
360
+ nk_i32_t *result);
361
+ /** @copydoc nk_each_scale_f64 */
362
+ NK_PUBLIC void nk_each_scale_u32_serial(nk_u32_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
363
+ nk_u32_t *result);
364
+ /** @copydoc nk_each_scale_f64 */
365
+ NK_PUBLIC void nk_each_scale_i64_serial(nk_i64_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
366
+ nk_i64_t *result);
367
+ /** @copydoc nk_each_scale_f64 */
368
+ NK_PUBLIC void nk_each_scale_u64_serial(nk_u64_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
369
+ nk_u64_t *result);
370
+
371
+ /** @copydoc nk_each_sum_f64 */
372
+ NK_PUBLIC void nk_each_sum_f64_serial(nk_f64_t const *a, nk_f64_t const *b, nk_size_t n, nk_f64_t *result);
373
+ /** @copydoc nk_each_sum_f64 */
374
+ NK_PUBLIC void nk_each_sum_f32_serial(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f32_t *result);
375
+ /** @copydoc nk_each_sum_f64 */
376
+ NK_PUBLIC void nk_each_sum_f16_serial(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f16_t *result);
377
+ /** @copydoc nk_each_sum_f64 */
378
+ NK_PUBLIC void nk_each_sum_bf16_serial(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_bf16_t *result);
379
+ /** @copydoc nk_each_sum_f64 */
380
+ NK_PUBLIC void nk_each_sum_i8_serial(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_i8_t *result);
381
+ /** @copydoc nk_each_sum_f64 */
382
+ NK_PUBLIC void nk_each_sum_u8_serial(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_u8_t *result);
383
+ /** @copydoc nk_each_sum_f64 */
384
+ NK_PUBLIC void nk_each_sum_i16_serial(nk_i16_t const *a, nk_i16_t const *b, nk_size_t n, nk_i16_t *result);
385
+ /** @copydoc nk_each_sum_f64 */
386
+ NK_PUBLIC void nk_each_sum_u16_serial(nk_u16_t const *a, nk_u16_t const *b, nk_size_t n, nk_u16_t *result);
387
+ /** @copydoc nk_each_sum_f64 */
388
+ NK_PUBLIC void nk_each_sum_i32_serial(nk_i32_t const *a, nk_i32_t const *b, nk_size_t n, nk_i32_t *result);
389
+ /** @copydoc nk_each_sum_f64 */
390
+ NK_PUBLIC void nk_each_sum_u32_serial(nk_u32_t const *a, nk_u32_t const *b, nk_size_t n, nk_u32_t *result);
391
+ /** @copydoc nk_each_sum_f64 */
392
+ NK_PUBLIC void nk_each_sum_i64_serial(nk_i64_t const *a, nk_i64_t const *b, nk_size_t n, nk_i64_t *result);
393
+ /** @copydoc nk_each_sum_f64 */
394
+ NK_PUBLIC void nk_each_sum_u64_serial(nk_u64_t const *a, nk_u64_t const *b, nk_size_t n, nk_u64_t *result);
395
+
396
+ /** @copydoc nk_each_blend_f64 */
397
+ NK_PUBLIC void nk_each_blend_f64_serial(nk_f64_t const *a, nk_f64_t const *b, nk_size_t n, nk_f64_t const *alpha,
398
+ nk_f64_t const *beta, nk_f64_t *result);
399
+ /** @copydoc nk_each_blend_f64 */
400
+ NK_PUBLIC void nk_each_blend_f32_serial(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f32_t const *alpha,
401
+ nk_f32_t const *beta, nk_f32_t *result);
402
+ /** @copydoc nk_each_blend_f64 */
403
+ NK_PUBLIC void nk_each_blend_f16_serial(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f32_t const *alpha,
404
+ nk_f32_t const *beta, nk_f16_t *result);
405
+ /** @copydoc nk_each_blend_f64 */
406
+ NK_PUBLIC void nk_each_blend_bf16_serial(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_f32_t const *alpha,
407
+ nk_f32_t const *beta, nk_bf16_t *result);
408
+ /** @copydoc nk_each_blend_f64 */
409
+ NK_PUBLIC void nk_each_blend_i8_serial(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_f32_t const *alpha,
410
+ nk_f32_t const *beta, nk_i8_t *result);
411
+ /** @copydoc nk_each_blend_f64 */
412
+ NK_PUBLIC void nk_each_blend_u8_serial(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_f32_t const *alpha,
413
+ nk_f32_t const *beta, nk_u8_t *result);
414
+ /** @copydoc nk_each_blend_f64 */
415
+ NK_PUBLIC void nk_each_blend_i16_serial(nk_i16_t const *a, nk_i16_t const *b, nk_size_t n, nk_f32_t const *alpha,
416
+ nk_f32_t const *beta, nk_i16_t *result);
417
+ /** @copydoc nk_each_blend_f64 */
418
+ NK_PUBLIC void nk_each_blend_u16_serial(nk_u16_t const *a, nk_u16_t const *b, nk_size_t n, nk_f32_t const *alpha,
419
+ nk_f32_t const *beta, nk_u16_t *result);
420
+ /** @copydoc nk_each_blend_f64 */
421
+ NK_PUBLIC void nk_each_blend_i32_serial(nk_i32_t const *a, nk_i32_t const *b, nk_size_t n, nk_f64_t const *alpha,
422
+ nk_f64_t const *beta, nk_i32_t *result);
423
+ /** @copydoc nk_each_blend_f64 */
424
+ NK_PUBLIC void nk_each_blend_u32_serial(nk_u32_t const *a, nk_u32_t const *b, nk_size_t n, nk_f64_t const *alpha,
425
+ nk_f64_t const *beta, nk_u32_t *result);
426
+ /** @copydoc nk_each_blend_f64 */
427
+ NK_PUBLIC void nk_each_blend_i64_serial(nk_i64_t const *a, nk_i64_t const *b, nk_size_t n, nk_f64_t const *alpha,
428
+ nk_f64_t const *beta, nk_i64_t *result);
429
+ /** @copydoc nk_each_blend_f64 */
430
+ NK_PUBLIC void nk_each_blend_u64_serial(nk_u64_t const *a, nk_u64_t const *b, nk_size_t n, nk_f64_t const *alpha,
431
+ nk_f64_t const *beta, nk_u64_t *result);
432
+
433
+ /** @copydoc nk_each_fma_f64 */
434
+ NK_PUBLIC void nk_each_fma_f64_serial(nk_f64_t const *a, nk_f64_t const *b, nk_f64_t const *c, nk_size_t n,
435
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_f64_t *result);
436
+ /** @copydoc nk_each_fma_f64 */
437
+ NK_PUBLIC void nk_each_fma_f32_serial(nk_f32_t const *a, nk_f32_t const *b, nk_f32_t const *c, nk_size_t n,
438
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_f32_t *result);
439
+ /** @copydoc nk_each_fma_f64 */
440
+ NK_PUBLIC void nk_each_fma_f16_serial(nk_f16_t const *a, nk_f16_t const *b, nk_f16_t const *c, nk_size_t n,
441
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_f16_t *result);
442
+ /** @copydoc nk_each_fma_f64 */
443
+ NK_PUBLIC void nk_each_fma_bf16_serial(nk_bf16_t const *a, nk_bf16_t const *b, nk_bf16_t const *c, nk_size_t n,
444
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_bf16_t *result);
445
+ /** @copydoc nk_each_fma_f64 */
446
+ NK_PUBLIC void nk_each_fma_i8_serial(nk_i8_t const *a, nk_i8_t const *b, nk_i8_t const *c, nk_size_t n,
447
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_i8_t *result);
448
+ /** @copydoc nk_each_fma_f64 */
449
+ NK_PUBLIC void nk_each_fma_u8_serial(nk_u8_t const *a, nk_u8_t const *b, nk_u8_t const *c, nk_size_t n,
450
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_u8_t *result);
451
+ /** @copydoc nk_each_fma_f64 */
452
+ NK_PUBLIC void nk_each_fma_i16_serial(nk_i16_t const *a, nk_i16_t const *b, nk_i16_t const *c, nk_size_t n,
453
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_i16_t *result);
454
+ /** @copydoc nk_each_fma_f64 */
455
+ NK_PUBLIC void nk_each_fma_u16_serial(nk_u16_t const *a, nk_u16_t const *b, nk_u16_t const *c, nk_size_t n,
456
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_u16_t *result);
457
+ /** @copydoc nk_each_fma_f64 */
458
+ NK_PUBLIC void nk_each_fma_i32_serial(nk_i32_t const *a, nk_i32_t const *b, nk_i32_t const *c, nk_size_t n,
459
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_i32_t *result);
460
+ /** @copydoc nk_each_fma_f64 */
461
+ NK_PUBLIC void nk_each_fma_u32_serial(nk_u32_t const *a, nk_u32_t const *b, nk_u32_t const *c, nk_size_t n,
462
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_u32_t *result);
463
+ /** @copydoc nk_each_fma_f64 */
464
+ NK_PUBLIC void nk_each_fma_i64_serial(nk_i64_t const *a, nk_i64_t const *b, nk_i64_t const *c, nk_size_t n,
465
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_i64_t *result);
466
+ /** @copydoc nk_each_fma_f64 */
467
+ NK_PUBLIC void nk_each_fma_u64_serial(nk_u64_t const *a, nk_u64_t const *b, nk_u64_t const *c, nk_size_t n,
468
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_u64_t *result);
469
+
470
+ /** @copydoc nk_each_sum_e4m3 */
471
+ NK_PUBLIC void nk_each_sum_e4m3_serial(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_e4m3_t *result);
472
+ /** @copydoc nk_each_sum_e5m2 */
473
+ NK_PUBLIC void nk_each_sum_e5m2_serial(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_e5m2_t *result);
474
+ /** @copydoc nk_each_scale_e4m3 */
475
+ NK_PUBLIC void nk_each_scale_e4m3_serial(nk_e4m3_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
476
+ nk_e4m3_t *result);
477
+ /** @copydoc nk_each_scale_e5m2 */
478
+ NK_PUBLIC void nk_each_scale_e5m2_serial(nk_e5m2_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
479
+ nk_e5m2_t *result);
480
+ /** @copydoc nk_each_blend_e4m3 */
481
+ NK_PUBLIC void nk_each_blend_e4m3_serial(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_f32_t const *alpha,
482
+ nk_f32_t const *beta, nk_e4m3_t *result);
483
+ /** @copydoc nk_each_blend_e5m2 */
484
+ NK_PUBLIC void nk_each_blend_e5m2_serial(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_f32_t const *alpha,
485
+ nk_f32_t const *beta, nk_e5m2_t *result);
486
+ /** @copydoc nk_each_fma_e4m3 */
487
+ NK_PUBLIC void nk_each_fma_e4m3_serial(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_e4m3_t const *c, nk_size_t n,
488
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_e4m3_t *result);
489
+ /** @copydoc nk_each_fma_e5m2 */
490
+ NK_PUBLIC void nk_each_fma_e5m2_serial(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_e5m2_t const *c, nk_size_t n,
491
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_e5m2_t *result);
492
+
493
+ /** @copydoc nk_each_sum_e2m3 */
494
+ NK_PUBLIC void nk_each_sum_e2m3_serial(nk_e2m3_t const *a, nk_e2m3_t const *b, nk_size_t n, nk_e2m3_t *result);
495
+ /** @copydoc nk_each_sum_e3m2 */
496
+ NK_PUBLIC void nk_each_sum_e3m2_serial(nk_e3m2_t const *a, nk_e3m2_t const *b, nk_size_t n, nk_e3m2_t *result);
497
+ /** @copydoc nk_each_scale_e2m3 */
498
+ NK_PUBLIC void nk_each_scale_e2m3_serial(nk_e2m3_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
499
+ nk_e2m3_t *result);
500
+ /** @copydoc nk_each_scale_e3m2 */
501
+ NK_PUBLIC void nk_each_scale_e3m2_serial(nk_e3m2_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
502
+ nk_e3m2_t *result);
503
+ /** @copydoc nk_each_blend_e2m3 */
504
+ NK_PUBLIC void nk_each_blend_e2m3_serial(nk_e2m3_t const *a, nk_e2m3_t const *b, nk_size_t n, nk_f32_t const *alpha,
505
+ nk_f32_t const *beta, nk_e2m3_t *result);
506
+ /** @copydoc nk_each_blend_e3m2 */
507
+ NK_PUBLIC void nk_each_blend_e3m2_serial(nk_e3m2_t const *a, nk_e3m2_t const *b, nk_size_t n, nk_f32_t const *alpha,
508
+ nk_f32_t const *beta, nk_e3m2_t *result);
509
+ /** @copydoc nk_each_fma_e2m3 */
510
+ NK_PUBLIC void nk_each_fma_e2m3_serial(nk_e2m3_t const *a, nk_e2m3_t const *b, nk_e2m3_t const *c, nk_size_t n,
511
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_e2m3_t *result);
512
+ /** @copydoc nk_each_fma_e3m2 */
513
+ NK_PUBLIC void nk_each_fma_e3m2_serial(nk_e3m2_t const *a, nk_e3m2_t const *b, nk_e3m2_t const *c, nk_size_t n,
514
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_e3m2_t *result);
515
+
516
+ /** @copydoc nk_each_sum_f64 */
517
+ NK_PUBLIC void nk_each_sum_f32c_serial(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f32c_t *result);
518
+ /** @copydoc nk_each_sum_f64 */
519
+ NK_PUBLIC void nk_each_sum_f64c_serial(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t *result);
520
+ /** @copydoc nk_each_scale_f64 */
521
+ NK_PUBLIC void nk_each_scale_f32c_serial(nk_f32c_t const *a, nk_size_t n, nk_f32c_t const *alpha, nk_f32c_t const *beta,
522
+ nk_f32c_t *result);
523
+ /** @copydoc nk_each_scale_f64 */
524
+ NK_PUBLIC void nk_each_scale_f64c_serial(nk_f64c_t const *a, nk_size_t n, nk_f64c_t const *alpha, nk_f64c_t const *beta,
525
+ nk_f64c_t *result);
526
+ /** @copydoc nk_each_blend_f64 */
527
+ NK_PUBLIC void nk_each_blend_f32c_serial(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f32c_t const *alpha,
528
+ nk_f32c_t const *beta, nk_f32c_t *result);
529
+ /** @copydoc nk_each_blend_f64 */
530
+ NK_PUBLIC void nk_each_blend_f64c_serial(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t const *alpha,
531
+ nk_f64c_t const *beta, nk_f64c_t *result);
532
+ /** @copydoc nk_each_fma_f64 */
533
+ NK_PUBLIC void nk_each_fma_f32c_serial(nk_f32c_t const *a, nk_f32c_t const *b, nk_f32c_t const *c, nk_size_t n,
534
+ nk_f32c_t const *alpha, nk_f32c_t const *beta, nk_f32c_t *result);
535
+ /** @copydoc nk_each_fma_f64 */
536
+ NK_PUBLIC void nk_each_fma_f64c_serial(nk_f64c_t const *a, nk_f64c_t const *b, nk_f64c_t const *c, nk_size_t n,
537
+ nk_f64c_t const *alpha, nk_f64c_t const *beta, nk_f64c_t *result);
538
+
539
+ #if NK_TARGET_NEON
540
+ /** @copydoc nk_each_scale_f32 */
541
+ NK_PUBLIC void nk_each_scale_f32_neon(nk_f32_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
542
+ nk_f32_t *result);
543
+ /** @copydoc nk_each_scale_i16 */
544
+ NK_PUBLIC void nk_each_scale_i16_neon(nk_i16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
545
+ nk_i16_t *result);
546
+ /** @copydoc nk_each_scale_u16 */
547
+ NK_PUBLIC void nk_each_scale_u16_neon(nk_u16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
548
+ nk_u16_t *result);
549
+ /** @copydoc nk_each_scale_i32 */
550
+ NK_PUBLIC void nk_each_scale_i32_neon(nk_i32_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
551
+ nk_i32_t *result);
552
+ /** @copydoc nk_each_scale_u32 */
553
+ NK_PUBLIC void nk_each_scale_u32_neon(nk_u32_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
554
+ nk_u32_t *result);
555
+ /** @copydoc nk_each_scale_i64 */
556
+ NK_PUBLIC void nk_each_scale_i64_neon(nk_i64_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
557
+ nk_i64_t *result);
558
+ /** @copydoc nk_each_scale_u64 */
559
+ NK_PUBLIC void nk_each_scale_u64_neon(nk_u64_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
560
+ nk_u64_t *result);
561
+
562
+ /** @copydoc nk_each_sum_f32 */
563
+ NK_PUBLIC void nk_each_sum_f32_neon(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f32_t *result);
564
+ /** @copydoc nk_each_sum_i16 */
565
+ NK_PUBLIC void nk_each_sum_i16_neon(nk_i16_t const *a, nk_i16_t const *b, nk_size_t n, nk_i16_t *result);
566
+ /** @copydoc nk_each_sum_u16 */
567
+ NK_PUBLIC void nk_each_sum_u16_neon(nk_u16_t const *a, nk_u16_t const *b, nk_size_t n, nk_u16_t *result);
568
+ /** @copydoc nk_each_sum_i32 */
569
+ NK_PUBLIC void nk_each_sum_i32_neon(nk_i32_t const *a, nk_i32_t const *b, nk_size_t n, nk_i32_t *result);
570
+ /** @copydoc nk_each_sum_u32 */
571
+ NK_PUBLIC void nk_each_sum_u32_neon(nk_u32_t const *a, nk_u32_t const *b, nk_size_t n, nk_u32_t *result);
572
+ /** @copydoc nk_each_sum_i64 */
573
+ NK_PUBLIC void nk_each_sum_i64_neon(nk_i64_t const *a, nk_i64_t const *b, nk_size_t n, nk_i64_t *result);
574
+ /** @copydoc nk_each_sum_u64 */
575
+ NK_PUBLIC void nk_each_sum_u64_neon(nk_u64_t const *a, nk_u64_t const *b, nk_size_t n, nk_u64_t *result);
576
+
577
+ /** @copydoc nk_each_blend_f32 */
578
+ NK_PUBLIC void nk_each_blend_f32_neon(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f32_t const *alpha,
579
+ nk_f32_t const *beta, nk_f32_t *result);
580
+
581
+ /** @copydoc nk_each_fma_f32 */
582
+ NK_PUBLIC void nk_each_fma_f32_neon(nk_f32_t const *a, nk_f32_t const *b, nk_f32_t const *c, nk_size_t n,
583
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_f32_t *result);
584
+ /** @copydoc nk_each_fma_i16 */
585
+ NK_PUBLIC void nk_each_fma_i16_neon(nk_i16_t const *a, nk_i16_t const *b, nk_i16_t const *c, nk_size_t n,
586
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_i16_t *result);
587
+ /** @copydoc nk_each_fma_u16 */
588
+ NK_PUBLIC void nk_each_fma_u16_neon(nk_u16_t const *a, nk_u16_t const *b, nk_u16_t const *c, nk_size_t n,
589
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_u16_t *result);
590
+ /** @copydoc nk_each_fma_i32 */
591
+ NK_PUBLIC void nk_each_fma_i32_neon(nk_i32_t const *a, nk_i32_t const *b, nk_i32_t const *c, nk_size_t n,
592
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_i32_t *result);
593
+ /** @copydoc nk_each_fma_u32 */
594
+ NK_PUBLIC void nk_each_fma_u32_neon(nk_u32_t const *a, nk_u32_t const *b, nk_u32_t const *c, nk_size_t n,
595
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_u32_t *result);
596
+ /** @copydoc nk_each_fma_i64 */
597
+ NK_PUBLIC void nk_each_fma_i64_neon(nk_i64_t const *a, nk_i64_t const *b, nk_i64_t const *c, nk_size_t n,
598
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_i64_t *result);
599
+ /** @copydoc nk_each_fma_u64 */
600
+ NK_PUBLIC void nk_each_fma_u64_neon(nk_u64_t const *a, nk_u64_t const *b, nk_u64_t const *c, nk_size_t n,
601
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_u64_t *result);
602
+
603
+ /** @copydoc nk_each_sum_f64 */
604
+ NK_PUBLIC void nk_each_sum_f64_neon(nk_f64_t const *a, nk_f64_t const *b, nk_size_t n, nk_f64_t *result);
605
+ /** @copydoc nk_each_scale_f64 */
606
+ NK_PUBLIC void nk_each_scale_f64_neon(nk_f64_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
607
+ nk_f64_t *result);
608
+ /** @copydoc nk_each_blend_f64 */
609
+ NK_PUBLIC void nk_each_blend_f64_neon(nk_f64_t const *a, nk_f64_t const *b, nk_size_t n, nk_f64_t const *alpha,
610
+ nk_f64_t const *beta, nk_f64_t *result);
611
+ /** @copydoc nk_each_fma_f64 */
612
+ NK_PUBLIC void nk_each_fma_f64_neon(nk_f64_t const *a, nk_f64_t const *b, nk_f64_t const *c, nk_size_t n,
613
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_f64_t *result);
614
+
615
+ /** @copydoc nk_each_sum_e4m3 */
616
+ NK_PUBLIC void nk_each_sum_e4m3_neon(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_e4m3_t *result);
617
+ /** @copydoc nk_each_sum_e5m2 */
618
+ NK_PUBLIC void nk_each_sum_e5m2_neon(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_e5m2_t *result);
619
+ /** @copydoc nk_each_scale_e4m3 */
620
+ NK_PUBLIC void nk_each_scale_e4m3_neon(nk_e4m3_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
621
+ nk_e4m3_t *result);
622
+ /** @copydoc nk_each_scale_e5m2 */
623
+ NK_PUBLIC void nk_each_scale_e5m2_neon(nk_e5m2_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
624
+ nk_e5m2_t *result);
625
+ /** @copydoc nk_each_blend_e4m3 */
626
+ NK_PUBLIC void nk_each_blend_e4m3_neon(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_f32_t const *alpha,
627
+ nk_f32_t const *beta, nk_e4m3_t *result);
628
+ /** @copydoc nk_each_blend_e5m2 */
629
+ NK_PUBLIC void nk_each_blend_e5m2_neon(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_f32_t const *alpha,
630
+ nk_f32_t const *beta, nk_e5m2_t *result);
631
+ /** @copydoc nk_each_fma_e4m3 */
632
+ NK_PUBLIC void nk_each_fma_e4m3_neon(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_e4m3_t const *c, nk_size_t n,
633
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_e4m3_t *result);
634
+ /** @copydoc nk_each_fma_e5m2 */
635
+ NK_PUBLIC void nk_each_fma_e5m2_neon(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_e5m2_t const *c, nk_size_t n,
636
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_e5m2_t *result);
637
+
638
+ /** @copydoc nk_each_scale_f64 */
639
+ NK_PUBLIC void nk_each_scale_f32c_neon(nk_f32c_t const *a, nk_size_t n, nk_f32c_t const *alpha, nk_f32c_t const *beta,
640
+ nk_f32c_t *result);
641
+ /** @copydoc nk_each_scale_f64 */
642
+ NK_PUBLIC void nk_each_scale_f64c_neon(nk_f64c_t const *a, nk_size_t n, nk_f64c_t const *alpha, nk_f64c_t const *beta,
643
+ nk_f64c_t *result);
644
+ /** @copydoc nk_each_blend_f64 */
645
+ NK_PUBLIC void nk_each_blend_f32c_neon(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f32c_t const *alpha,
646
+ nk_f32c_t const *beta, nk_f32c_t *result);
647
+ /** @copydoc nk_each_blend_f64 */
648
+ NK_PUBLIC void nk_each_blend_f64c_neon(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t const *alpha,
649
+ nk_f64c_t const *beta, nk_f64c_t *result);
650
+ /** @copydoc nk_each_fma_f64 */
651
+ NK_PUBLIC void nk_each_fma_f32c_neon(nk_f32c_t const *a, nk_f32c_t const *b, nk_f32c_t const *c, nk_size_t n,
652
+ nk_f32c_t const *alpha, nk_f32c_t const *beta, nk_f32c_t *result);
653
+ /** @copydoc nk_each_fma_f64 */
654
+ NK_PUBLIC void nk_each_fma_f64c_neon(nk_f64c_t const *a, nk_f64c_t const *b, nk_f64c_t const *c, nk_size_t n,
655
+ nk_f64c_t const *alpha, nk_f64c_t const *beta, nk_f64c_t *result);
656
+
657
+ /** @copydoc nk_each_sum_i8 */
658
+ NK_PUBLIC void nk_each_sum_i8_neon(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_i8_t *result);
659
+ /** @copydoc nk_each_sum_u8 */
660
+ NK_PUBLIC void nk_each_sum_u8_neon(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_u8_t *result);
661
+ #endif // NK_TARGET_NEON
662
+
663
+ #if NK_TARGET_NEONBFDOT
664
+ /** @copydoc nk_each_sum_bf16 */
665
+ NK_PUBLIC void nk_each_sum_bf16_neonbfdot(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_bf16_t *result);
666
+ /** @copydoc nk_each_scale_bf16 */
667
+ NK_PUBLIC void nk_each_scale_bf16_neonbfdot(nk_bf16_t const *a, nk_size_t n, nk_f32_t const *alpha,
668
+ nk_f32_t const *beta, nk_bf16_t *result);
669
+ /** @copydoc nk_each_blend_bf16 */
670
+ NK_PUBLIC void nk_each_blend_bf16_neonbfdot(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_f32_t const *alpha,
671
+ nk_f32_t const *beta, nk_bf16_t *result);
672
+ /** @copydoc nk_each_fma_bf16 */
673
+ NK_PUBLIC void nk_each_fma_bf16_neonbfdot(nk_bf16_t const *a, nk_bf16_t const *b, nk_bf16_t const *c, nk_size_t n,
674
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_bf16_t *result);
675
+ #endif // NK_TARGET_NEONBFDOT
676
+
677
+ #if NK_TARGET_NEONHALF
678
+ /** @copydoc nk_each_sum_f16 */
679
+ NK_PUBLIC void nk_each_sum_f16_neonhalf(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f16_t *result);
680
+ /** @copydoc nk_each_scale_f16 */
681
+ NK_PUBLIC void nk_each_scale_f16_neonhalf(nk_f16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
682
+ nk_f16_t *result);
683
+ /** @copydoc nk_each_blend_f16 */
684
+ NK_PUBLIC void nk_each_blend_f16_neonhalf(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f32_t const *alpha,
685
+ nk_f32_t const *beta, nk_f16_t *result);
686
+ /** @copydoc nk_each_fma_f16 */
687
+ NK_PUBLIC void nk_each_fma_f16_neonhalf(nk_f16_t const *a, nk_f16_t const *b, nk_f16_t const *c, nk_size_t n,
688
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_f16_t *result);
689
+
690
+ /** @copydoc nk_each_scale_i8 */
691
+ NK_PUBLIC void nk_each_scale_i8_neonhalf(nk_i8_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
692
+ nk_i8_t *result);
693
+ /** @copydoc nk_each_scale_u8 */
694
+ NK_PUBLIC void nk_each_scale_u8_neonhalf(nk_u8_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
695
+ nk_u8_t *result);
696
+ /** @copydoc nk_each_blend_i8 */
697
+ NK_PUBLIC void nk_each_blend_i8_neonhalf(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_f32_t const *alpha,
698
+ nk_f32_t const *beta, nk_i8_t *result);
699
+ /** @copydoc nk_each_blend_u8 */
700
+ NK_PUBLIC void nk_each_blend_u8_neonhalf(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_f32_t const *alpha,
701
+ nk_f32_t const *beta, nk_u8_t *result);
702
+ #endif // NK_TARGET_NEONHALF
703
+
704
+ #if NK_TARGET_V128RELAXED
705
+ /** @copydoc nk_each_sum_f32 */
706
+ NK_PUBLIC void nk_each_sum_f32_v128relaxed(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f32_t *result);
707
+ /** @copydoc nk_each_scale_f32 */
708
+ NK_PUBLIC void nk_each_scale_f32_v128relaxed(nk_f32_t const *a, nk_size_t n, nk_f32_t const *alpha,
709
+ nk_f32_t const *beta, nk_f32_t *result);
710
+ /** @copydoc nk_each_blend_f32 */
711
+ NK_PUBLIC void nk_each_blend_f32_v128relaxed(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f32_t const *alpha,
712
+ nk_f32_t const *beta, nk_f32_t *result);
713
+ /** @copydoc nk_each_fma_f32 */
714
+ NK_PUBLIC void nk_each_fma_f32_v128relaxed(nk_f32_t const *a, nk_f32_t const *b, nk_f32_t const *c, nk_size_t n,
715
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_f32_t *result);
716
+ /** @copydoc nk_each_sum_f16 */
717
+ NK_PUBLIC void nk_each_sum_f16_v128relaxed(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f16_t *result);
718
+ /** @copydoc nk_each_scale_f16 */
719
+ NK_PUBLIC void nk_each_scale_f16_v128relaxed(nk_f16_t const *a, nk_size_t n, nk_f32_t const *alpha,
720
+ nk_f32_t const *beta, nk_f16_t *result);
721
+ /** @copydoc nk_each_blend_f16 */
722
+ NK_PUBLIC void nk_each_blend_f16_v128relaxed(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f32_t const *alpha,
723
+ nk_f32_t const *beta, nk_f16_t *result);
724
+ /** @copydoc nk_each_fma_f16 */
725
+ NK_PUBLIC void nk_each_fma_f16_v128relaxed(nk_f16_t const *a, nk_f16_t const *b, nk_f16_t const *c, nk_size_t n,
726
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_f16_t *result);
727
+ /** @copydoc nk_each_sum_bf16 */
728
+ NK_PUBLIC void nk_each_sum_bf16_v128relaxed(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_bf16_t *result);
729
+ /** @copydoc nk_each_scale_bf16 */
730
+ NK_PUBLIC void nk_each_scale_bf16_v128relaxed(nk_bf16_t const *a, nk_size_t n, nk_f32_t const *alpha,
731
+ nk_f32_t const *beta, nk_bf16_t *result);
732
+ /** @copydoc nk_each_blend_bf16 */
733
+ NK_PUBLIC void nk_each_blend_bf16_v128relaxed(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n,
734
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_bf16_t *result);
735
+ /** @copydoc nk_each_fma_bf16 */
736
+ NK_PUBLIC void nk_each_fma_bf16_v128relaxed(nk_bf16_t const *a, nk_bf16_t const *b, nk_bf16_t const *c, nk_size_t n,
737
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_bf16_t *result);
738
+ /** @copydoc nk_each_sum_i8 */
739
+ NK_PUBLIC void nk_each_sum_i8_v128relaxed(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_i8_t *result);
740
+ /** @copydoc nk_each_scale_i8 */
741
+ NK_PUBLIC void nk_each_scale_i8_v128relaxed(nk_i8_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
742
+ nk_i8_t *result);
743
+ /** @copydoc nk_each_blend_i8 */
744
+ NK_PUBLIC void nk_each_blend_i8_v128relaxed(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_f32_t const *alpha,
745
+ nk_f32_t const *beta, nk_i8_t *result);
746
+ /** @copydoc nk_each_fma_i8 */
747
+ NK_PUBLIC void nk_each_fma_i8_v128relaxed(nk_i8_t const *a, nk_i8_t const *b, nk_i8_t const *c, nk_size_t n,
748
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_i8_t *result);
749
+ /** @copydoc nk_each_sum_u8 */
750
+ NK_PUBLIC void nk_each_sum_u8_v128relaxed(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_u8_t *result);
751
+ /** @copydoc nk_each_scale_u8 */
752
+ NK_PUBLIC void nk_each_scale_u8_v128relaxed(nk_u8_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
753
+ nk_u8_t *result);
754
+ /** @copydoc nk_each_blend_u8 */
755
+ NK_PUBLIC void nk_each_blend_u8_v128relaxed(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_f32_t const *alpha,
756
+ nk_f32_t const *beta, nk_u8_t *result);
757
+ /** @copydoc nk_each_fma_u8 */
758
+ NK_PUBLIC void nk_each_fma_u8_v128relaxed(nk_u8_t const *a, nk_u8_t const *b, nk_u8_t const *c, nk_size_t n,
759
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_u8_t *result);
760
+ #endif // NK_TARGET_V128RELAXED
761
+
762
+ #if NK_TARGET_HASWELL
763
+ /** @copydoc nk_each_scale_f64 */
764
+ NK_PUBLIC void nk_each_scale_f64_haswell(nk_f64_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
765
+ nk_f64_t *result);
766
+ /** @copydoc nk_each_scale_f32 */
767
+ NK_PUBLIC void nk_each_scale_f32_haswell(nk_f32_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
768
+ nk_f32_t *result);
769
+ /** @copydoc nk_each_scale_f16 */
770
+ NK_PUBLIC void nk_each_scale_f16_haswell(nk_f16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
771
+ nk_f16_t *result);
772
+ /** @copydoc nk_each_scale_bf16 */
773
+ NK_PUBLIC void nk_each_scale_bf16_haswell(nk_bf16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
774
+ nk_bf16_t *result);
775
+ /** @copydoc nk_each_scale_i8 */
776
+ NK_PUBLIC void nk_each_scale_i8_haswell(nk_i8_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
777
+ nk_i8_t *result);
778
+ /** @copydoc nk_each_scale_u8 */
779
+ NK_PUBLIC void nk_each_scale_u8_haswell(nk_u8_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
780
+ nk_u8_t *result);
781
+ /** @copydoc nk_each_scale_i16 */
782
+ NK_PUBLIC void nk_each_scale_i16_haswell(nk_i16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
783
+ nk_i16_t *result);
784
+ /** @copydoc nk_each_scale_u16 */
785
+ NK_PUBLIC void nk_each_scale_u16_haswell(nk_u16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
786
+ nk_u16_t *result);
787
+ /** @copydoc nk_each_scale_i32 */
788
+ NK_PUBLIC void nk_each_scale_i32_haswell(nk_i32_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
789
+ nk_i32_t *result);
790
+ /** @copydoc nk_each_scale_u32 */
791
+ NK_PUBLIC void nk_each_scale_u32_haswell(nk_u32_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
792
+ nk_u32_t *result);
793
+
794
+ /** @copydoc nk_each_sum_f64 */
795
+ NK_PUBLIC void nk_each_sum_f64_haswell(nk_f64_t const *a, nk_f64_t const *b, nk_size_t n, nk_f64_t *result);
796
+ /** @copydoc nk_each_sum_f32 */
797
+ NK_PUBLIC void nk_each_sum_f32_haswell(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f32_t *result);
798
+ /** @copydoc nk_each_sum_f16 */
799
+ NK_PUBLIC void nk_each_sum_f16_haswell(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f16_t *result);
800
+ /** @copydoc nk_each_sum_bf16 */
801
+ NK_PUBLIC void nk_each_sum_bf16_haswell(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_bf16_t *result);
802
+ /** @copydoc nk_each_sum_i8 */
803
+ NK_PUBLIC void nk_each_sum_i8_haswell(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_i8_t *result);
804
+ /** @copydoc nk_each_sum_u8 */
805
+ NK_PUBLIC void nk_each_sum_u8_haswell(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_u8_t *result);
806
+ /** @copydoc nk_each_sum_i16 */
807
+ NK_PUBLIC void nk_each_sum_i16_haswell(nk_i16_t const *a, nk_i16_t const *b, nk_size_t n, nk_i16_t *result);
808
+ /** @copydoc nk_each_sum_u16 */
809
+ NK_PUBLIC void nk_each_sum_u16_haswell(nk_u16_t const *a, nk_u16_t const *b, nk_size_t n, nk_u16_t *result);
810
+ /** @copydoc nk_each_sum_i32 */
811
+ NK_PUBLIC void nk_each_sum_i32_haswell(nk_i32_t const *a, nk_i32_t const *b, nk_size_t n, nk_i32_t *result);
812
+ /** @copydoc nk_each_sum_u32 */
813
+ NK_PUBLIC void nk_each_sum_u32_haswell(nk_u32_t const *a, nk_u32_t const *b, nk_size_t n, nk_u32_t *result);
814
+
815
+ /** @copydoc nk_each_blend_f64 */
816
+ NK_PUBLIC void nk_each_blend_f64_haswell(nk_f64_t const *a, nk_f64_t const *b, nk_size_t n, nk_f64_t const *alpha,
817
+ nk_f64_t const *beta, nk_f64_t *result);
818
+ /** @copydoc nk_each_blend_f32 */
819
+ NK_PUBLIC void nk_each_blend_f32_haswell(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f32_t const *alpha,
820
+ nk_f32_t const *beta, nk_f32_t *result);
821
+ /** @copydoc nk_each_blend_f16 */
822
+ NK_PUBLIC void nk_each_blend_f16_haswell(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f32_t const *alpha,
823
+ nk_f32_t const *beta, nk_f16_t *result);
824
+ /** @copydoc nk_each_blend_bf16 */
825
+ NK_PUBLIC void nk_each_blend_bf16_haswell(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_f32_t const *alpha,
826
+ nk_f32_t const *beta, nk_bf16_t *result);
827
+ /** @copydoc nk_each_blend_i8 */
828
+ NK_PUBLIC void nk_each_blend_i8_haswell(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_f32_t const *alpha,
829
+ nk_f32_t const *beta, nk_i8_t *result);
830
+ /** @copydoc nk_each_blend_u8 */
831
+ NK_PUBLIC void nk_each_blend_u8_haswell(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_f32_t const *alpha,
832
+ nk_f32_t const *beta, nk_u8_t *result);
833
+
834
+ /** @copydoc nk_each_fma_f64 */
835
+ NK_PUBLIC void nk_each_fma_f64_haswell(nk_f64_t const *a, nk_f64_t const *b, nk_f64_t const *c, nk_size_t n,
836
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_f64_t *result);
837
+ /** @copydoc nk_each_fma_f32 */
838
+ NK_PUBLIC void nk_each_fma_f32_haswell(nk_f32_t const *a, nk_f32_t const *b, nk_f32_t const *c, nk_size_t n,
839
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_f32_t *result);
840
+ /** @copydoc nk_each_fma_f16 */
841
+ NK_PUBLIC void nk_each_fma_f16_haswell(nk_f16_t const *a, nk_f16_t const *b, nk_f16_t const *c, nk_size_t n,
842
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_f16_t *result);
843
+ /** @copydoc nk_each_fma_bf16 */
844
+ NK_PUBLIC void nk_each_fma_bf16_haswell(nk_bf16_t const *a, nk_bf16_t const *b, nk_bf16_t const *c, nk_size_t n,
845
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_bf16_t *result);
846
+ /** @copydoc nk_each_fma_i8 */
847
+ NK_PUBLIC void nk_each_fma_i8_haswell(nk_i8_t const *a, nk_i8_t const *b, nk_i8_t const *c, nk_size_t n,
848
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_i8_t *result);
849
+ /** @copydoc nk_each_fma_u8 */
850
+ NK_PUBLIC void nk_each_fma_u8_haswell(nk_u8_t const *a, nk_u8_t const *b, nk_u8_t const *c, nk_size_t n,
851
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_u8_t *result);
852
+ /** @copydoc nk_each_fma_i16 */
853
+ NK_PUBLIC void nk_each_fma_i16_haswell(nk_i16_t const *a, nk_i16_t const *b, nk_i16_t const *c, nk_size_t n,
854
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_i16_t *result);
855
+ /** @copydoc nk_each_fma_u16 */
856
+ NK_PUBLIC void nk_each_fma_u16_haswell(nk_u16_t const *a, nk_u16_t const *b, nk_u16_t const *c, nk_size_t n,
857
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_u16_t *result);
858
+ /** @copydoc nk_each_fma_i32 */
859
+ NK_PUBLIC void nk_each_fma_i32_haswell(nk_i32_t const *a, nk_i32_t const *b, nk_i32_t const *c, nk_size_t n,
860
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_i32_t *result);
861
+ /** @copydoc nk_each_fma_u32 */
862
+ NK_PUBLIC void nk_each_fma_u32_haswell(nk_u32_t const *a, nk_u32_t const *b, nk_u32_t const *c, nk_size_t n,
863
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_u32_t *result);
864
+
865
+ /** @copydoc nk_each_sum_e4m3 */
866
+ NK_PUBLIC void nk_each_sum_e4m3_haswell(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_e4m3_t *result);
867
+ /** @copydoc nk_each_sum_e5m2 */
868
+ NK_PUBLIC void nk_each_sum_e5m2_haswell(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_e5m2_t *result);
869
+ /** @copydoc nk_each_scale_e4m3 */
870
+ NK_PUBLIC void nk_each_scale_e4m3_haswell(nk_e4m3_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
871
+ nk_e4m3_t *result);
872
+ /** @copydoc nk_each_scale_e5m2 */
873
+ NK_PUBLIC void nk_each_scale_e5m2_haswell(nk_e5m2_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
874
+ nk_e5m2_t *result);
875
+ /** @copydoc nk_each_blend_e4m3 */
876
+ NK_PUBLIC void nk_each_blend_e4m3_haswell(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_f32_t const *alpha,
877
+ nk_f32_t const *beta, nk_e4m3_t *result);
878
+ /** @copydoc nk_each_blend_e5m2 */
879
+ NK_PUBLIC void nk_each_blend_e5m2_haswell(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_f32_t const *alpha,
880
+ nk_f32_t const *beta, nk_e5m2_t *result);
881
+ /** @copydoc nk_each_fma_e4m3 */
882
+ NK_PUBLIC void nk_each_fma_e4m3_haswell(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_e4m3_t const *c, nk_size_t n,
883
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_e4m3_t *result);
884
+ /** @copydoc nk_each_fma_e5m2 */
885
+ NK_PUBLIC void nk_each_fma_e5m2_haswell(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_e5m2_t const *c, nk_size_t n,
886
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_e5m2_t *result);
887
+
888
+ /** @copydoc nk_each_scale_f64 */
889
+ NK_PUBLIC void nk_each_scale_f32c_haswell(nk_f32c_t const *a, nk_size_t n, nk_f32c_t const *alpha,
890
+ nk_f32c_t const *beta, nk_f32c_t *result);
891
+ /** @copydoc nk_each_scale_f64 */
892
+ NK_PUBLIC void nk_each_scale_f64c_haswell(nk_f64c_t const *a, nk_size_t n, nk_f64c_t const *alpha,
893
+ nk_f64c_t const *beta, nk_f64c_t *result);
894
+ /** @copydoc nk_each_blend_f64 */
895
+ NK_PUBLIC void nk_each_blend_f32c_haswell(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f32c_t const *alpha,
896
+ nk_f32c_t const *beta, nk_f32c_t *result);
897
+ /** @copydoc nk_each_blend_f64 */
898
+ NK_PUBLIC void nk_each_blend_f64c_haswell(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t const *alpha,
899
+ nk_f64c_t const *beta, nk_f64c_t *result);
900
+ /** @copydoc nk_each_fma_f64 */
901
+ NK_PUBLIC void nk_each_fma_f32c_haswell(nk_f32c_t const *a, nk_f32c_t const *b, nk_f32c_t const *c, nk_size_t n,
902
+ nk_f32c_t const *alpha, nk_f32c_t const *beta, nk_f32c_t *result);
903
+ /** @copydoc nk_each_fma_f64 */
904
+ NK_PUBLIC void nk_each_fma_f64c_haswell(nk_f64c_t const *a, nk_f64c_t const *b, nk_f64c_t const *c, nk_size_t n,
905
+ nk_f64c_t const *alpha, nk_f64c_t const *beta, nk_f64c_t *result);
906
+ #endif // NK_TARGET_HASWELL
907
+
908
+ #if NK_TARGET_SKYLAKE
909
+ /** @copydoc nk_each_scale_f64 */
910
+ NK_PUBLIC void nk_each_scale_f64_skylake(nk_f64_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
911
+ nk_f64_t *result);
912
+ /** @copydoc nk_each_scale_f32 */
913
+ NK_PUBLIC void nk_each_scale_f32_skylake(nk_f32_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
914
+ nk_f32_t *result);
915
+ /** @copydoc nk_each_scale_f16 */
916
+ NK_PUBLIC void nk_each_scale_f16_skylake(nk_f16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
917
+ nk_f16_t *result);
918
+ /** @copydoc nk_each_scale_bf16 */
919
+ NK_PUBLIC void nk_each_scale_bf16_skylake(nk_bf16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
920
+ nk_bf16_t *result);
921
+ /** @copydoc nk_each_scale_i8 */
922
+ NK_PUBLIC void nk_each_scale_i8_skylake(nk_i8_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
923
+ nk_i8_t *result);
924
+ /** @copydoc nk_each_scale_u8 */
925
+ NK_PUBLIC void nk_each_scale_u8_skylake(nk_u8_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
926
+ nk_u8_t *result);
927
+ /** @copydoc nk_each_scale_i16 */
928
+ NK_PUBLIC void nk_each_scale_i16_skylake(nk_i16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
929
+ nk_i16_t *result);
930
+ /** @copydoc nk_each_scale_u16 */
931
+ NK_PUBLIC void nk_each_scale_u16_skylake(nk_u16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
932
+ nk_u16_t *result);
933
+ /** @copydoc nk_each_scale_i32 */
934
+ NK_PUBLIC void nk_each_scale_i32_skylake(nk_i32_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
935
+ nk_i32_t *result);
936
+ /** @copydoc nk_each_scale_u32 */
937
+ NK_PUBLIC void nk_each_scale_u32_skylake(nk_u32_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
938
+ nk_u32_t *result);
939
+ /** @copydoc nk_each_scale_i64 */
940
+ NK_PUBLIC void nk_each_scale_i64_skylake(nk_i64_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
941
+ nk_i64_t *result);
942
+ /** @copydoc nk_each_scale_u64 */
943
+ NK_PUBLIC void nk_each_scale_u64_skylake(nk_u64_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
944
+ nk_u64_t *result);
945
+
946
+ /** @copydoc nk_each_sum_f64 */
947
+ NK_PUBLIC void nk_each_sum_f64_skylake(nk_f64_t const *a, nk_f64_t const *b, nk_size_t n, nk_f64_t *result);
948
+ /** @copydoc nk_each_sum_f32 */
949
+ NK_PUBLIC void nk_each_sum_f32_skylake(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f32_t *result);
950
+ /** @copydoc nk_each_sum_bf16 */
951
+ NK_PUBLIC void nk_each_sum_bf16_skylake(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_bf16_t *result);
952
+
953
+ /** @copydoc nk_each_blend_f64 */
954
+ NK_PUBLIC void nk_each_blend_f64_skylake(nk_f64_t const *a, nk_f64_t const *b, nk_size_t n, nk_f64_t const *alpha,
955
+ nk_f64_t const *beta, nk_f64_t *result);
956
+ /** @copydoc nk_each_blend_f32 */
957
+ NK_PUBLIC void nk_each_blend_f32_skylake(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f32_t const *alpha,
958
+ nk_f32_t const *beta, nk_f32_t *result);
959
+ /** @copydoc nk_each_blend_f16 */
960
+ NK_PUBLIC void nk_each_blend_f16_skylake(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f32_t const *alpha,
961
+ nk_f32_t const *beta, nk_f16_t *result);
962
+ /** @copydoc nk_each_blend_bf16 */
963
+ NK_PUBLIC void nk_each_blend_bf16_skylake(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_f32_t const *alpha,
964
+ nk_f32_t const *beta, nk_bf16_t *result);
965
+
966
+ /** @copydoc nk_each_fma_f64 */
967
+ NK_PUBLIC void nk_each_fma_f64_skylake(nk_f64_t const *a, nk_f64_t const *b, nk_f64_t const *c, nk_size_t n,
968
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_f64_t *result);
969
+ /** @copydoc nk_each_fma_f32 */
970
+ NK_PUBLIC void nk_each_fma_f32_skylake(nk_f32_t const *a, nk_f32_t const *b, nk_f32_t const *c, nk_size_t n,
971
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_f32_t *result);
972
+ /** @copydoc nk_each_fma_f16 */
973
+ NK_PUBLIC void nk_each_fma_f16_skylake(nk_f16_t const *a, nk_f16_t const *b, nk_f16_t const *c, nk_size_t n,
974
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_f16_t *result);
975
+ /** @copydoc nk_each_fma_bf16 */
976
+ NK_PUBLIC void nk_each_fma_bf16_skylake(nk_bf16_t const *a, nk_bf16_t const *b, nk_bf16_t const *c, nk_size_t n,
977
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_bf16_t *result);
978
+ /** @copydoc nk_each_fma_i8 */
979
+ NK_PUBLIC void nk_each_fma_i8_skylake(nk_i8_t const *a, nk_i8_t const *b, nk_i8_t const *c, nk_size_t n,
980
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_i8_t *result);
981
+ /** @copydoc nk_each_fma_u8 */
982
+ NK_PUBLIC void nk_each_fma_u8_skylake(nk_u8_t const *a, nk_u8_t const *b, nk_u8_t const *c, nk_size_t n,
983
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_u8_t *result);
984
+ /** @copydoc nk_each_fma_i16 */
985
+ NK_PUBLIC void nk_each_fma_i16_skylake(nk_i16_t const *a, nk_i16_t const *b, nk_i16_t const *c, nk_size_t n,
986
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_i16_t *result);
987
+ /** @copydoc nk_each_fma_u16 */
988
+ NK_PUBLIC void nk_each_fma_u16_skylake(nk_u16_t const *a, nk_u16_t const *b, nk_u16_t const *c, nk_size_t n,
989
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_u16_t *result);
990
+ /** @copydoc nk_each_fma_i32 */
991
+ NK_PUBLIC void nk_each_fma_i32_skylake(nk_i32_t const *a, nk_i32_t const *b, nk_i32_t const *c, nk_size_t n,
992
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_i32_t *result);
993
+ /** @copydoc nk_each_fma_u32 */
994
+ NK_PUBLIC void nk_each_fma_u32_skylake(nk_u32_t const *a, nk_u32_t const *b, nk_u32_t const *c, nk_size_t n,
995
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_u32_t *result);
996
+ /** @copydoc nk_each_fma_i64 */
997
+ NK_PUBLIC void nk_each_fma_i64_skylake(nk_i64_t const *a, nk_i64_t const *b, nk_i64_t const *c, nk_size_t n,
998
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_i64_t *result);
999
+ /** @copydoc nk_each_fma_u64 */
1000
+ NK_PUBLIC void nk_each_fma_u64_skylake(nk_u64_t const *a, nk_u64_t const *b, nk_u64_t const *c, nk_size_t n,
1001
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_u64_t *result);
1002
+ /** @copydoc nk_each_sum_e4m3 */
1003
+ NK_PUBLIC void nk_each_sum_e4m3_skylake(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_e4m3_t *result);
1004
+ /** @copydoc nk_each_sum_e5m2 */
1005
+ NK_PUBLIC void nk_each_sum_e5m2_skylake(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_e5m2_t *result);
1006
+ /** @copydoc nk_each_scale_e4m3 */
1007
+ NK_PUBLIC void nk_each_scale_e4m3_skylake(nk_e4m3_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
1008
+ nk_e4m3_t *result);
1009
+ /** @copydoc nk_each_scale_e5m2 */
1010
+ NK_PUBLIC void nk_each_scale_e5m2_skylake(nk_e5m2_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
1011
+ nk_e5m2_t *result);
1012
+ /** @copydoc nk_each_blend_e4m3 */
1013
+ NK_PUBLIC void nk_each_blend_e4m3_skylake(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_f32_t const *alpha,
1014
+ nk_f32_t const *beta, nk_e4m3_t *result);
1015
+ /** @copydoc nk_each_blend_e5m2 */
1016
+ NK_PUBLIC void nk_each_blend_e5m2_skylake(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_f32_t const *alpha,
1017
+ nk_f32_t const *beta, nk_e5m2_t *result);
1018
+ /** @copydoc nk_each_fma_e4m3 */
1019
+ NK_PUBLIC void nk_each_fma_e4m3_skylake(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_e4m3_t const *c, nk_size_t n,
1020
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_e4m3_t *result);
1021
+ /** @copydoc nk_each_fma_e5m2 */
1022
+ NK_PUBLIC void nk_each_fma_e5m2_skylake(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_e5m2_t const *c, nk_size_t n,
1023
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_e5m2_t *result);
1024
+
1025
+ /** @copydoc nk_each_scale_f64 */
1026
+ NK_PUBLIC void nk_each_scale_f32c_skylake(nk_f32c_t const *a, nk_size_t n, nk_f32c_t const *alpha,
1027
+ nk_f32c_t const *beta, nk_f32c_t *result);
1028
+ /** @copydoc nk_each_scale_f64 */
1029
+ NK_PUBLIC void nk_each_scale_f64c_skylake(nk_f64c_t const *a, nk_size_t n, nk_f64c_t const *alpha,
1030
+ nk_f64c_t const *beta, nk_f64c_t *result);
1031
+ /** @copydoc nk_each_blend_f64 */
1032
+ NK_PUBLIC void nk_each_blend_f32c_skylake(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f32c_t const *alpha,
1033
+ nk_f32c_t const *beta, nk_f32c_t *result);
1034
+ /** @copydoc nk_each_blend_f64 */
1035
+ NK_PUBLIC void nk_each_blend_f64c_skylake(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t const *alpha,
1036
+ nk_f64c_t const *beta, nk_f64c_t *result);
1037
+ /** @copydoc nk_each_fma_f64 */
1038
+ NK_PUBLIC void nk_each_fma_f32c_skylake(nk_f32c_t const *a, nk_f32c_t const *b, nk_f32c_t const *c, nk_size_t n,
1039
+ nk_f32c_t const *alpha, nk_f32c_t const *beta, nk_f32c_t *result);
1040
+ /** @copydoc nk_each_fma_f64 */
1041
+ NK_PUBLIC void nk_each_fma_f64c_skylake(nk_f64c_t const *a, nk_f64c_t const *b, nk_f64c_t const *c, nk_size_t n,
1042
+ nk_f64c_t const *alpha, nk_f64c_t const *beta, nk_f64c_t *result);
1043
+ #endif // NK_TARGET_SKYLAKE
1044
+
1045
+ #if NK_TARGET_ICELAKE
1046
+ /** @copydoc nk_each_sum_i8 */
1047
+ NK_PUBLIC void nk_each_sum_i8_icelake(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_i8_t *result);
1048
+ /** @copydoc nk_each_sum_u8 */
1049
+ NK_PUBLIC void nk_each_sum_u8_icelake(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_u8_t *result);
1050
+ /** @copydoc nk_each_sum_i16 */
1051
+ NK_PUBLIC void nk_each_sum_i16_icelake(nk_i16_t const *a, nk_i16_t const *b, nk_size_t n, nk_i16_t *result);
1052
+ /** @copydoc nk_each_sum_u16 */
1053
+ NK_PUBLIC void nk_each_sum_u16_icelake(nk_u16_t const *a, nk_u16_t const *b, nk_size_t n, nk_u16_t *result);
1054
+ /** @copydoc nk_each_sum_i32 */
1055
+ NK_PUBLIC void nk_each_sum_i32_icelake(nk_i32_t const *a, nk_i32_t const *b, nk_size_t n, nk_i32_t *result);
1056
+ /** @copydoc nk_each_sum_u32 */
1057
+ NK_PUBLIC void nk_each_sum_u32_icelake(nk_u32_t const *a, nk_u32_t const *b, nk_size_t n, nk_u32_t *result);
1058
+ /** @copydoc nk_each_sum_i64 */
1059
+ NK_PUBLIC void nk_each_sum_i64_icelake(nk_i64_t const *a, nk_i64_t const *b, nk_size_t n, nk_i64_t *result);
1060
+ /** @copydoc nk_each_sum_u64 */
1061
+ NK_PUBLIC void nk_each_sum_u64_icelake(nk_u64_t const *a, nk_u64_t const *b, nk_size_t n, nk_u64_t *result);
1062
+ #endif // NK_TARGET_ICELAKE
1063
+
1064
+ #if NK_TARGET_SAPPHIRE
1065
+ /** @copydoc nk_each_scale_i8 */
1066
+ NK_PUBLIC void nk_each_scale_i8_sapphire(nk_i8_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
1067
+ nk_i8_t *result);
1068
+ /** @copydoc nk_each_scale_u8 */
1069
+ NK_PUBLIC void nk_each_scale_u8_sapphire(nk_u8_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
1070
+ nk_u8_t *result);
1071
+
1072
+ /** @copydoc nk_each_sum_f16 */
1073
+ NK_PUBLIC void nk_each_sum_f16_sapphire(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f16_t *result);
1074
+ /** @copydoc nk_each_sum_e4m3 */
1075
+ NK_PUBLIC void nk_each_sum_e4m3_sapphire(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_e4m3_t *result);
1076
+
1077
+ /** @copydoc nk_each_blend_i8 */
1078
+ NK_PUBLIC void nk_each_blend_i8_sapphire(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_f32_t const *alpha,
1079
+ nk_f32_t const *beta, nk_i8_t *result);
1080
+ /** @copydoc nk_each_blend_u8 */
1081
+ NK_PUBLIC void nk_each_blend_u8_sapphire(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_f32_t const *alpha,
1082
+ nk_f32_t const *beta, nk_u8_t *result);
1083
+
1084
+ #endif // NK_TARGET_SAPPHIRE
1085
+
1086
+ #if NK_TARGET_RVV
1087
+ /** @copydoc nk_each_sum_f64 */
1088
+ NK_PUBLIC void nk_each_sum_f64_rvv(nk_f64_t const *a, nk_f64_t const *b, nk_size_t n, nk_f64_t *result);
1089
+ /** @copydoc nk_each_sum_f32 */
1090
+ NK_PUBLIC void nk_each_sum_f32_rvv(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f32_t *result);
1091
+ /** @copydoc nk_each_sum_f16 */
1092
+ NK_PUBLIC void nk_each_sum_f16_rvv(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f16_t *result);
1093
+ /** @copydoc nk_each_sum_bf16 */
1094
+ NK_PUBLIC void nk_each_sum_bf16_rvv(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_bf16_t *result);
1095
+ /** @copydoc nk_each_sum_i8 */
1096
+ NK_PUBLIC void nk_each_sum_i8_rvv(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_i8_t *result);
1097
+ /** @copydoc nk_each_sum_u8 */
1098
+ NK_PUBLIC void nk_each_sum_u8_rvv(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_u8_t *result);
1099
+ /** @copydoc nk_each_sum_i16 */
1100
+ NK_PUBLIC void nk_each_sum_i16_rvv(nk_i16_t const *a, nk_i16_t const *b, nk_size_t n, nk_i16_t *result);
1101
+ /** @copydoc nk_each_sum_u16 */
1102
+ NK_PUBLIC void nk_each_sum_u16_rvv(nk_u16_t const *a, nk_u16_t const *b, nk_size_t n, nk_u16_t *result);
1103
+ /** @copydoc nk_each_sum_i32 */
1104
+ NK_PUBLIC void nk_each_sum_i32_rvv(nk_i32_t const *a, nk_i32_t const *b, nk_size_t n, nk_i32_t *result);
1105
+ /** @copydoc nk_each_sum_u32 */
1106
+ NK_PUBLIC void nk_each_sum_u32_rvv(nk_u32_t const *a, nk_u32_t const *b, nk_size_t n, nk_u32_t *result);
1107
+ /** @copydoc nk_each_sum_i64 */
1108
+ NK_PUBLIC void nk_each_sum_i64_rvv(nk_i64_t const *a, nk_i64_t const *b, nk_size_t n, nk_i64_t *result);
1109
+ /** @copydoc nk_each_sum_u64 */
1110
+ NK_PUBLIC void nk_each_sum_u64_rvv(nk_u64_t const *a, nk_u64_t const *b, nk_size_t n, nk_u64_t *result);
1111
+ /** @copydoc nk_each_sum_e4m3 */
1112
+ NK_PUBLIC void nk_each_sum_e4m3_rvv(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_e4m3_t *result);
1113
+ /** @copydoc nk_each_sum_e5m2 */
1114
+ NK_PUBLIC void nk_each_sum_e5m2_rvv(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_e5m2_t *result);
1115
+
1116
+ /** @copydoc nk_each_scale_f64 */
1117
+ NK_PUBLIC void nk_each_scale_f64_rvv(nk_f64_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
1118
+ nk_f64_t *result);
1119
+ /** @copydoc nk_each_scale_f32 */
1120
+ NK_PUBLIC void nk_each_scale_f32_rvv(nk_f32_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
1121
+ nk_f32_t *result);
1122
+ /** @copydoc nk_each_scale_f16 */
1123
+ NK_PUBLIC void nk_each_scale_f16_rvv(nk_f16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
1124
+ nk_f16_t *result);
1125
+ /** @copydoc nk_each_scale_bf16 */
1126
+ NK_PUBLIC void nk_each_scale_bf16_rvv(nk_bf16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
1127
+ nk_bf16_t *result);
1128
+ /** @copydoc nk_each_scale_i8 */
1129
+ NK_PUBLIC void nk_each_scale_i8_rvv(nk_i8_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
1130
+ nk_i8_t *result);
1131
+ /** @copydoc nk_each_scale_u8 */
1132
+ NK_PUBLIC void nk_each_scale_u8_rvv(nk_u8_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
1133
+ nk_u8_t *result);
1134
+ /** @copydoc nk_each_scale_i16 */
1135
+ NK_PUBLIC void nk_each_scale_i16_rvv(nk_i16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
1136
+ nk_i16_t *result);
1137
+ /** @copydoc nk_each_scale_u16 */
1138
+ NK_PUBLIC void nk_each_scale_u16_rvv(nk_u16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
1139
+ nk_u16_t *result);
1140
+ /** @copydoc nk_each_scale_i32 */
1141
+ NK_PUBLIC void nk_each_scale_i32_rvv(nk_i32_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
1142
+ nk_i32_t *result);
1143
+ /** @copydoc nk_each_scale_u32 */
1144
+ NK_PUBLIC void nk_each_scale_u32_rvv(nk_u32_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
1145
+ nk_u32_t *result);
1146
+ /** @copydoc nk_each_scale_i64 */
1147
+ NK_PUBLIC void nk_each_scale_i64_rvv(nk_i64_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
1148
+ nk_i64_t *result);
1149
+ /** @copydoc nk_each_scale_u64 */
1150
+ NK_PUBLIC void nk_each_scale_u64_rvv(nk_u64_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
1151
+ nk_u64_t *result);
1152
+ /** @copydoc nk_each_scale_e4m3 */
1153
+ NK_PUBLIC void nk_each_scale_e4m3_rvv(nk_e4m3_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
1154
+ nk_e4m3_t *result);
1155
+ /** @copydoc nk_each_scale_e5m2 */
1156
+ NK_PUBLIC void nk_each_scale_e5m2_rvv(nk_e5m2_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
1157
+ nk_e5m2_t *result);
1158
+
1159
+ /** @copydoc nk_each_blend_f64 */
1160
+ NK_PUBLIC void nk_each_blend_f64_rvv(nk_f64_t const *a, nk_f64_t const *b, nk_size_t n, nk_f64_t const *alpha,
1161
+ nk_f64_t const *beta, nk_f64_t *result);
1162
+ /** @copydoc nk_each_blend_f32 */
1163
+ NK_PUBLIC void nk_each_blend_f32_rvv(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f32_t const *alpha,
1164
+ nk_f32_t const *beta, nk_f32_t *result);
1165
+ /** @copydoc nk_each_blend_f16 */
1166
+ NK_PUBLIC void nk_each_blend_f16_rvv(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f32_t const *alpha,
1167
+ nk_f32_t const *beta, nk_f16_t *result);
1168
+ /** @copydoc nk_each_blend_bf16 */
1169
+ NK_PUBLIC void nk_each_blend_bf16_rvv(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_f32_t const *alpha,
1170
+ nk_f32_t const *beta, nk_bf16_t *result);
1171
+ /** @copydoc nk_each_blend_i8 */
1172
+ NK_PUBLIC void nk_each_blend_i8_rvv(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_f32_t const *alpha,
1173
+ nk_f32_t const *beta, nk_i8_t *result);
1174
+ /** @copydoc nk_each_blend_u8 */
1175
+ NK_PUBLIC void nk_each_blend_u8_rvv(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_f32_t const *alpha,
1176
+ nk_f32_t const *beta, nk_u8_t *result);
1177
+ /** @copydoc nk_each_blend_e4m3 */
1178
+ NK_PUBLIC void nk_each_blend_e4m3_rvv(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_f32_t const *alpha,
1179
+ nk_f32_t const *beta, nk_e4m3_t *result);
1180
+ /** @copydoc nk_each_blend_e5m2 */
1181
+ NK_PUBLIC void nk_each_blend_e5m2_rvv(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_f32_t const *alpha,
1182
+ nk_f32_t const *beta, nk_e5m2_t *result);
1183
+
1184
+ /** @copydoc nk_each_fma_f64 */
1185
+ NK_PUBLIC void nk_each_fma_f64_rvv(nk_f64_t const *a, nk_f64_t const *b, nk_f64_t const *c, nk_size_t n,
1186
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_f64_t *result);
1187
+ /** @copydoc nk_each_fma_f32 */
1188
+ NK_PUBLIC void nk_each_fma_f32_rvv(nk_f32_t const *a, nk_f32_t const *b, nk_f32_t const *c, nk_size_t n,
1189
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_f32_t *result);
1190
+ /** @copydoc nk_each_fma_f16 */
1191
+ NK_PUBLIC void nk_each_fma_f16_rvv(nk_f16_t const *a, nk_f16_t const *b, nk_f16_t const *c, nk_size_t n,
1192
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_f16_t *result);
1193
+ /** @copydoc nk_each_fma_bf16 */
1194
+ NK_PUBLIC void nk_each_fma_bf16_rvv(nk_bf16_t const *a, nk_bf16_t const *b, nk_bf16_t const *c, nk_size_t n,
1195
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_bf16_t *result);
1196
+ /** @copydoc nk_each_fma_i8 */
1197
+ NK_PUBLIC void nk_each_fma_i8_rvv(nk_i8_t const *a, nk_i8_t const *b, nk_i8_t const *c, nk_size_t n,
1198
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_i8_t *result);
1199
+ /** @copydoc nk_each_fma_u8 */
1200
+ NK_PUBLIC void nk_each_fma_u8_rvv(nk_u8_t const *a, nk_u8_t const *b, nk_u8_t const *c, nk_size_t n,
1201
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_u8_t *result);
1202
+ /** @copydoc nk_each_fma_i16 */
1203
+ NK_PUBLIC void nk_each_fma_i16_rvv(nk_i16_t const *a, nk_i16_t const *b, nk_i16_t const *c, nk_size_t n,
1204
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_i16_t *result);
1205
+ /** @copydoc nk_each_fma_u16 */
1206
+ NK_PUBLIC void nk_each_fma_u16_rvv(nk_u16_t const *a, nk_u16_t const *b, nk_u16_t const *c, nk_size_t n,
1207
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_u16_t *result);
1208
+ /** @copydoc nk_each_fma_i32 */
1209
+ NK_PUBLIC void nk_each_fma_i32_rvv(nk_i32_t const *a, nk_i32_t const *b, nk_i32_t const *c, nk_size_t n,
1210
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_i32_t *result);
1211
+ /** @copydoc nk_each_fma_u32 */
1212
+ NK_PUBLIC void nk_each_fma_u32_rvv(nk_u32_t const *a, nk_u32_t const *b, nk_u32_t const *c, nk_size_t n,
1213
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_u32_t *result);
1214
+ /** @copydoc nk_each_fma_i64 */
1215
+ NK_PUBLIC void nk_each_fma_i64_rvv(nk_i64_t const *a, nk_i64_t const *b, nk_i64_t const *c, nk_size_t n,
1216
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_i64_t *result);
1217
+ /** @copydoc nk_each_fma_u64 */
1218
+ NK_PUBLIC void nk_each_fma_u64_rvv(nk_u64_t const *a, nk_u64_t const *b, nk_u64_t const *c, nk_size_t n,
1219
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_u64_t *result);
1220
+ /** @copydoc nk_each_fma_e4m3 */
1221
+ NK_PUBLIC void nk_each_fma_e4m3_rvv(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_e4m3_t const *c, nk_size_t n,
1222
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_e4m3_t *result);
1223
+ /** @copydoc nk_each_fma_e5m2 */
1224
+ NK_PUBLIC void nk_each_fma_e5m2_rvv(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_e5m2_t const *c, nk_size_t n,
1225
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_e5m2_t *result);
1226
+ /** @copydoc nk_each_scale_f32c */
1227
+ NK_PUBLIC void nk_each_scale_f32c_rvv(nk_f32c_t const *a, nk_size_t n, nk_f32c_t const *alpha, nk_f32c_t const *beta,
1228
+ nk_f32c_t *result);
1229
+ /** @copydoc nk_each_scale_f64c */
1230
+ NK_PUBLIC void nk_each_scale_f64c_rvv(nk_f64c_t const *a, nk_size_t n, nk_f64c_t const *alpha, nk_f64c_t const *beta,
1231
+ nk_f64c_t *result);
1232
+ /** @copydoc nk_each_blend_f32c */
1233
+ NK_PUBLIC void nk_each_blend_f32c_rvv(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f32c_t const *alpha,
1234
+ nk_f32c_t const *beta, nk_f32c_t *result);
1235
+ /** @copydoc nk_each_blend_f64c */
1236
+ NK_PUBLIC void nk_each_blend_f64c_rvv(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t const *alpha,
1237
+ nk_f64c_t const *beta, nk_f64c_t *result);
1238
+ /** @copydoc nk_each_fma_f32c */
1239
+ NK_PUBLIC void nk_each_fma_f32c_rvv(nk_f32c_t const *a, nk_f32c_t const *b, nk_f32c_t const *c, nk_size_t n,
1240
+ nk_f32c_t const *alpha, nk_f32c_t const *beta, nk_f32c_t *result);
1241
+ /** @copydoc nk_each_fma_f64c */
1242
+ NK_PUBLIC void nk_each_fma_f64c_rvv(nk_f64c_t const *a, nk_f64c_t const *b, nk_f64c_t const *c, nk_size_t n,
1243
+ nk_f64c_t const *alpha, nk_f64c_t const *beta, nk_f64c_t *result);
1244
+ #endif // NK_TARGET_RVV
1245
+
1246
+ /**
1247
+ * @brief Returns the scalar parameter dtype for elementwise scale/blend/fma operations.
1248
+ */
1249
+ NK_INTERNAL nk_dtype_t nk_each_scale_input_dtype(nk_dtype_t dtype) {
1250
+ switch (dtype) {
1251
+ case nk_f64c_k: return nk_f64c_k;
1252
+ case nk_f32c_k: return nk_f32c_k;
1253
+ case nk_f64_k: return nk_f64_k;
1254
+ case nk_f32_k: return nk_f32_k;
1255
+ case nk_f16_k: return nk_f32_k;
1256
+ case nk_bf16_k: return nk_f32_k;
1257
+ case nk_i64_k: return nk_f64_k;
1258
+ case nk_u64_k: return nk_f64_k;
1259
+ case nk_i32_k: return nk_f64_k;
1260
+ case nk_u32_k: return nk_f64_k;
1261
+ case nk_i16_k: return nk_f32_k;
1262
+ case nk_u16_k: return nk_f32_k;
1263
+ case nk_i8_k: return nk_f32_k;
1264
+ case nk_u8_k: return nk_f32_k;
1265
+ case nk_e4m3_k: return nk_f32_k;
1266
+ case nk_e5m2_k: return nk_f32_k;
1267
+ case nk_e2m3_k: return nk_f32_k;
1268
+ case nk_e3m2_k: return nk_f32_k;
1269
+ default: return nk_dtype_unknown_k;
1270
+ }
1271
+ }
1272
+
1273
+ #if defined(__cplusplus)
1274
+ } // extern "C"
1275
+ #endif
1276
+
1277
+ #include "numkong/each/serial.h"
1278
+ #include "numkong/each/neon.h"
1279
+ #include "numkong/each/neonhalf.h"
1280
+ #include "numkong/each/neonbfdot.h"
1281
+ #include "numkong/each/haswell.h"
1282
+ #include "numkong/each/skylake.h"
1283
+ #include "numkong/each/icelake.h"
1284
+ #include "numkong/each/sapphire.h"
1285
+ #include "numkong/each/rvv.h"
1286
+ #include "numkong/each/v128relaxed.h"
1287
+
1288
+ #if defined(__cplusplus)
1289
+ extern "C" {
1290
+ #endif
1291
+
1292
+ #if !NK_DYNAMIC_DISPATCH
1293
+
1294
+ NK_PUBLIC void nk_each_sum_f64(nk_f64_t const *a, nk_f64_t const *b, nk_size_t n, nk_f64_t *r) {
1295
+ #if NK_TARGET_SKYLAKE
1296
+ nk_each_sum_f64_skylake(a, b, n, r);
1297
+ #elif NK_TARGET_HASWELL
1298
+ nk_each_sum_f64_haswell(a, b, n, r);
1299
+ #elif NK_TARGET_NEON
1300
+ nk_each_sum_f64_neon(a, b, n, r);
1301
+ #elif NK_TARGET_RVV
1302
+ nk_each_sum_f64_rvv(a, b, n, r);
1303
+ #else
1304
+ nk_each_sum_f64_serial(a, b, n, r);
1305
+ #endif
1306
+ }
1307
+
1308
+ NK_PUBLIC void nk_each_sum_f32(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f32_t *r) {
1309
+ #if NK_TARGET_SKYLAKE
1310
+ nk_each_sum_f32_skylake(a, b, n, r);
1311
+ #elif NK_TARGET_HASWELL
1312
+ nk_each_sum_f32_haswell(a, b, n, r);
1313
+ #elif NK_TARGET_NEON
1314
+ nk_each_sum_f32_neon(a, b, n, r);
1315
+ #elif NK_TARGET_RVV
1316
+ nk_each_sum_f32_rvv(a, b, n, r);
1317
+ #elif NK_TARGET_V128RELAXED
1318
+ nk_each_sum_f32_v128relaxed(a, b, n, r);
1319
+ #else
1320
+ nk_each_sum_f32_serial(a, b, n, r);
1321
+ #endif
1322
+ }
1323
+
1324
+ NK_PUBLIC void nk_each_sum_bf16(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_bf16_t *r) {
1325
+ #if NK_TARGET_SKYLAKE
1326
+ nk_each_sum_bf16_skylake(a, b, n, r);
1327
+ #elif NK_TARGET_HASWELL
1328
+ nk_each_sum_bf16_haswell(a, b, n, r);
1329
+ #elif NK_TARGET_NEONBFDOT
1330
+ nk_each_sum_bf16_neonbfdot(a, b, n, r);
1331
+ #elif NK_TARGET_RVV
1332
+ nk_each_sum_bf16_rvv(a, b, n, r);
1333
+ #elif NK_TARGET_V128RELAXED
1334
+ nk_each_sum_bf16_v128relaxed(a, b, n, r);
1335
+ #else
1336
+ nk_each_sum_bf16_serial(a, b, n, r);
1337
+ #endif
1338
+ }
1339
+
1340
+ NK_PUBLIC void nk_each_sum_f16(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f16_t *r) {
1341
+ #if NK_TARGET_SAPPHIRE
1342
+ nk_each_sum_f16_sapphire(a, b, n, r);
1343
+ #elif NK_TARGET_HASWELL
1344
+ nk_each_sum_f16_haswell(a, b, n, r);
1345
+ #elif NK_TARGET_NEONHALF
1346
+ nk_each_sum_f16_neonhalf(a, b, n, r);
1347
+ #elif NK_TARGET_RVV
1348
+ nk_each_sum_f16_rvv(a, b, n, r);
1349
+ #elif NK_TARGET_V128RELAXED
1350
+ nk_each_sum_f16_v128relaxed(a, b, n, r);
1351
+ #else
1352
+ nk_each_sum_f16_serial(a, b, n, r);
1353
+ #endif
1354
+ }
1355
+
1356
+ NK_PUBLIC void nk_each_sum_i8(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_i8_t *r) {
1357
+ #if NK_TARGET_ICELAKE
1358
+ nk_each_sum_i8_icelake(a, b, n, r);
1359
+ #elif NK_TARGET_HASWELL
1360
+ nk_each_sum_i8_haswell(a, b, n, r);
1361
+ #elif NK_TARGET_NEON
1362
+ nk_each_sum_i8_neon(a, b, n, r);
1363
+ #elif NK_TARGET_RVV
1364
+ nk_each_sum_i8_rvv(a, b, n, r);
1365
+ #elif NK_TARGET_V128RELAXED
1366
+ nk_each_sum_i8_v128relaxed(a, b, n, r);
1367
+ #else
1368
+ nk_each_sum_i8_serial(a, b, n, r);
1369
+ #endif
1370
+ }
1371
+
1372
+ NK_PUBLIC void nk_each_sum_u8(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_u8_t *r) {
1373
+ #if NK_TARGET_ICELAKE
1374
+ nk_each_sum_u8_icelake(a, b, n, r);
1375
+ #elif NK_TARGET_HASWELL
1376
+ nk_each_sum_u8_haswell(a, b, n, r);
1377
+ #elif NK_TARGET_NEON
1378
+ nk_each_sum_u8_neon(a, b, n, r);
1379
+ #elif NK_TARGET_RVV
1380
+ nk_each_sum_u8_rvv(a, b, n, r);
1381
+ #elif NK_TARGET_V128RELAXED
1382
+ nk_each_sum_u8_v128relaxed(a, b, n, r);
1383
+ #else
1384
+ nk_each_sum_u8_serial(a, b, n, r);
1385
+ #endif
1386
+ }
1387
+
1388
+ NK_PUBLIC void nk_each_sum_i16(nk_i16_t const *a, nk_i16_t const *b, nk_size_t n, nk_i16_t *r) {
1389
+ #if NK_TARGET_ICELAKE
1390
+ nk_each_sum_i16_icelake(a, b, n, r);
1391
+ #elif NK_TARGET_HASWELL
1392
+ nk_each_sum_i16_haswell(a, b, n, r);
1393
+ #elif NK_TARGET_NEON
1394
+ nk_each_sum_i16_neon(a, b, n, r);
1395
+ #elif NK_TARGET_RVV
1396
+ nk_each_sum_i16_rvv(a, b, n, r);
1397
+ #else
1398
+ nk_each_sum_i16_serial(a, b, n, r);
1399
+ #endif
1400
+ }
1401
+
1402
+ NK_PUBLIC void nk_each_sum_u16(nk_u16_t const *a, nk_u16_t const *b, nk_size_t n, nk_u16_t *r) {
1403
+ #if NK_TARGET_ICELAKE
1404
+ nk_each_sum_u16_icelake(a, b, n, r);
1405
+ #elif NK_TARGET_HASWELL
1406
+ nk_each_sum_u16_haswell(a, b, n, r);
1407
+ #elif NK_TARGET_NEON
1408
+ nk_each_sum_u16_neon(a, b, n, r);
1409
+ #elif NK_TARGET_RVV
1410
+ nk_each_sum_u16_rvv(a, b, n, r);
1411
+ #else
1412
+ nk_each_sum_u16_serial(a, b, n, r);
1413
+ #endif
1414
+ }
1415
+
1416
+ NK_PUBLIC void nk_each_sum_i32(nk_i32_t const *a, nk_i32_t const *b, nk_size_t n, nk_i32_t *r) {
1417
+ #if NK_TARGET_ICELAKE
1418
+ nk_each_sum_i32_icelake(a, b, n, r);
1419
+ #elif NK_TARGET_HASWELL
1420
+ nk_each_sum_i32_haswell(a, b, n, r);
1421
+ #elif NK_TARGET_NEON
1422
+ nk_each_sum_i32_neon(a, b, n, r);
1423
+ #elif NK_TARGET_RVV
1424
+ nk_each_sum_i32_rvv(a, b, n, r);
1425
+ #else
1426
+ nk_each_sum_i32_serial(a, b, n, r);
1427
+ #endif
1428
+ }
1429
+
1430
+ NK_PUBLIC void nk_each_sum_u32(nk_u32_t const *a, nk_u32_t const *b, nk_size_t n, nk_u32_t *r) {
1431
+ #if NK_TARGET_ICELAKE
1432
+ nk_each_sum_u32_icelake(a, b, n, r);
1433
+ #elif NK_TARGET_HASWELL
1434
+ nk_each_sum_u32_haswell(a, b, n, r);
1435
+ #elif NK_TARGET_NEON
1436
+ nk_each_sum_u32_neon(a, b, n, r);
1437
+ #elif NK_TARGET_RVV
1438
+ nk_each_sum_u32_rvv(a, b, n, r);
1439
+ #else
1440
+ nk_each_sum_u32_serial(a, b, n, r);
1441
+ #endif
1442
+ }
1443
+
1444
+ NK_PUBLIC void nk_each_sum_i64(nk_i64_t const *a, nk_i64_t const *b, nk_size_t n, nk_i64_t *r) {
1445
+ #if NK_TARGET_ICELAKE
1446
+ nk_each_sum_i64_icelake(a, b, n, r);
1447
+ #elif NK_TARGET_NEON
1448
+ nk_each_sum_i64_neon(a, b, n, r);
1449
+ #elif NK_TARGET_RVV
1450
+ nk_each_sum_i64_rvv(a, b, n, r);
1451
+ #else
1452
+ nk_each_sum_i64_serial(a, b, n, r);
1453
+ #endif
1454
+ }
1455
+
1456
+ NK_PUBLIC void nk_each_sum_u64(nk_u64_t const *a, nk_u64_t const *b, nk_size_t n, nk_u64_t *r) {
1457
+ #if NK_TARGET_ICELAKE
1458
+ nk_each_sum_u64_icelake(a, b, n, r);
1459
+ #elif NK_TARGET_NEON
1460
+ nk_each_sum_u64_neon(a, b, n, r);
1461
+ #elif NK_TARGET_RVV
1462
+ nk_each_sum_u64_rvv(a, b, n, r);
1463
+ #else
1464
+ nk_each_sum_u64_serial(a, b, n, r);
1465
+ #endif
1466
+ }
1467
+
1468
+ NK_PUBLIC void nk_each_scale_f64(nk_f64_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
1469
+ nk_f64_t *r) {
1470
+ #if NK_TARGET_SKYLAKE
1471
+ nk_each_scale_f64_skylake(a, n, alpha, beta, r);
1472
+ #elif NK_TARGET_HASWELL
1473
+ nk_each_scale_f64_haswell(a, n, alpha, beta, r);
1474
+ #elif NK_TARGET_NEON
1475
+ nk_each_scale_f64_neon(a, n, alpha, beta, r);
1476
+ #elif NK_TARGET_RVV
1477
+ nk_each_scale_f64_rvv(a, n, alpha, beta, r);
1478
+ #else
1479
+ nk_each_scale_f64_serial(a, n, alpha, beta, r);
1480
+ #endif
1481
+ }
1482
+
1483
+ NK_PUBLIC void nk_each_scale_f32(nk_f32_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
1484
+ nk_f32_t *r) {
1485
+ #if NK_TARGET_SKYLAKE
1486
+ nk_each_scale_f32_skylake(a, n, alpha, beta, r);
1487
+ #elif NK_TARGET_HASWELL
1488
+ nk_each_scale_f32_haswell(a, n, alpha, beta, r);
1489
+ #elif NK_TARGET_NEON
1490
+ nk_each_scale_f32_neon(a, n, alpha, beta, r);
1491
+ #elif NK_TARGET_RVV
1492
+ nk_each_scale_f32_rvv(a, n, alpha, beta, r);
1493
+ #elif NK_TARGET_V128RELAXED
1494
+ nk_each_scale_f32_v128relaxed(a, n, alpha, beta, r);
1495
+ #else
1496
+ nk_each_scale_f32_serial(a, n, alpha, beta, r);
1497
+ #endif
1498
+ }
1499
+
1500
+ NK_PUBLIC void nk_each_scale_bf16(nk_bf16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
1501
+ nk_bf16_t *r) {
1502
+ #if NK_TARGET_SKYLAKE
1503
+ nk_each_scale_bf16_skylake(a, n, alpha, beta, r);
1504
+ #elif NK_TARGET_HASWELL
1505
+ nk_each_scale_bf16_haswell(a, n, alpha, beta, r);
1506
+ #elif NK_TARGET_NEONBFDOT
1507
+ nk_each_scale_bf16_neonbfdot(a, n, alpha, beta, r);
1508
+ #elif NK_TARGET_RVV
1509
+ nk_each_scale_bf16_rvv(a, n, alpha, beta, r);
1510
+ #elif NK_TARGET_V128RELAXED
1511
+ nk_each_scale_bf16_v128relaxed(a, n, alpha, beta, r);
1512
+ #else
1513
+ nk_each_scale_bf16_serial(a, n, alpha, beta, r);
1514
+ #endif
1515
+ }
1516
+
1517
+ NK_PUBLIC void nk_each_scale_f16(nk_f16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
1518
+ nk_f16_t *r) {
1519
+ #if NK_TARGET_SKYLAKE
1520
+ nk_each_scale_f16_skylake(a, n, alpha, beta, r);
1521
+ #elif NK_TARGET_HASWELL
1522
+ nk_each_scale_f16_haswell(a, n, alpha, beta, r);
1523
+ #elif NK_TARGET_NEONHALF
1524
+ nk_each_scale_f16_neonhalf(a, n, alpha, beta, r);
1525
+ #elif NK_TARGET_RVV
1526
+ nk_each_scale_f16_rvv(a, n, alpha, beta, r);
1527
+ #elif NK_TARGET_V128RELAXED
1528
+ nk_each_scale_f16_v128relaxed(a, n, alpha, beta, r);
1529
+ #else
1530
+ nk_each_scale_f16_serial(a, n, alpha, beta, r);
1531
+ #endif
1532
+ }
1533
+
1534
+ NK_PUBLIC void nk_each_scale_i8(nk_i8_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
1535
+ nk_i8_t *r) {
1536
+ #if NK_TARGET_SAPPHIRE
1537
+ nk_each_scale_i8_sapphire(a, n, alpha, beta, r);
1538
+ #elif NK_TARGET_SKYLAKE
1539
+ nk_each_scale_i8_skylake(a, n, alpha, beta, r);
1540
+ #elif NK_TARGET_HASWELL
1541
+ nk_each_scale_i8_haswell(a, n, alpha, beta, r);
1542
+ #elif NK_TARGET_NEONHALF
1543
+ nk_each_scale_i8_neonhalf(a, n, alpha, beta, r);
1544
+ #elif NK_TARGET_RVV
1545
+ nk_each_scale_i8_rvv(a, n, alpha, beta, r);
1546
+ #elif NK_TARGET_V128RELAXED
1547
+ nk_each_scale_i8_v128relaxed(a, n, alpha, beta, r);
1548
+ #else
1549
+ nk_each_scale_i8_serial(a, n, alpha, beta, r);
1550
+ #endif
1551
+ }
1552
+
1553
+ NK_PUBLIC void nk_each_scale_u8(nk_u8_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
1554
+ nk_u8_t *r) {
1555
+ #if NK_TARGET_SAPPHIRE
1556
+ nk_each_scale_u8_sapphire(a, n, alpha, beta, r);
1557
+ #elif NK_TARGET_SKYLAKE
1558
+ nk_each_scale_u8_skylake(a, n, alpha, beta, r);
1559
+ #elif NK_TARGET_HASWELL
1560
+ nk_each_scale_u8_haswell(a, n, alpha, beta, r);
1561
+ #elif NK_TARGET_NEONHALF
1562
+ nk_each_scale_u8_neonhalf(a, n, alpha, beta, r);
1563
+ #elif NK_TARGET_RVV
1564
+ nk_each_scale_u8_rvv(a, n, alpha, beta, r);
1565
+ #elif NK_TARGET_V128RELAXED
1566
+ nk_each_scale_u8_v128relaxed(a, n, alpha, beta, r);
1567
+ #else
1568
+ nk_each_scale_u8_serial(a, n, alpha, beta, r);
1569
+ #endif
1570
+ }
1571
+
1572
+ NK_PUBLIC void nk_each_scale_i16(nk_i16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
1573
+ nk_i16_t *r) {
1574
+ #if NK_TARGET_SKYLAKE
1575
+ nk_each_scale_i16_skylake(a, n, alpha, beta, r);
1576
+ #elif NK_TARGET_HASWELL
1577
+ nk_each_scale_i16_haswell(a, n, alpha, beta, r);
1578
+ #elif NK_TARGET_NEON
1579
+ nk_each_scale_i16_neon(a, n, alpha, beta, r);
1580
+ #elif NK_TARGET_RVV
1581
+ nk_each_scale_i16_rvv(a, n, alpha, beta, r);
1582
+ #else
1583
+ nk_each_scale_i16_serial(a, n, alpha, beta, r);
1584
+ #endif
1585
+ }
1586
+
1587
+ NK_PUBLIC void nk_each_scale_u16(nk_u16_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
1588
+ nk_u16_t *r) {
1589
+ #if NK_TARGET_SKYLAKE
1590
+ nk_each_scale_u16_skylake(a, n, alpha, beta, r);
1591
+ #elif NK_TARGET_HASWELL
1592
+ nk_each_scale_u16_haswell(a, n, alpha, beta, r);
1593
+ #elif NK_TARGET_NEON
1594
+ nk_each_scale_u16_neon(a, n, alpha, beta, r);
1595
+ #elif NK_TARGET_RVV
1596
+ nk_each_scale_u16_rvv(a, n, alpha, beta, r);
1597
+ #else
1598
+ nk_each_scale_u16_serial(a, n, alpha, beta, r);
1599
+ #endif
1600
+ }
1601
+
1602
+ NK_PUBLIC void nk_each_scale_i32(nk_i32_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
1603
+ nk_i32_t *r) {
1604
+ #if NK_TARGET_SKYLAKE
1605
+ nk_each_scale_i32_skylake(a, n, alpha, beta, r);
1606
+ #elif NK_TARGET_HASWELL
1607
+ nk_each_scale_i32_haswell(a, n, alpha, beta, r);
1608
+ #elif NK_TARGET_NEON
1609
+ nk_each_scale_i32_neon(a, n, alpha, beta, r);
1610
+ #elif NK_TARGET_RVV
1611
+ nk_each_scale_i32_rvv(a, n, alpha, beta, r);
1612
+ #else
1613
+ nk_each_scale_i32_serial(a, n, alpha, beta, r);
1614
+ #endif
1615
+ }
1616
+
1617
+ NK_PUBLIC void nk_each_scale_u32(nk_u32_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
1618
+ nk_u32_t *r) {
1619
+ #if NK_TARGET_SKYLAKE
1620
+ nk_each_scale_u32_skylake(a, n, alpha, beta, r);
1621
+ #elif NK_TARGET_HASWELL
1622
+ nk_each_scale_u32_haswell(a, n, alpha, beta, r);
1623
+ #elif NK_TARGET_NEON
1624
+ nk_each_scale_u32_neon(a, n, alpha, beta, r);
1625
+ #elif NK_TARGET_RVV
1626
+ nk_each_scale_u32_rvv(a, n, alpha, beta, r);
1627
+ #else
1628
+ nk_each_scale_u32_serial(a, n, alpha, beta, r);
1629
+ #endif
1630
+ }
1631
+
1632
+ NK_PUBLIC void nk_each_scale_i64(nk_i64_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
1633
+ nk_i64_t *r) {
1634
+ #if NK_TARGET_SKYLAKE
1635
+ nk_each_scale_i64_skylake(a, n, alpha, beta, r);
1636
+ #elif NK_TARGET_NEON
1637
+ nk_each_scale_i64_neon(a, n, alpha, beta, r);
1638
+ #elif NK_TARGET_RVV
1639
+ nk_each_scale_i64_rvv(a, n, alpha, beta, r);
1640
+ #else
1641
+ nk_each_scale_i64_serial(a, n, alpha, beta, r);
1642
+ #endif
1643
+ }
1644
+
1645
+ NK_PUBLIC void nk_each_scale_u64(nk_u64_t const *a, nk_size_t n, nk_f64_t const *alpha, nk_f64_t const *beta,
1646
+ nk_u64_t *r) {
1647
+ #if NK_TARGET_SKYLAKE
1648
+ nk_each_scale_u64_skylake(a, n, alpha, beta, r);
1649
+ #elif NK_TARGET_NEON
1650
+ nk_each_scale_u64_neon(a, n, alpha, beta, r);
1651
+ #elif NK_TARGET_RVV
1652
+ nk_each_scale_u64_rvv(a, n, alpha, beta, r);
1653
+ #else
1654
+ nk_each_scale_u64_serial(a, n, alpha, beta, r);
1655
+ #endif
1656
+ }
1657
+
1658
+ NK_PUBLIC void nk_each_blend_f64(nk_f64_t const *a, nk_f64_t const *b, nk_size_t n, nk_f64_t const *alpha,
1659
+ nk_f64_t const *beta, nk_f64_t *r) {
1660
+ #if NK_TARGET_SKYLAKE
1661
+ nk_each_blend_f64_skylake(a, b, n, alpha, beta, r);
1662
+ #elif NK_TARGET_HASWELL
1663
+ nk_each_blend_f64_haswell(a, b, n, alpha, beta, r);
1664
+ #elif NK_TARGET_NEON
1665
+ nk_each_blend_f64_neon(a, b, n, alpha, beta, r);
1666
+ #elif NK_TARGET_RVV
1667
+ nk_each_blend_f64_rvv(a, b, n, alpha, beta, r);
1668
+ #else
1669
+ nk_each_blend_f64_serial(a, b, n, alpha, beta, r);
1670
+ #endif
1671
+ }
1672
+
1673
+ NK_PUBLIC void nk_each_blend_f32(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f32_t const *alpha,
1674
+ nk_f32_t const *beta, nk_f32_t *r) {
1675
+ #if NK_TARGET_SKYLAKE
1676
+ nk_each_blend_f32_skylake(a, b, n, alpha, beta, r);
1677
+ #elif NK_TARGET_HASWELL
1678
+ nk_each_blend_f32_haswell(a, b, n, alpha, beta, r);
1679
+ #elif NK_TARGET_NEON
1680
+ nk_each_blend_f32_neon(a, b, n, alpha, beta, r);
1681
+ #elif NK_TARGET_RVV
1682
+ nk_each_blend_f32_rvv(a, b, n, alpha, beta, r);
1683
+ #elif NK_TARGET_V128RELAXED
1684
+ nk_each_blend_f32_v128relaxed(a, b, n, alpha, beta, r);
1685
+ #else
1686
+ nk_each_blend_f32_serial(a, b, n, alpha, beta, r);
1687
+ #endif
1688
+ }
1689
+
1690
+ NK_PUBLIC void nk_each_blend_bf16(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_f32_t const *alpha,
1691
+ nk_f32_t const *beta, nk_bf16_t *r) {
1692
+ #if NK_TARGET_SKYLAKE
1693
+ nk_each_blend_bf16_skylake(a, b, n, alpha, beta, r);
1694
+ #elif NK_TARGET_HASWELL
1695
+ nk_each_blend_bf16_haswell(a, b, n, alpha, beta, r);
1696
+ #elif NK_TARGET_NEONBFDOT
1697
+ nk_each_blend_bf16_neonbfdot(a, b, n, alpha, beta, r);
1698
+ #elif NK_TARGET_RVV
1699
+ nk_each_blend_bf16_rvv(a, b, n, alpha, beta, r);
1700
+ #elif NK_TARGET_V128RELAXED
1701
+ nk_each_blend_bf16_v128relaxed(a, b, n, alpha, beta, r);
1702
+ #else
1703
+ nk_each_blend_bf16_serial(a, b, n, alpha, beta, r);
1704
+ #endif
1705
+ }
1706
+
1707
+ NK_PUBLIC void nk_each_blend_f16(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f32_t const *alpha,
1708
+ nk_f32_t const *beta, nk_f16_t *r) {
1709
+ #if NK_TARGET_SKYLAKE
1710
+ nk_each_blend_f16_skylake(a, b, n, alpha, beta, r);
1711
+ #elif NK_TARGET_HASWELL
1712
+ nk_each_blend_f16_haswell(a, b, n, alpha, beta, r);
1713
+ #elif NK_TARGET_NEONHALF
1714
+ nk_each_blend_f16_neonhalf(a, b, n, alpha, beta, r);
1715
+ #elif NK_TARGET_RVV
1716
+ nk_each_blend_f16_rvv(a, b, n, alpha, beta, r);
1717
+ #elif NK_TARGET_V128RELAXED
1718
+ nk_each_blend_f16_v128relaxed(a, b, n, alpha, beta, r);
1719
+ #else
1720
+ nk_each_blend_f16_serial(a, b, n, alpha, beta, r);
1721
+ #endif
1722
+ }
1723
+
1724
+ NK_PUBLIC void nk_each_blend_i8(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_f32_t const *alpha,
1725
+ nk_f32_t const *beta, nk_i8_t *r) {
1726
+ #if NK_TARGET_SAPPHIRE
1727
+ nk_each_blend_i8_sapphire(a, b, n, alpha, beta, r);
1728
+ #elif NK_TARGET_HASWELL
1729
+ nk_each_blend_i8_haswell(a, b, n, alpha, beta, r);
1730
+ #elif NK_TARGET_NEONHALF
1731
+ nk_each_blend_i8_neonhalf(a, b, n, alpha, beta, r);
1732
+ #elif NK_TARGET_RVV
1733
+ nk_each_blend_i8_rvv(a, b, n, alpha, beta, r);
1734
+ #elif NK_TARGET_V128RELAXED
1735
+ nk_each_blend_i8_v128relaxed(a, b, n, alpha, beta, r);
1736
+ #else
1737
+ nk_each_blend_i8_serial(a, b, n, alpha, beta, r);
1738
+ #endif
1739
+ }
1740
+
1741
+ NK_PUBLIC void nk_each_blend_u8(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_f32_t const *alpha,
1742
+ nk_f32_t const *beta, nk_u8_t *r) {
1743
+ #if NK_TARGET_SAPPHIRE
1744
+ nk_each_blend_u8_sapphire(a, b, n, alpha, beta, r);
1745
+ #elif NK_TARGET_HASWELL
1746
+ nk_each_blend_u8_haswell(a, b, n, alpha, beta, r);
1747
+ #elif NK_TARGET_NEONHALF
1748
+ nk_each_blend_u8_neonhalf(a, b, n, alpha, beta, r);
1749
+ #elif NK_TARGET_RVV
1750
+ nk_each_blend_u8_rvv(a, b, n, alpha, beta, r);
1751
+ #elif NK_TARGET_V128RELAXED
1752
+ nk_each_blend_u8_v128relaxed(a, b, n, alpha, beta, r);
1753
+ #else
1754
+ nk_each_blend_u8_serial(a, b, n, alpha, beta, r);
1755
+ #endif
1756
+ }
1757
+
1758
+ NK_PUBLIC void nk_each_blend_i16(nk_i16_t const *a, nk_i16_t const *b, nk_size_t n, nk_f32_t const *alpha,
1759
+ nk_f32_t const *beta, nk_i16_t *r) {
1760
+ nk_each_blend_i16_serial(a, b, n, alpha, beta, r);
1761
+ }
1762
+
1763
+ NK_PUBLIC void nk_each_blend_u16(nk_u16_t const *a, nk_u16_t const *b, nk_size_t n, nk_f32_t const *alpha,
1764
+ nk_f32_t const *beta, nk_u16_t *r) {
1765
+ nk_each_blend_u16_serial(a, b, n, alpha, beta, r);
1766
+ }
1767
+
1768
+ NK_PUBLIC void nk_each_blend_i32(nk_i32_t const *a, nk_i32_t const *b, nk_size_t n, nk_f64_t const *alpha,
1769
+ nk_f64_t const *beta, nk_i32_t *r) {
1770
+ nk_each_blend_i32_serial(a, b, n, alpha, beta, r);
1771
+ }
1772
+
1773
+ NK_PUBLIC void nk_each_blend_u32(nk_u32_t const *a, nk_u32_t const *b, nk_size_t n, nk_f64_t const *alpha,
1774
+ nk_f64_t const *beta, nk_u32_t *r) {
1775
+ nk_each_blend_u32_serial(a, b, n, alpha, beta, r);
1776
+ }
1777
+
1778
+ NK_PUBLIC void nk_each_blend_i64(nk_i64_t const *a, nk_i64_t const *b, nk_size_t n, nk_f64_t const *alpha,
1779
+ nk_f64_t const *beta, nk_i64_t *r) {
1780
+ nk_each_blend_i64_serial(a, b, n, alpha, beta, r);
1781
+ }
1782
+
1783
+ NK_PUBLIC void nk_each_blend_u64(nk_u64_t const *a, nk_u64_t const *b, nk_size_t n, nk_f64_t const *alpha,
1784
+ nk_f64_t const *beta, nk_u64_t *r) {
1785
+ nk_each_blend_u64_serial(a, b, n, alpha, beta, r);
1786
+ }
1787
+
1788
+ NK_PUBLIC void nk_each_fma_f64(nk_f64_t const *a, nk_f64_t const *b, nk_f64_t const *c, nk_size_t n,
1789
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_f64_t *r) {
1790
+ #if NK_TARGET_SKYLAKE
1791
+ nk_each_fma_f64_skylake(a, b, c, n, alpha, beta, r);
1792
+ #elif NK_TARGET_HASWELL
1793
+ nk_each_fma_f64_haswell(a, b, c, n, alpha, beta, r);
1794
+ #elif NK_TARGET_NEON
1795
+ nk_each_fma_f64_neon(a, b, c, n, alpha, beta, r);
1796
+ #elif NK_TARGET_RVV
1797
+ nk_each_fma_f64_rvv(a, b, c, n, alpha, beta, r);
1798
+ #else
1799
+ nk_each_fma_f64_serial(a, b, c, n, alpha, beta, r);
1800
+ #endif
1801
+ }
1802
+
1803
+ NK_PUBLIC void nk_each_fma_f32(nk_f32_t const *a, nk_f32_t const *b, nk_f32_t const *c, nk_size_t n,
1804
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_f32_t *r) {
1805
+ #if NK_TARGET_SKYLAKE
1806
+ nk_each_fma_f32_skylake(a, b, c, n, alpha, beta, r);
1807
+ #elif NK_TARGET_HASWELL
1808
+ nk_each_fma_f32_haswell(a, b, c, n, alpha, beta, r);
1809
+ #elif NK_TARGET_NEON
1810
+ nk_each_fma_f32_neon(a, b, c, n, alpha, beta, r);
1811
+ #elif NK_TARGET_RVV
1812
+ nk_each_fma_f32_rvv(a, b, c, n, alpha, beta, r);
1813
+ #elif NK_TARGET_V128RELAXED
1814
+ nk_each_fma_f32_v128relaxed(a, b, c, n, alpha, beta, r);
1815
+ #else
1816
+ nk_each_fma_f32_serial(a, b, c, n, alpha, beta, r);
1817
+ #endif
1818
+ }
1819
+
1820
+ NK_PUBLIC void nk_each_fma_bf16(nk_bf16_t const *a, nk_bf16_t const *b, nk_bf16_t const *c, nk_size_t n,
1821
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_bf16_t *r) {
1822
+ #if NK_TARGET_SKYLAKE
1823
+ nk_each_fma_bf16_skylake(a, b, c, n, alpha, beta, r);
1824
+ #elif NK_TARGET_HASWELL
1825
+ nk_each_fma_bf16_haswell(a, b, c, n, alpha, beta, r);
1826
+ #elif NK_TARGET_NEONBFDOT
1827
+ nk_each_fma_bf16_neonbfdot(a, b, c, n, alpha, beta, r);
1828
+ #elif NK_TARGET_RVV
1829
+ nk_each_fma_bf16_rvv(a, b, c, n, alpha, beta, r);
1830
+ #elif NK_TARGET_V128RELAXED
1831
+ nk_each_fma_bf16_v128relaxed(a, b, c, n, alpha, beta, r);
1832
+ #else
1833
+ nk_each_fma_bf16_serial(a, b, c, n, alpha, beta, r);
1834
+ #endif
1835
+ }
1836
+
1837
+ NK_PUBLIC void nk_each_fma_f16(nk_f16_t const *a, nk_f16_t const *b, nk_f16_t const *c, nk_size_t n,
1838
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_f16_t *r) {
1839
+ #if NK_TARGET_SKYLAKE
1840
+ nk_each_fma_f16_skylake(a, b, c, n, alpha, beta, r);
1841
+ #elif NK_TARGET_HASWELL
1842
+ nk_each_fma_f16_haswell(a, b, c, n, alpha, beta, r);
1843
+ #elif NK_TARGET_NEONHALF
1844
+ nk_each_fma_f16_neonhalf(a, b, c, n, alpha, beta, r);
1845
+ #elif NK_TARGET_RVV
1846
+ nk_each_fma_f16_rvv(a, b, c, n, alpha, beta, r);
1847
+ #elif NK_TARGET_V128RELAXED
1848
+ nk_each_fma_f16_v128relaxed(a, b, c, n, alpha, beta, r);
1849
+ #else
1850
+ nk_each_fma_f16_serial(a, b, c, n, alpha, beta, r);
1851
+ #endif
1852
+ }
1853
+
1854
+ NK_PUBLIC void nk_each_fma_i8(nk_i8_t const *a, nk_i8_t const *b, nk_i8_t const *c, nk_size_t n, nk_f32_t const *alpha,
1855
+ nk_f32_t const *beta, nk_i8_t *r) {
1856
+ #if NK_TARGET_SKYLAKE
1857
+ nk_each_fma_i8_skylake(a, b, c, n, alpha, beta, r);
1858
+ #elif NK_TARGET_HASWELL
1859
+ nk_each_fma_i8_haswell(a, b, c, n, alpha, beta, r);
1860
+ #elif NK_TARGET_RVV
1861
+ nk_each_fma_i8_rvv(a, b, c, n, alpha, beta, r);
1862
+ #elif NK_TARGET_V128RELAXED
1863
+ nk_each_fma_i8_v128relaxed(a, b, c, n, alpha, beta, r);
1864
+ #else
1865
+ nk_each_fma_i8_serial(a, b, c, n, alpha, beta, r);
1866
+ #endif
1867
+ }
1868
+
1869
+ NK_PUBLIC void nk_each_fma_u8(nk_u8_t const *a, nk_u8_t const *b, nk_u8_t const *c, nk_size_t n, nk_f32_t const *alpha,
1870
+ nk_f32_t const *beta, nk_u8_t *r) {
1871
+ #if NK_TARGET_SKYLAKE
1872
+ nk_each_fma_u8_skylake(a, b, c, n, alpha, beta, r);
1873
+ #elif NK_TARGET_HASWELL
1874
+ nk_each_fma_u8_haswell(a, b, c, n, alpha, beta, r);
1875
+ #elif NK_TARGET_RVV
1876
+ nk_each_fma_u8_rvv(a, b, c, n, alpha, beta, r);
1877
+ #elif NK_TARGET_V128RELAXED
1878
+ nk_each_fma_u8_v128relaxed(a, b, c, n, alpha, beta, r);
1879
+ #else
1880
+ nk_each_fma_u8_serial(a, b, c, n, alpha, beta, r);
1881
+ #endif
1882
+ }
1883
+
1884
+ NK_PUBLIC void nk_each_fma_i16(nk_i16_t const *a, nk_i16_t const *b, nk_i16_t const *c, nk_size_t n,
1885
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_i16_t *r) {
1886
+ #if NK_TARGET_SKYLAKE
1887
+ nk_each_fma_i16_skylake(a, b, c, n, alpha, beta, r);
1888
+ #elif NK_TARGET_HASWELL
1889
+ nk_each_fma_i16_haswell(a, b, c, n, alpha, beta, r);
1890
+ #elif NK_TARGET_NEON
1891
+ nk_each_fma_i16_neon(a, b, c, n, alpha, beta, r);
1892
+ #elif NK_TARGET_RVV
1893
+ nk_each_fma_i16_rvv(a, b, c, n, alpha, beta, r);
1894
+ #else
1895
+ nk_each_fma_i16_serial(a, b, c, n, alpha, beta, r);
1896
+ #endif
1897
+ }
1898
+
1899
+ NK_PUBLIC void nk_each_fma_u16(nk_u16_t const *a, nk_u16_t const *b, nk_u16_t const *c, nk_size_t n,
1900
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_u16_t *r) {
1901
+ #if NK_TARGET_SKYLAKE
1902
+ nk_each_fma_u16_skylake(a, b, c, n, alpha, beta, r);
1903
+ #elif NK_TARGET_HASWELL
1904
+ nk_each_fma_u16_haswell(a, b, c, n, alpha, beta, r);
1905
+ #elif NK_TARGET_NEON
1906
+ nk_each_fma_u16_neon(a, b, c, n, alpha, beta, r);
1907
+ #elif NK_TARGET_RVV
1908
+ nk_each_fma_u16_rvv(a, b, c, n, alpha, beta, r);
1909
+ #else
1910
+ nk_each_fma_u16_serial(a, b, c, n, alpha, beta, r);
1911
+ #endif
1912
+ }
1913
+
1914
+ NK_PUBLIC void nk_each_fma_i32(nk_i32_t const *a, nk_i32_t const *b, nk_i32_t const *c, nk_size_t n,
1915
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_i32_t *r) {
1916
+ #if NK_TARGET_SKYLAKE
1917
+ nk_each_fma_i32_skylake(a, b, c, n, alpha, beta, r);
1918
+ #elif NK_TARGET_HASWELL
1919
+ nk_each_fma_i32_haswell(a, b, c, n, alpha, beta, r);
1920
+ #elif NK_TARGET_NEON
1921
+ nk_each_fma_i32_neon(a, b, c, n, alpha, beta, r);
1922
+ #elif NK_TARGET_RVV
1923
+ nk_each_fma_i32_rvv(a, b, c, n, alpha, beta, r);
1924
+ #else
1925
+ nk_each_fma_i32_serial(a, b, c, n, alpha, beta, r);
1926
+ #endif
1927
+ }
1928
+
1929
+ NK_PUBLIC void nk_each_fma_u32(nk_u32_t const *a, nk_u32_t const *b, nk_u32_t const *c, nk_size_t n,
1930
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_u32_t *r) {
1931
+ #if NK_TARGET_SKYLAKE
1932
+ nk_each_fma_u32_skylake(a, b, c, n, alpha, beta, r);
1933
+ #elif NK_TARGET_HASWELL
1934
+ nk_each_fma_u32_haswell(a, b, c, n, alpha, beta, r);
1935
+ #elif NK_TARGET_NEON
1936
+ nk_each_fma_u32_neon(a, b, c, n, alpha, beta, r);
1937
+ #elif NK_TARGET_RVV
1938
+ nk_each_fma_u32_rvv(a, b, c, n, alpha, beta, r);
1939
+ #else
1940
+ nk_each_fma_u32_serial(a, b, c, n, alpha, beta, r);
1941
+ #endif
1942
+ }
1943
+
1944
+ NK_PUBLIC void nk_each_fma_i64(nk_i64_t const *a, nk_i64_t const *b, nk_i64_t const *c, nk_size_t n,
1945
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_i64_t *r) {
1946
+ #if NK_TARGET_SKYLAKE
1947
+ nk_each_fma_i64_skylake(a, b, c, n, alpha, beta, r);
1948
+ #elif NK_TARGET_NEON
1949
+ nk_each_fma_i64_neon(a, b, c, n, alpha, beta, r);
1950
+ #elif NK_TARGET_RVV
1951
+ nk_each_fma_i64_rvv(a, b, c, n, alpha, beta, r);
1952
+ #else
1953
+ nk_each_fma_i64_serial(a, b, c, n, alpha, beta, r);
1954
+ #endif
1955
+ }
1956
+
1957
+ NK_PUBLIC void nk_each_fma_u64(nk_u64_t const *a, nk_u64_t const *b, nk_u64_t const *c, nk_size_t n,
1958
+ nk_f64_t const *alpha, nk_f64_t const *beta, nk_u64_t *r) {
1959
+ #if NK_TARGET_SKYLAKE
1960
+ nk_each_fma_u64_skylake(a, b, c, n, alpha, beta, r);
1961
+ #elif NK_TARGET_NEON
1962
+ nk_each_fma_u64_neon(a, b, c, n, alpha, beta, r);
1963
+ #elif NK_TARGET_RVV
1964
+ nk_each_fma_u64_rvv(a, b, c, n, alpha, beta, r);
1965
+ #else
1966
+ nk_each_fma_u64_serial(a, b, c, n, alpha, beta, r);
1967
+ #endif
1968
+ }
1969
+
1970
+ NK_PUBLIC void nk_each_sum_e4m3(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_e4m3_t *result) {
1971
+ #if NK_TARGET_SAPPHIRE
1972
+ nk_each_sum_e4m3_sapphire(a, b, n, result);
1973
+ #elif NK_TARGET_SKYLAKE
1974
+ nk_each_sum_e4m3_skylake(a, b, n, result);
1975
+ #elif NK_TARGET_HASWELL
1976
+ nk_each_sum_e4m3_haswell(a, b, n, result);
1977
+ #elif NK_TARGET_NEON
1978
+ nk_each_sum_e4m3_neon(a, b, n, result);
1979
+ #elif NK_TARGET_RVV
1980
+ nk_each_sum_e4m3_rvv(a, b, n, result);
1981
+ #else
1982
+ nk_each_sum_e4m3_serial(a, b, n, result);
1983
+ #endif
1984
+ }
1985
+
1986
+ NK_PUBLIC void nk_each_sum_e5m2(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_e5m2_t *result) {
1987
+ #if NK_TARGET_SKYLAKE
1988
+ nk_each_sum_e5m2_skylake(a, b, n, result);
1989
+ #elif NK_TARGET_HASWELL
1990
+ nk_each_sum_e5m2_haswell(a, b, n, result);
1991
+ #elif NK_TARGET_NEON
1992
+ nk_each_sum_e5m2_neon(a, b, n, result);
1993
+ #elif NK_TARGET_RVV
1994
+ nk_each_sum_e5m2_rvv(a, b, n, result);
1995
+ #else
1996
+ nk_each_sum_e5m2_serial(a, b, n, result);
1997
+ #endif
1998
+ }
1999
+
2000
+ NK_PUBLIC void nk_each_scale_e4m3(nk_e4m3_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
2001
+ nk_e4m3_t *result) {
2002
+ #if NK_TARGET_SKYLAKE
2003
+ nk_each_scale_e4m3_skylake(a, n, alpha, beta, result);
2004
+ #elif NK_TARGET_HASWELL
2005
+ nk_each_scale_e4m3_haswell(a, n, alpha, beta, result);
2006
+ #elif NK_TARGET_NEON
2007
+ nk_each_scale_e4m3_neon(a, n, alpha, beta, result);
2008
+ #elif NK_TARGET_RVV
2009
+ nk_each_scale_e4m3_rvv(a, n, alpha, beta, result);
2010
+ #else
2011
+ nk_each_scale_e4m3_serial(a, n, alpha, beta, result);
2012
+ #endif
2013
+ }
2014
+
2015
+ NK_PUBLIC void nk_each_scale_e5m2(nk_e5m2_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
2016
+ nk_e5m2_t *result) {
2017
+ #if NK_TARGET_SKYLAKE
2018
+ nk_each_scale_e5m2_skylake(a, n, alpha, beta, result);
2019
+ #elif NK_TARGET_HASWELL
2020
+ nk_each_scale_e5m2_haswell(a, n, alpha, beta, result);
2021
+ #elif NK_TARGET_NEON
2022
+ nk_each_scale_e5m2_neon(a, n, alpha, beta, result);
2023
+ #elif NK_TARGET_RVV
2024
+ nk_each_scale_e5m2_rvv(a, n, alpha, beta, result);
2025
+ #else
2026
+ nk_each_scale_e5m2_serial(a, n, alpha, beta, result);
2027
+ #endif
2028
+ }
2029
+
2030
+ NK_PUBLIC void nk_each_blend_e4m3(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_f32_t const *alpha,
2031
+ nk_f32_t const *beta, nk_e4m3_t *result) {
2032
+ #if NK_TARGET_SKYLAKE
2033
+ nk_each_blend_e4m3_skylake(a, b, n, alpha, beta, result);
2034
+ #elif NK_TARGET_HASWELL
2035
+ nk_each_blend_e4m3_haswell(a, b, n, alpha, beta, result);
2036
+ #elif NK_TARGET_NEON
2037
+ nk_each_blend_e4m3_neon(a, b, n, alpha, beta, result);
2038
+ #elif NK_TARGET_RVV
2039
+ nk_each_blend_e4m3_rvv(a, b, n, alpha, beta, result);
2040
+ #else
2041
+ nk_each_blend_e4m3_serial(a, b, n, alpha, beta, result);
2042
+ #endif
2043
+ }
2044
+
2045
+ NK_PUBLIC void nk_each_blend_e5m2(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_f32_t const *alpha,
2046
+ nk_f32_t const *beta, nk_e5m2_t *result) {
2047
+ #if NK_TARGET_SKYLAKE
2048
+ nk_each_blend_e5m2_skylake(a, b, n, alpha, beta, result);
2049
+ #elif NK_TARGET_HASWELL
2050
+ nk_each_blend_e5m2_haswell(a, b, n, alpha, beta, result);
2051
+ #elif NK_TARGET_NEON
2052
+ nk_each_blend_e5m2_neon(a, b, n, alpha, beta, result);
2053
+ #elif NK_TARGET_RVV
2054
+ nk_each_blend_e5m2_rvv(a, b, n, alpha, beta, result);
2055
+ #else
2056
+ nk_each_blend_e5m2_serial(a, b, n, alpha, beta, result);
2057
+ #endif
2058
+ }
2059
+
2060
+ NK_PUBLIC void nk_each_fma_e4m3(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_e4m3_t const *c, nk_size_t n,
2061
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_e4m3_t *result) {
2062
+ #if NK_TARGET_SKYLAKE
2063
+ nk_each_fma_e4m3_skylake(a, b, c, n, alpha, beta, result);
2064
+ #elif NK_TARGET_HASWELL
2065
+ nk_each_fma_e4m3_haswell(a, b, c, n, alpha, beta, result);
2066
+ #elif NK_TARGET_NEON
2067
+ nk_each_fma_e4m3_neon(a, b, c, n, alpha, beta, result);
2068
+ #elif NK_TARGET_RVV
2069
+ nk_each_fma_e4m3_rvv(a, b, c, n, alpha, beta, result);
2070
+ #else
2071
+ nk_each_fma_e4m3_serial(a, b, c, n, alpha, beta, result);
2072
+ #endif
2073
+ }
2074
+
2075
+ NK_PUBLIC void nk_each_fma_e5m2(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_e5m2_t const *c, nk_size_t n,
2076
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_e5m2_t *result) {
2077
+ #if NK_TARGET_SKYLAKE
2078
+ nk_each_fma_e5m2_skylake(a, b, c, n, alpha, beta, result);
2079
+ #elif NK_TARGET_HASWELL
2080
+ nk_each_fma_e5m2_haswell(a, b, c, n, alpha, beta, result);
2081
+ #elif NK_TARGET_NEON
2082
+ nk_each_fma_e5m2_neon(a, b, c, n, alpha, beta, result);
2083
+ #elif NK_TARGET_RVV
2084
+ nk_each_fma_e5m2_rvv(a, b, c, n, alpha, beta, result);
2085
+ #else
2086
+ nk_each_fma_e5m2_serial(a, b, c, n, alpha, beta, result);
2087
+ #endif
2088
+ }
2089
+
2090
+ NK_PUBLIC void nk_each_sum_e2m3(nk_e2m3_t const *a, nk_e2m3_t const *b, nk_size_t n, nk_e2m3_t *result) {
2091
+ nk_each_sum_e2m3_serial(a, b, n, result);
2092
+ }
2093
+
2094
+ NK_PUBLIC void nk_each_sum_e3m2(nk_e3m2_t const *a, nk_e3m2_t const *b, nk_size_t n, nk_e3m2_t *result) {
2095
+ nk_each_sum_e3m2_serial(a, b, n, result);
2096
+ }
2097
+
2098
+ NK_PUBLIC void nk_each_scale_e2m3(nk_e2m3_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
2099
+ nk_e2m3_t *result) {
2100
+ nk_each_scale_e2m3_serial(a, n, alpha, beta, result);
2101
+ }
2102
+
2103
+ NK_PUBLIC void nk_each_scale_e3m2(nk_e3m2_t const *a, nk_size_t n, nk_f32_t const *alpha, nk_f32_t const *beta,
2104
+ nk_e3m2_t *result) {
2105
+ nk_each_scale_e3m2_serial(a, n, alpha, beta, result);
2106
+ }
2107
+
2108
+ NK_PUBLIC void nk_each_blend_e2m3(nk_e2m3_t const *a, nk_e2m3_t const *b, nk_size_t n, nk_f32_t const *alpha,
2109
+ nk_f32_t const *beta, nk_e2m3_t *result) {
2110
+ nk_each_blend_e2m3_serial(a, b, n, alpha, beta, result);
2111
+ }
2112
+
2113
+ NK_PUBLIC void nk_each_blend_e3m2(nk_e3m2_t const *a, nk_e3m2_t const *b, nk_size_t n, nk_f32_t const *alpha,
2114
+ nk_f32_t const *beta, nk_e3m2_t *result) {
2115
+ nk_each_blend_e3m2_serial(a, b, n, alpha, beta, result);
2116
+ }
2117
+
2118
+ NK_PUBLIC void nk_each_fma_e2m3(nk_e2m3_t const *a, nk_e2m3_t const *b, nk_e2m3_t const *c, nk_size_t n,
2119
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_e2m3_t *result) {
2120
+ nk_each_fma_e2m3_serial(a, b, c, n, alpha, beta, result);
2121
+ }
2122
+
2123
+ NK_PUBLIC void nk_each_fma_e3m2(nk_e3m2_t const *a, nk_e3m2_t const *b, nk_e3m2_t const *c, nk_size_t n,
2124
+ nk_f32_t const *alpha, nk_f32_t const *beta, nk_e3m2_t *result) {
2125
+ nk_each_fma_e3m2_serial(a, b, c, n, alpha, beta, result);
2126
+ }
2127
+
2128
+ NK_PUBLIC void nk_each_sum_f32c(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f32c_t *r) {
2129
+ nk_each_sum_f32c_serial(a, b, n, r);
2130
+ }
2131
+
2132
+ NK_PUBLIC void nk_each_sum_f64c(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t *r) {
2133
+ nk_each_sum_f64c_serial(a, b, n, r);
2134
+ }
2135
+
2136
+ NK_PUBLIC void nk_each_scale_f32c(nk_f32c_t const *a, nk_size_t n, nk_f32c_t const *alpha, nk_f32c_t const *beta,
2137
+ nk_f32c_t *r) {
2138
+ #if NK_TARGET_SKYLAKE
2139
+ nk_each_scale_f32c_skylake(a, n, alpha, beta, r);
2140
+ #elif NK_TARGET_HASWELL
2141
+ nk_each_scale_f32c_haswell(a, n, alpha, beta, r);
2142
+ #elif NK_TARGET_NEON
2143
+ nk_each_scale_f32c_neon(a, n, alpha, beta, r);
2144
+ #elif NK_TARGET_RVV
2145
+ nk_each_scale_f32c_rvv(a, n, alpha, beta, r);
2146
+ #else
2147
+ nk_each_scale_f32c_serial(a, n, alpha, beta, r);
2148
+ #endif
2149
+ }
2150
+
2151
+ NK_PUBLIC void nk_each_scale_f64c(nk_f64c_t const *a, nk_size_t n, nk_f64c_t const *alpha, nk_f64c_t const *beta,
2152
+ nk_f64c_t *r) {
2153
+ #if NK_TARGET_SKYLAKE
2154
+ nk_each_scale_f64c_skylake(a, n, alpha, beta, r);
2155
+ #elif NK_TARGET_HASWELL
2156
+ nk_each_scale_f64c_haswell(a, n, alpha, beta, r);
2157
+ #elif NK_TARGET_NEON
2158
+ nk_each_scale_f64c_neon(a, n, alpha, beta, r);
2159
+ #elif NK_TARGET_RVV
2160
+ nk_each_scale_f64c_rvv(a, n, alpha, beta, r);
2161
+ #else
2162
+ nk_each_scale_f64c_serial(a, n, alpha, beta, r);
2163
+ #endif
2164
+ }
2165
+
2166
+ NK_PUBLIC void nk_each_blend_f32c(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f32c_t const *alpha,
2167
+ nk_f32c_t const *beta, nk_f32c_t *r) {
2168
+ #if NK_TARGET_SKYLAKE
2169
+ nk_each_blend_f32c_skylake(a, b, n, alpha, beta, r);
2170
+ #elif NK_TARGET_HASWELL
2171
+ nk_each_blend_f32c_haswell(a, b, n, alpha, beta, r);
2172
+ #elif NK_TARGET_NEON
2173
+ nk_each_blend_f32c_neon(a, b, n, alpha, beta, r);
2174
+ #elif NK_TARGET_RVV
2175
+ nk_each_blend_f32c_rvv(a, b, n, alpha, beta, r);
2176
+ #else
2177
+ nk_each_blend_f32c_serial(a, b, n, alpha, beta, r);
2178
+ #endif
2179
+ }
2180
+
2181
+ NK_PUBLIC void nk_each_blend_f64c(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t const *alpha,
2182
+ nk_f64c_t const *beta, nk_f64c_t *r) {
2183
+ #if NK_TARGET_SKYLAKE
2184
+ nk_each_blend_f64c_skylake(a, b, n, alpha, beta, r);
2185
+ #elif NK_TARGET_HASWELL
2186
+ nk_each_blend_f64c_haswell(a, b, n, alpha, beta, r);
2187
+ #elif NK_TARGET_NEON
2188
+ nk_each_blend_f64c_neon(a, b, n, alpha, beta, r);
2189
+ #elif NK_TARGET_RVV
2190
+ nk_each_blend_f64c_rvv(a, b, n, alpha, beta, r);
2191
+ #else
2192
+ nk_each_blend_f64c_serial(a, b, n, alpha, beta, r);
2193
+ #endif
2194
+ }
2195
+
2196
+ NK_PUBLIC void nk_each_fma_f32c(nk_f32c_t const *a, nk_f32c_t const *b, nk_f32c_t const *c, nk_size_t n,
2197
+ nk_f32c_t const *alpha, nk_f32c_t const *beta, nk_f32c_t *r) {
2198
+ #if NK_TARGET_SKYLAKE
2199
+ nk_each_fma_f32c_skylake(a, b, c, n, alpha, beta, r);
2200
+ #elif NK_TARGET_HASWELL
2201
+ nk_each_fma_f32c_haswell(a, b, c, n, alpha, beta, r);
2202
+ #elif NK_TARGET_NEON
2203
+ nk_each_fma_f32c_neon(a, b, c, n, alpha, beta, r);
2204
+ #elif NK_TARGET_RVV
2205
+ nk_each_fma_f32c_rvv(a, b, c, n, alpha, beta, r);
2206
+ #else
2207
+ nk_each_fma_f32c_serial(a, b, c, n, alpha, beta, r);
2208
+ #endif
2209
+ }
2210
+
2211
+ NK_PUBLIC void nk_each_fma_f64c(nk_f64c_t const *a, nk_f64c_t const *b, nk_f64c_t const *c, nk_size_t n,
2212
+ nk_f64c_t const *alpha, nk_f64c_t const *beta, nk_f64c_t *r) {
2213
+ #if NK_TARGET_SKYLAKE
2214
+ nk_each_fma_f64c_skylake(a, b, c, n, alpha, beta, r);
2215
+ #elif NK_TARGET_HASWELL
2216
+ nk_each_fma_f64c_haswell(a, b, c, n, alpha, beta, r);
2217
+ #elif NK_TARGET_NEON
2218
+ nk_each_fma_f64c_neon(a, b, c, n, alpha, beta, r);
2219
+ #elif NK_TARGET_RVV
2220
+ nk_each_fma_f64c_rvv(a, b, c, n, alpha, beta, r);
2221
+ #else
2222
+ nk_each_fma_f64c_serial(a, b, c, n, alpha, beta, r);
2223
+ #endif
2224
+ }
2225
+
2226
+ #endif // !NK_DYNAMIC_DISPATCH
2227
+
2228
+ #if defined(__cplusplus)
2229
+ } // extern "C"
2230
+ #endif
2231
+
2232
+ #endif // NK_EACH_H