usearch 2.21.4 → 2.25.1

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 (604) hide show
  1. package/README.md +65 -69
  2. package/binding.gyp +15 -37
  3. package/c/CMakeLists.txt +4 -5
  4. package/c/README.md +8 -8
  5. package/c/lib.cpp +32 -14
  6. package/c/test.c +124 -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/README.md +1 -1
  16. package/javascript/dist/cjs/usearch.d.ts +8 -3
  17. package/javascript/dist/cjs/usearch.js +12 -4
  18. package/javascript/dist/esm/usearch.d.ts +8 -3
  19. package/javascript/dist/esm/usearch.js +12 -4
  20. package/javascript/lib.cpp +17 -0
  21. package/javascript/usearch.test.js +117 -94
  22. package/javascript/usearch.ts +14 -6
  23. package/numkong/.clang-tidy +30 -0
  24. package/{simsimd → numkong}/.cmake-format.py +18 -0
  25. package/numkong/.editorconfig +12 -0
  26. package/numkong/.git-blame-ignore-revs +123 -0
  27. package/numkong/.mailmap +15 -0
  28. package/numkong/.spi.yml +11 -0
  29. package/numkong/.swift-format +14 -0
  30. package/numkong/CITATION.cff +81 -0
  31. package/numkong/CONTRIBUTING.md +500 -0
  32. package/numkong/Cargo.toml +54 -0
  33. package/numkong/MANIFEST.in +8 -0
  34. package/numkong/Package.swift +84 -0
  35. package/numkong/README.md +569 -0
  36. package/numkong/bench/README.md +217 -0
  37. package/numkong/bench/bench-browser.html +323 -0
  38. package/numkong/bench/bench.cpp +344 -0
  39. package/numkong/bench/bench.hpp +816 -0
  40. package/numkong/bench/bench.js +148 -0
  41. package/numkong/bench/bench.mjs +616 -0
  42. package/numkong/bench/bench_attention.cpp +113 -0
  43. package/numkong/bench/bench_cast.cpp +264 -0
  44. package/numkong/bench/bench_cross_amx.cpp +62 -0
  45. package/numkong/bench/bench_cross_arm.cpp +245 -0
  46. package/numkong/bench/bench_cross_blas.cpp +309 -0
  47. package/numkong/bench/bench_cross_loongarch.cpp +106 -0
  48. package/numkong/bench/bench_cross_power.cpp +84 -0
  49. package/numkong/bench/bench_cross_rvv.cpp +121 -0
  50. package/numkong/bench/bench_cross_serial.cpp +151 -0
  51. package/numkong/bench/bench_cross_sme.cpp +163 -0
  52. package/numkong/bench/bench_cross_wasm.cpp +142 -0
  53. package/numkong/bench/bench_cross_x86.cpp +455 -0
  54. package/numkong/bench/bench_curved.cpp +210 -0
  55. package/numkong/bench/bench_dot.cpp +315 -0
  56. package/numkong/bench/bench_each.cpp +503 -0
  57. package/numkong/bench/bench_geospatial.cpp +112 -0
  58. package/numkong/bench/bench_maxsim.cpp +154 -0
  59. package/numkong/bench/bench_mesh.cpp +148 -0
  60. package/numkong/bench/bench_probability.cpp +60 -0
  61. package/numkong/bench/bench_reduce.cpp +371 -0
  62. package/numkong/bench/bench_set.cpp +73 -0
  63. package/numkong/bench/bench_sparse.cpp +198 -0
  64. package/numkong/bench/bench_spatial.cpp +347 -0
  65. package/numkong/bench/bench_trigonometry.cpp +137 -0
  66. package/numkong/bench/swift/Bench.swift +506 -0
  67. package/numkong/binding.gyp +169 -0
  68. package/numkong/build.rs +484 -0
  69. package/numkong/c/dispatch.h +512 -0
  70. package/numkong/c/dispatch_bf16.c +447 -0
  71. package/numkong/c/dispatch_bf16c.c +52 -0
  72. package/numkong/c/dispatch_e2m3.c +296 -0
  73. package/numkong/c/dispatch_e3m2.c +284 -0
  74. package/numkong/c/dispatch_e4m3.c +318 -0
  75. package/numkong/c/dispatch_e5m2.c +316 -0
  76. package/numkong/c/dispatch_f16.c +452 -0
  77. package/numkong/c/dispatch_f16c.c +58 -0
  78. package/numkong/c/dispatch_f32.c +434 -0
  79. package/numkong/c/dispatch_f32c.c +99 -0
  80. package/numkong/c/dispatch_f64.c +348 -0
  81. package/numkong/c/dispatch_f64c.c +98 -0
  82. package/numkong/c/dispatch_i16.c +96 -0
  83. package/numkong/c/dispatch_i32.c +89 -0
  84. package/numkong/c/dispatch_i4.c +153 -0
  85. package/numkong/c/dispatch_i64.c +86 -0
  86. package/numkong/c/dispatch_i8.c +348 -0
  87. package/numkong/c/dispatch_other.c +348 -0
  88. package/numkong/c/dispatch_u1.c +193 -0
  89. package/numkong/c/dispatch_u16.c +124 -0
  90. package/numkong/c/dispatch_u32.c +118 -0
  91. package/numkong/c/dispatch_u4.c +153 -0
  92. package/numkong/c/dispatch_u64.c +102 -0
  93. package/numkong/c/dispatch_u8.c +364 -0
  94. package/numkong/c/numkong.c +940 -0
  95. package/numkong/cmake/nk_arm_isa_probes.cmake +61 -0
  96. package/numkong/cmake/nk_isa_probe.cmake +90 -0
  97. package/numkong/cmake/nk_loongarch_isa_probes.cmake +15 -0
  98. package/numkong/cmake/nk_math_lib.cmake +46 -0
  99. package/numkong/cmake/nk_power_isa_probes.cmake +15 -0
  100. package/numkong/cmake/nk_riscv_isa_probes.cmake +19 -0
  101. package/numkong/cmake/nk_x86_isa_probes.cmake +35 -0
  102. package/numkong/cmake/toolchain-aarch64-gnu.cmake +86 -0
  103. package/numkong/cmake/toolchain-android-arm64.cmake +25 -0
  104. package/numkong/cmake/toolchain-android-armv7.cmake +25 -0
  105. package/numkong/cmake/toolchain-loongarch64-gnu.cmake +68 -0
  106. package/numkong/cmake/toolchain-ppc64le-gnu.cmake +74 -0
  107. package/numkong/cmake/toolchain-riscv64-gnu.cmake +107 -0
  108. package/numkong/cmake/toolchain-riscv64-llvm.cmake +114 -0
  109. package/numkong/cmake/toolchain-wasi.cmake +77 -0
  110. package/numkong/cmake/toolchain-wasm.cmake +70 -0
  111. package/numkong/cmake/toolchain-wasm64.cmake +62 -0
  112. package/numkong/cmake/toolchain-x86_64-llvm.cmake +47 -0
  113. package/numkong/include/README.md +643 -0
  114. package/numkong/include/module.modulemap +129 -0
  115. package/numkong/include/numkong/attention/sapphireamx.h +1363 -0
  116. package/numkong/include/numkong/attention/sme.h +2075 -0
  117. package/numkong/include/numkong/attention.h +49 -0
  118. package/numkong/include/numkong/capabilities.h +930 -0
  119. package/numkong/include/numkong/cast/README.md +262 -0
  120. package/numkong/include/numkong/cast/diamond.h +64 -0
  121. package/numkong/include/numkong/cast/haswell.h +823 -0
  122. package/numkong/include/numkong/cast/icelake.h +475 -0
  123. package/numkong/include/numkong/cast/loongsonasx.h +252 -0
  124. package/numkong/include/numkong/cast/neon.h +1174 -0
  125. package/numkong/include/numkong/cast/powervsx.h +449 -0
  126. package/numkong/include/numkong/cast/rvv.h +970 -0
  127. package/numkong/include/numkong/cast/sapphire.h +262 -0
  128. package/numkong/include/numkong/cast/serial.h +2336 -0
  129. package/numkong/include/numkong/cast/skylake.h +915 -0
  130. package/numkong/include/numkong/cast/v128relaxed.h +537 -0
  131. package/numkong/include/numkong/cast.h +254 -0
  132. package/numkong/include/numkong/cast.hpp +44 -0
  133. package/numkong/include/numkong/curved/README.md +223 -0
  134. package/numkong/include/numkong/curved/genoa.h +182 -0
  135. package/numkong/include/numkong/curved/haswell.h +276 -0
  136. package/numkong/include/numkong/curved/neon.h +329 -0
  137. package/numkong/include/numkong/curved/neonbfdot.h +211 -0
  138. package/numkong/include/numkong/curved/rvv.h +305 -0
  139. package/numkong/include/numkong/curved/serial.h +207 -0
  140. package/numkong/include/numkong/curved/skylake.h +457 -0
  141. package/numkong/include/numkong/curved/smef64.h +530 -0
  142. package/numkong/include/numkong/curved.h +513 -0
  143. package/numkong/include/numkong/curved.hpp +144 -0
  144. package/numkong/include/numkong/dot/README.md +442 -0
  145. package/numkong/include/numkong/dot/alder.h +563 -0
  146. package/numkong/include/numkong/dot/diamond.h +158 -0
  147. package/numkong/include/numkong/dot/genoa.h +289 -0
  148. package/numkong/include/numkong/dot/haswell.h +1723 -0
  149. package/numkong/include/numkong/dot/icelake.h +997 -0
  150. package/numkong/include/numkong/dot/loongsonasx.h +671 -0
  151. package/numkong/include/numkong/dot/neon.h +869 -0
  152. package/numkong/include/numkong/dot/neonbfdot.h +243 -0
  153. package/numkong/include/numkong/dot/neonfhm.h +358 -0
  154. package/numkong/include/numkong/dot/neonfp8.h +323 -0
  155. package/numkong/include/numkong/dot/neonsdot.h +622 -0
  156. package/numkong/include/numkong/dot/powervsx.h +752 -0
  157. package/numkong/include/numkong/dot/rvv.h +722 -0
  158. package/numkong/include/numkong/dot/rvvbb.h +72 -0
  159. package/numkong/include/numkong/dot/rvvbf16.h +123 -0
  160. package/numkong/include/numkong/dot/rvvhalf.h +129 -0
  161. package/numkong/include/numkong/dot/sapphire.h +141 -0
  162. package/numkong/include/numkong/dot/serial.h +874 -0
  163. package/numkong/include/numkong/dot/sierra.h +405 -0
  164. package/numkong/include/numkong/dot/skylake.h +1116 -0
  165. package/numkong/include/numkong/dot/sve.h +420 -0
  166. package/numkong/include/numkong/dot/svebfdot.h +75 -0
  167. package/numkong/include/numkong/dot/svehalf.h +168 -0
  168. package/numkong/include/numkong/dot/svesdot.h +90 -0
  169. package/numkong/include/numkong/dot/v128relaxed.h +1293 -0
  170. package/numkong/include/numkong/dot.h +1136 -0
  171. package/numkong/include/numkong/dot.hpp +94 -0
  172. package/numkong/include/numkong/dots/README.md +496 -0
  173. package/numkong/include/numkong/dots/alder.h +117 -0
  174. package/numkong/include/numkong/dots/diamond.h +86 -0
  175. package/numkong/include/numkong/dots/genoa.h +100 -0
  176. package/numkong/include/numkong/dots/graniteamx.h +733 -0
  177. package/numkong/include/numkong/dots/haswell.h +310 -0
  178. package/numkong/include/numkong/dots/icelake.h +180 -0
  179. package/numkong/include/numkong/dots/loongsonasx.h +176 -0
  180. package/numkong/include/numkong/dots/neon.h +123 -0
  181. package/numkong/include/numkong/dots/neonbfdot.h +59 -0
  182. package/numkong/include/numkong/dots/neonfhm.h +96 -0
  183. package/numkong/include/numkong/dots/neonfp8.h +99 -0
  184. package/numkong/include/numkong/dots/neonsdot.h +144 -0
  185. package/numkong/include/numkong/dots/powervsx.h +194 -0
  186. package/numkong/include/numkong/dots/rvv.h +2593 -0
  187. package/numkong/include/numkong/dots/sapphireamx.h +4017 -0
  188. package/numkong/include/numkong/dots/serial.h +2867 -0
  189. package/numkong/include/numkong/dots/sierra.h +100 -0
  190. package/numkong/include/numkong/dots/skylake.h +207 -0
  191. package/numkong/include/numkong/dots/sme.h +5041 -0
  192. package/numkong/include/numkong/dots/smebi32.h +477 -0
  193. package/numkong/include/numkong/dots/smef64.h +1328 -0
  194. package/numkong/include/numkong/dots/smehalf.h +47 -0
  195. package/numkong/include/numkong/dots/v128relaxed.h +317 -0
  196. package/numkong/include/numkong/dots.h +3110 -0
  197. package/numkong/include/numkong/dots.hpp +641 -0
  198. package/numkong/include/numkong/each/README.md +465 -0
  199. package/numkong/include/numkong/each/haswell.h +1658 -0
  200. package/numkong/include/numkong/each/icelake.h +272 -0
  201. package/numkong/include/numkong/each/neon.h +1138 -0
  202. package/numkong/include/numkong/each/neonbfdot.h +211 -0
  203. package/numkong/include/numkong/each/neonhalf.h +318 -0
  204. package/numkong/include/numkong/each/rvv.h +1121 -0
  205. package/numkong/include/numkong/each/sapphire.h +343 -0
  206. package/numkong/include/numkong/each/serial.h +282 -0
  207. package/numkong/include/numkong/each/skylake.h +1562 -0
  208. package/numkong/include/numkong/each/v128relaxed.h +562 -0
  209. package/numkong/include/numkong/each.h +2232 -0
  210. package/numkong/include/numkong/each.hpp +434 -0
  211. package/numkong/include/numkong/geospatial/README.md +147 -0
  212. package/numkong/include/numkong/geospatial/haswell.h +633 -0
  213. package/numkong/include/numkong/geospatial/neon.h +615 -0
  214. package/numkong/include/numkong/geospatial/rvv.h +701 -0
  215. package/numkong/include/numkong/geospatial/serial.h +309 -0
  216. package/numkong/include/numkong/geospatial/skylake.h +613 -0
  217. package/numkong/include/numkong/geospatial/v128relaxed.h +652 -0
  218. package/numkong/include/numkong/geospatial.h +453 -0
  219. package/numkong/include/numkong/geospatial.hpp +235 -0
  220. package/numkong/include/numkong/matrix.hpp +336 -0
  221. package/numkong/include/numkong/maxsim/README.md +187 -0
  222. package/numkong/include/numkong/maxsim/alder.h +511 -0
  223. package/numkong/include/numkong/maxsim/genoa.h +115 -0
  224. package/numkong/include/numkong/maxsim/haswell.h +553 -0
  225. package/numkong/include/numkong/maxsim/icelake.h +480 -0
  226. package/numkong/include/numkong/maxsim/neonsdot.h +394 -0
  227. package/numkong/include/numkong/maxsim/sapphireamx.h +877 -0
  228. package/numkong/include/numkong/maxsim/serial.h +490 -0
  229. package/numkong/include/numkong/maxsim/sme.h +993 -0
  230. package/numkong/include/numkong/maxsim/v128relaxed.h +280 -0
  231. package/numkong/include/numkong/maxsim.h +571 -0
  232. package/numkong/include/numkong/maxsim.hpp +133 -0
  233. package/numkong/include/numkong/mesh/README.md +219 -0
  234. package/numkong/include/numkong/mesh/haswell.h +2013 -0
  235. package/numkong/include/numkong/mesh/neon.h +1821 -0
  236. package/numkong/include/numkong/mesh/neonbfdot.h +771 -0
  237. package/numkong/include/numkong/mesh/rvv.h +936 -0
  238. package/numkong/include/numkong/mesh/serial.h +721 -0
  239. package/numkong/include/numkong/mesh/skylake.h +2344 -0
  240. package/numkong/include/numkong/mesh/v128relaxed.h +1081 -0
  241. package/numkong/include/numkong/mesh.h +666 -0
  242. package/numkong/include/numkong/mesh.hpp +701 -0
  243. package/numkong/include/numkong/numkong.h +78 -0
  244. package/numkong/include/numkong/numkong.hpp +58 -0
  245. package/numkong/include/numkong/probability/README.md +177 -0
  246. package/numkong/include/numkong/probability/haswell.h +267 -0
  247. package/numkong/include/numkong/probability/neon.h +255 -0
  248. package/numkong/include/numkong/probability/rvv.h +414 -0
  249. package/numkong/include/numkong/probability/serial.h +181 -0
  250. package/numkong/include/numkong/probability/skylake.h +324 -0
  251. package/numkong/include/numkong/probability.h +380 -0
  252. package/numkong/include/numkong/probability.hpp +120 -0
  253. package/numkong/include/numkong/random.h +50 -0
  254. package/numkong/include/numkong/random.hpp +285 -0
  255. package/numkong/include/numkong/reduce/README.md +552 -0
  256. package/numkong/include/numkong/reduce/alder.h +636 -0
  257. package/numkong/include/numkong/reduce/genoa.h +201 -0
  258. package/numkong/include/numkong/reduce/haswell.h +3785 -0
  259. package/numkong/include/numkong/reduce/icelake.h +549 -0
  260. package/numkong/include/numkong/reduce/neon.h +3980 -0
  261. package/numkong/include/numkong/reduce/neonbfdot.h +142 -0
  262. package/numkong/include/numkong/reduce/neonfhm.h +293 -0
  263. package/numkong/include/numkong/reduce/neonsdot.h +357 -0
  264. package/numkong/include/numkong/reduce/rvv.h +3533 -0
  265. package/numkong/include/numkong/reduce/serial.h +753 -0
  266. package/numkong/include/numkong/reduce/sierra.h +338 -0
  267. package/numkong/include/numkong/reduce/skylake.h +3794 -0
  268. package/numkong/include/numkong/reduce/sve.h +52 -0
  269. package/numkong/include/numkong/reduce/v128relaxed.h +2302 -0
  270. package/numkong/include/numkong/reduce.h +1582 -0
  271. package/numkong/include/numkong/reduce.hpp +778 -0
  272. package/numkong/include/numkong/scalar/README.md +89 -0
  273. package/numkong/include/numkong/scalar/haswell.h +122 -0
  274. package/numkong/include/numkong/scalar/loongsonasx.h +74 -0
  275. package/numkong/include/numkong/scalar/neon.h +122 -0
  276. package/numkong/include/numkong/scalar/neonhalf.h +70 -0
  277. package/numkong/include/numkong/scalar/powervsx.h +96 -0
  278. package/numkong/include/numkong/scalar/rvv.h +211 -0
  279. package/numkong/include/numkong/scalar/sapphire.h +74 -0
  280. package/numkong/include/numkong/scalar/serial.h +332 -0
  281. package/numkong/include/numkong/scalar/v128relaxed.h +56 -0
  282. package/numkong/include/numkong/scalar.h +696 -0
  283. package/numkong/include/numkong/set/README.md +179 -0
  284. package/numkong/include/numkong/set/haswell.h +334 -0
  285. package/numkong/include/numkong/set/icelake.h +485 -0
  286. package/numkong/include/numkong/set/loongsonasx.h +181 -0
  287. package/numkong/include/numkong/set/neon.h +363 -0
  288. package/numkong/include/numkong/set/powervsx.h +326 -0
  289. package/numkong/include/numkong/set/rvv.h +226 -0
  290. package/numkong/include/numkong/set/rvvbb.h +117 -0
  291. package/numkong/include/numkong/set/serial.h +174 -0
  292. package/numkong/include/numkong/set/sve.h +187 -0
  293. package/numkong/include/numkong/set/v128relaxed.h +240 -0
  294. package/numkong/include/numkong/set.h +471 -0
  295. package/numkong/include/numkong/set.hpp +114 -0
  296. package/numkong/include/numkong/sets/README.md +149 -0
  297. package/numkong/include/numkong/sets/haswell.h +63 -0
  298. package/numkong/include/numkong/sets/icelake.h +66 -0
  299. package/numkong/include/numkong/sets/loongsonasx.h +52 -0
  300. package/numkong/include/numkong/sets/neon.h +61 -0
  301. package/numkong/include/numkong/sets/powervsx.h +65 -0
  302. package/numkong/include/numkong/sets/serial.h +43 -0
  303. package/numkong/include/numkong/sets/smebi32.h +1135 -0
  304. package/numkong/include/numkong/sets/v128relaxed.h +58 -0
  305. package/numkong/include/numkong/sets.h +382 -0
  306. package/numkong/include/numkong/sparse/README.md +156 -0
  307. package/numkong/include/numkong/sparse/icelake.h +463 -0
  308. package/numkong/include/numkong/sparse/neon.h +288 -0
  309. package/numkong/include/numkong/sparse/serial.h +117 -0
  310. package/numkong/include/numkong/sparse/sve2.h +504 -0
  311. package/numkong/include/numkong/sparse/turin.h +322 -0
  312. package/numkong/include/numkong/sparse.h +363 -0
  313. package/numkong/include/numkong/sparse.hpp +113 -0
  314. package/numkong/include/numkong/spatial/README.md +439 -0
  315. package/numkong/include/numkong/spatial/alder.h +604 -0
  316. package/numkong/include/numkong/spatial/diamond.h +240 -0
  317. package/numkong/include/numkong/spatial/genoa.h +222 -0
  318. package/numkong/include/numkong/spatial/haswell.h +979 -0
  319. package/numkong/include/numkong/spatial/icelake.h +1067 -0
  320. package/numkong/include/numkong/spatial/loongsonasx.h +483 -0
  321. package/numkong/include/numkong/spatial/neon.h +846 -0
  322. package/numkong/include/numkong/spatial/neonbfdot.h +164 -0
  323. package/numkong/include/numkong/spatial/neonfp8.h +258 -0
  324. package/numkong/include/numkong/spatial/neonsdot.h +429 -0
  325. package/numkong/include/numkong/spatial/powervsx.h +738 -0
  326. package/numkong/include/numkong/spatial/rvv.h +991 -0
  327. package/numkong/include/numkong/spatial/rvvbf16.h +128 -0
  328. package/numkong/include/numkong/spatial/rvvhalf.h +120 -0
  329. package/numkong/include/numkong/spatial/serial.h +347 -0
  330. package/numkong/include/numkong/spatial/sierra.h +516 -0
  331. package/numkong/include/numkong/spatial/skylake.h +605 -0
  332. package/numkong/include/numkong/spatial/sve.h +246 -0
  333. package/numkong/include/numkong/spatial/svebfdot.h +125 -0
  334. package/numkong/include/numkong/spatial/svehalf.h +136 -0
  335. package/numkong/include/numkong/spatial/svesdot.h +143 -0
  336. package/numkong/include/numkong/spatial/v128relaxed.h +969 -0
  337. package/numkong/include/numkong/spatial.h +1681 -0
  338. package/numkong/include/numkong/spatial.hpp +183 -0
  339. package/numkong/include/numkong/spatials/README.md +580 -0
  340. package/numkong/include/numkong/spatials/alder.h +94 -0
  341. package/numkong/include/numkong/spatials/diamond.h +82 -0
  342. package/numkong/include/numkong/spatials/genoa.h +94 -0
  343. package/numkong/include/numkong/spatials/graniteamx.h +173 -0
  344. package/numkong/include/numkong/spatials/haswell.h +219 -0
  345. package/numkong/include/numkong/spatials/icelake.h +113 -0
  346. package/numkong/include/numkong/spatials/loongsonasx.h +153 -0
  347. package/numkong/include/numkong/spatials/neon.h +109 -0
  348. package/numkong/include/numkong/spatials/neonbfdot.h +60 -0
  349. package/numkong/include/numkong/spatials/neonfhm.h +92 -0
  350. package/numkong/include/numkong/spatials/neonfp8.h +111 -0
  351. package/numkong/include/numkong/spatials/neonsdot.h +143 -0
  352. package/numkong/include/numkong/spatials/powervsx.h +153 -0
  353. package/numkong/include/numkong/spatials/rvv.h +1976 -0
  354. package/numkong/include/numkong/spatials/sapphireamx.h +1149 -0
  355. package/numkong/include/numkong/spatials/serial.h +248 -0
  356. package/numkong/include/numkong/spatials/sierra.h +96 -0
  357. package/numkong/include/numkong/spatials/skylake.h +184 -0
  358. package/numkong/include/numkong/spatials/sme.h +1927 -0
  359. package/numkong/include/numkong/spatials/smef64.h +483 -0
  360. package/numkong/include/numkong/spatials/v128relaxed.h +240 -0
  361. package/numkong/include/numkong/spatials.h +3374 -0
  362. package/numkong/include/numkong/spatials.hpp +509 -0
  363. package/numkong/include/numkong/tensor.hpp +1981 -0
  364. package/numkong/include/numkong/trigonometry/README.md +184 -0
  365. package/numkong/include/numkong/trigonometry/haswell.h +653 -0
  366. package/numkong/include/numkong/trigonometry/neon.h +638 -0
  367. package/numkong/include/numkong/trigonometry/rvv.h +700 -0
  368. package/numkong/include/numkong/trigonometry/serial.h +703 -0
  369. package/numkong/include/numkong/trigonometry/skylake.h +725 -0
  370. package/numkong/include/numkong/trigonometry/v128relaxed.h +667 -0
  371. package/numkong/include/numkong/trigonometry.h +467 -0
  372. package/numkong/include/numkong/trigonometry.hpp +166 -0
  373. package/numkong/include/numkong/types.h +1695 -0
  374. package/numkong/include/numkong/types.hpp +6027 -0
  375. package/numkong/include/numkong/vector.hpp +766 -0
  376. package/numkong/javascript/@numkong-darwin-arm64/package.json +26 -0
  377. package/numkong/javascript/@numkong-darwin-x64/package.json +26 -0
  378. package/numkong/javascript/@numkong-linux-arm64/package.json +25 -0
  379. package/numkong/javascript/@numkong-linux-x64/package.json +25 -0
  380. package/numkong/javascript/@numkong-win32-arm64/package.json +25 -0
  381. package/numkong/javascript/@numkong-win32-x64/package.json +25 -0
  382. package/numkong/javascript/README.md +254 -0
  383. package/numkong/javascript/node-gyp-build.d.ts +4 -0
  384. package/numkong/javascript/numkong-browser.ts +40 -0
  385. package/numkong/javascript/numkong-wasm.ts +750 -0
  386. package/numkong/javascript/numkong.c +712 -0
  387. package/numkong/javascript/numkong.ts +613 -0
  388. package/{simsimd → numkong}/javascript/tsconfig-base.json +6 -3
  389. package/numkong/javascript/tsconfig-cjs.json +13 -0
  390. package/{simsimd → numkong}/javascript/tsconfig-esm.json +1 -1
  391. package/numkong/javascript/types.ts +784 -0
  392. package/numkong/numkong.gypi +104 -0
  393. package/numkong/package.json +108 -0
  394. package/numkong/probes/arm_neon.c +8 -0
  395. package/numkong/probes/arm_neon_bfdot.c +9 -0
  396. package/numkong/probes/arm_neon_fhm.c +9 -0
  397. package/numkong/probes/arm_neon_half.c +8 -0
  398. package/numkong/probes/arm_neon_sdot.c +9 -0
  399. package/numkong/probes/arm_neonfp8.c +9 -0
  400. package/numkong/probes/arm_sme.c +16 -0
  401. package/numkong/probes/arm_sme2.c +16 -0
  402. package/numkong/probes/arm_sme2p1.c +16 -0
  403. package/numkong/probes/arm_sme_bf16.c +16 -0
  404. package/numkong/probes/arm_sme_bi32.c +16 -0
  405. package/numkong/probes/arm_sme_f64.c +16 -0
  406. package/numkong/probes/arm_sme_fa64.c +14 -0
  407. package/numkong/probes/arm_sme_half.c +16 -0
  408. package/numkong/probes/arm_sme_lut2.c +15 -0
  409. package/numkong/probes/arm_sve.c +18 -0
  410. package/numkong/probes/arm_sve2.c +20 -0
  411. package/numkong/probes/arm_sve2p1.c +18 -0
  412. package/numkong/probes/arm_sve_bfdot.c +20 -0
  413. package/numkong/probes/arm_sve_half.c +18 -0
  414. package/numkong/probes/arm_sve_sdot.c +21 -0
  415. package/numkong/probes/loongarch_lasx.c +12 -0
  416. package/numkong/probes/power_vsx.c +12 -0
  417. package/numkong/probes/probe.js +127 -0
  418. package/numkong/probes/riscv_rvv.c +14 -0
  419. package/numkong/probes/riscv_rvv_bb.c +15 -0
  420. package/numkong/probes/riscv_rvv_bf16.c +17 -0
  421. package/numkong/probes/riscv_rvv_half.c +14 -0
  422. package/numkong/probes/wasm_v128relaxed.c +11 -0
  423. package/numkong/probes/x86_alder.c +17 -0
  424. package/numkong/probes/x86_diamond.c +17 -0
  425. package/numkong/probes/x86_genoa.c +17 -0
  426. package/numkong/probes/x86_graniteamx.c +19 -0
  427. package/numkong/probes/x86_haswell.c +11 -0
  428. package/numkong/probes/x86_icelake.c +17 -0
  429. package/numkong/probes/x86_sapphire.c +16 -0
  430. package/numkong/probes/x86_sapphireamx.c +18 -0
  431. package/numkong/probes/x86_sierra.c +17 -0
  432. package/numkong/probes/x86_skylake.c +15 -0
  433. package/numkong/probes/x86_turin.c +17 -0
  434. package/numkong/rust/README.md +698 -0
  435. package/numkong/rust/capabilities.rs +96 -0
  436. package/numkong/rust/cast.rs +314 -0
  437. package/numkong/rust/curved.rs +391 -0
  438. package/numkong/rust/each.rs +2721 -0
  439. package/numkong/rust/geospatial.rs +343 -0
  440. package/numkong/rust/matrix.rs +5424 -0
  441. package/numkong/rust/maxsim.rs +540 -0
  442. package/numkong/rust/mesh.rs +837 -0
  443. package/numkong/rust/numkong.rs +409 -0
  444. package/numkong/rust/probability.rs +272 -0
  445. package/numkong/rust/reduce.rs +1249 -0
  446. package/numkong/rust/set.rs +194 -0
  447. package/numkong/rust/sparse.rs +513 -0
  448. package/numkong/rust/spatial.rs +1815 -0
  449. package/numkong/rust/tensor.rs +7565 -0
  450. package/numkong/rust/types.rs +3666 -0
  451. package/numkong/rust/vector.rs +1899 -0
  452. package/numkong/rustfmt.toml +2 -0
  453. package/numkong/swift/Matrix.swift +1388 -0
  454. package/numkong/swift/MaxSim.swift +151 -0
  455. package/numkong/swift/NumKong.swift +283 -0
  456. package/numkong/swift/Numerics.swift +329 -0
  457. package/numkong/swift/README.md +433 -0
  458. package/numkong/swift/Scalar.swift +741 -0
  459. package/numkong/swift/Tensor.swift +209 -0
  460. package/numkong/test/README.md +315 -0
  461. package/numkong/test/playwright.config.ts +16 -0
  462. package/numkong/test/swift/Test.swift +534 -0
  463. package/numkong/test/test-browser-bundle-runner.mjs +36 -0
  464. package/numkong/test/test-browser-bundle.html +188 -0
  465. package/numkong/test/test-browser-runner.mjs +43 -0
  466. package/numkong/test/test-browser.html +305 -0
  467. package/numkong/test/test-dtypes.mjs +453 -0
  468. package/numkong/test/test-wasm.mjs +267 -0
  469. package/numkong/test/test.cpp +442 -0
  470. package/numkong/test/test.hpp +580 -0
  471. package/numkong/test/test.mjs +363 -0
  472. package/numkong/test/test_base.py +1041 -0
  473. package/numkong/test/test_cast.cpp +242 -0
  474. package/numkong/test/test_cross.hpp +551 -0
  475. package/numkong/test/test_cross.py +467 -0
  476. package/numkong/test/test_cross_amx.cpp +50 -0
  477. package/numkong/test/test_cross_arm.cpp +225 -0
  478. package/numkong/test/test_cross_blas.cpp +354 -0
  479. package/numkong/test/test_cross_loongarch.cpp +90 -0
  480. package/numkong/test/test_cross_power.cpp +73 -0
  481. package/numkong/test/test_cross_rvv.cpp +109 -0
  482. package/numkong/test/test_cross_serial.cpp +181 -0
  483. package/numkong/test/test_cross_sme.cpp +148 -0
  484. package/numkong/test/test_cross_wasm.cpp +141 -0
  485. package/numkong/test/test_cross_x86.cpp +442 -0
  486. package/numkong/test/test_curved.cpp +182 -0
  487. package/numkong/test/test_curved.py +207 -0
  488. package/numkong/test/test_dot.cpp +353 -0
  489. package/numkong/test/test_dot.py +296 -0
  490. package/numkong/test/test_each.cpp +437 -0
  491. package/numkong/test/test_each.py +756 -0
  492. package/numkong/test/test_geospatial.cpp +155 -0
  493. package/numkong/test/test_geospatial.py +241 -0
  494. package/numkong/test/test_maxsim.cpp +138 -0
  495. package/numkong/test/test_maxsim.py +209 -0
  496. package/numkong/test/test_mesh.cpp +203 -0
  497. package/numkong/test/test_mesh.py +394 -0
  498. package/numkong/test/test_probability.cpp +136 -0
  499. package/numkong/test/test_probability.py +166 -0
  500. package/numkong/test/test_reduce.cpp +563 -0
  501. package/numkong/test/test_reduce.py +781 -0
  502. package/numkong/test/test_set.cpp +151 -0
  503. package/numkong/test/test_set.py +120 -0
  504. package/numkong/test/test_similarities.py +579 -0
  505. package/numkong/test/test_sparse.cpp +121 -0
  506. package/numkong/test/test_sparse.py +118 -0
  507. package/numkong/test/test_spatial.cpp +518 -0
  508. package/numkong/test/test_spatial.py +269 -0
  509. package/numkong/test/test_tensor.cpp +884 -0
  510. package/numkong/test/test_tensor.py +1417 -0
  511. package/numkong/test/test_trigonometry.cpp +156 -0
  512. package/numkong/test/test_trigonometry.py +180 -0
  513. package/package.json +7 -8
  514. package/prebuilds/darwin-arm64+x64/usearch.node +0 -0
  515. package/prebuilds/linux-arm64/usearch.node +0 -0
  516. package/prebuilds/linux-x64/usearch.node +0 -0
  517. package/fp16/CMakeLists.txt +0 -176
  518. package/fp16/LICENSE +0 -11
  519. package/fp16/README.md +0 -20
  520. package/fp16/bench/alt-element.cc +0 -89
  521. package/fp16/bench/from-alt-array.cc +0 -175
  522. package/fp16/bench/from-ieee-array.cc +0 -399
  523. package/fp16/bench/ieee-element.cc +0 -272
  524. package/fp16/bench/to-alt-array.cc +0 -91
  525. package/fp16/bench/to-ieee-array.cc +0 -303
  526. package/fp16/cmake/DownloadGoogleBenchmark.cmake +0 -15
  527. package/fp16/cmake/DownloadGoogleTest.cmake +0 -15
  528. package/fp16/cmake/DownloadPSimd.cmake +0 -15
  529. package/fp16/configure.py +0 -65
  530. package/fp16/confu.yaml +0 -8
  531. package/fp16/include/fp16/__init__.py +0 -0
  532. package/fp16/include/fp16/avx.py +0 -50
  533. package/fp16/include/fp16/avx2.py +0 -53
  534. package/fp16/include/fp16/bitcasts.h +0 -92
  535. package/fp16/include/fp16/fp16.h +0 -451
  536. package/fp16/include/fp16/psimd.h +0 -131
  537. package/fp16/include/fp16.h +0 -11
  538. package/fp16/jni/Android.mk +0 -6
  539. package/fp16/jni/Application.mk +0 -4
  540. package/fp16/test/alt-from-fp32-value.cc +0 -498
  541. package/fp16/test/alt-to-fp32-bits.cc +0 -263
  542. package/fp16/test/alt-to-fp32-psimd.cc +0 -145
  543. package/fp16/test/alt-to-fp32-value.cc +0 -348
  544. package/fp16/test/alt-to-fp32x2-psimd.cc +0 -245
  545. package/fp16/test/bitcasts.cc +0 -56
  546. package/fp16/test/ieee-from-fp32-value.cc +0 -523
  547. package/fp16/test/ieee-to-fp32-bits.cc +0 -333
  548. package/fp16/test/ieee-to-fp32-psimd.cc +0 -312
  549. package/fp16/test/ieee-to-fp32-value.cc +0 -420
  550. package/fp16/test/ieee-to-fp32x2-psimd.cc +0 -541
  551. package/fp16/test/peachpy/alt-xmm-to-fp32-xmm-avx.cc +0 -96
  552. package/fp16/test/peachpy/alt-xmm-to-fp32-ymm-avx2.cc +0 -96
  553. package/fp16/test/peachpy/stubs.py +0 -38
  554. package/fp16/test/tables.cc +0 -530
  555. package/fp16/test/tables.h +0 -13
  556. package/fp16/third-party/THHalf.h +0 -92
  557. package/fp16/third-party/eigen-half.h +0 -170
  558. package/fp16/third-party/float16-compressor.h +0 -80
  559. package/fp16/third-party/half.hpp +0 -2916
  560. package/fp16/third-party/npy-halffloat.h +0 -328
  561. package/simsimd/.git-blame-ignore-revs +0 -2
  562. package/simsimd/CONTRIBUTING.md +0 -321
  563. package/simsimd/Cargo.toml +0 -49
  564. package/simsimd/MANIFEST.in +0 -4
  565. package/simsimd/Package.swift +0 -28
  566. package/simsimd/README.md +0 -1493
  567. package/simsimd/binding.gyp +0 -35
  568. package/simsimd/build.rs +0 -70
  569. package/simsimd/c/lib.c +0 -374
  570. package/simsimd/include/module.modulemap +0 -4
  571. package/simsimd/include/simsimd/binary.h +0 -486
  572. package/simsimd/include/simsimd/curved.h +0 -1541
  573. package/simsimd/include/simsimd/dot.h +0 -1853
  574. package/simsimd/include/simsimd/elementwise.h +0 -2465
  575. package/simsimd/include/simsimd/geospatial.h +0 -43
  576. package/simsimd/include/simsimd/mesh.h +0 -69
  577. package/simsimd/include/simsimd/probability.h +0 -606
  578. package/simsimd/include/simsimd/simsimd.h +0 -2567
  579. package/simsimd/include/simsimd/sparse.h +0 -1384
  580. package/simsimd/include/simsimd/spatial.h +0 -2335
  581. package/simsimd/include/simsimd/types.h +0 -666
  582. package/simsimd/javascript/fallback.ts +0 -233
  583. package/simsimd/javascript/lib.c +0 -125
  584. package/simsimd/javascript/node-gyp-build.d.ts +0 -1
  585. package/simsimd/javascript/simsimd.ts +0 -179
  586. package/simsimd/javascript/tsconfig-cjs.json +0 -8
  587. package/simsimd/package-lock.json +0 -1761
  588. package/simsimd/package.json +0 -61
  589. package/simsimd/rust/lib.rs +0 -1821
  590. package/simsimd/scripts/bench.cxx +0 -1170
  591. package/simsimd/scripts/bench.ipynb +0 -187
  592. package/simsimd/scripts/bench.js +0 -127
  593. package/simsimd/scripts/bench.rs +0 -876
  594. package/simsimd/scripts/bench_vectors.py +0 -734
  595. package/simsimd/scripts/bench_vectors_live.py +0 -213
  596. package/simsimd/scripts/test.c +0 -187
  597. package/simsimd/scripts/test.mjs +0 -220
  598. package/simsimd/scripts/test.py +0 -1505
  599. package/simsimd/swift/SimSIMD.swift +0 -149
  600. package/simsimd/swift/Test.swift +0 -128
  601. /package/{simsimd → numkong}/CODE_OF_CONDUCT.md +0 -0
  602. /package/{simsimd → numkong}/LICENSE +0 -0
  603. /package/{simsimd → numkong}/javascript/dist-package-cjs.json +0 -0
  604. /package/{simsimd → numkong}/javascript/dist-package-esm.json +0 -0
@@ -0,0 +1,1582 @@
1
+ /**
2
+ * @brief SIMD-accelerated Vector Reductions.
3
+ * @file include/numkong/reduce.h
4
+ * @author Ash Vardanian
5
+ * @date December 27, 2024
6
+ *
7
+ * Provides horizontal reduction operations over vectors with:
8
+ * - `nk_reduce_moments_*` — sum + sum-of-squares in one pass
9
+ * - `nk_reduce_minmax_*` — min + max with argmin/argmax in one pass
10
+ * - Dynamic dispatch for runtime ISA selection
11
+ *
12
+ * For dtypes:
13
+ *
14
+ * - f64: 64-bit IEEE floating point numbers
15
+ * - f32: 32-bit IEEE floating point numbers
16
+ * - f16: 16-bit IEEE floating point numbers
17
+ * - bf16: 16-bit brain floating point numbers
18
+ * - e4m3: 8-bit e4m3 floating point numbers
19
+ * - e5m2: 8-bit e5m2 floating point numbers
20
+ * - e2m3: 8-bit e2m3 floating point numbers (MX)
21
+ * - e3m2: 8-bit e3m2 floating point numbers (MX)
22
+ * - i8: 8-bit signed integers
23
+ * - u8: 8-bit unsigned integers
24
+ * - i16: 16-bit signed integers
25
+ * - u16: 16-bit unsigned integers
26
+ * - i32: 32-bit signed integers
27
+ * - u32: 32-bit unsigned integers
28
+ * - i64: 64-bit signed integers
29
+ * - u64: 64-bit unsigned integers
30
+ * - i4: 4-bit signed integers (packed pairs)
31
+ * - u4: 4-bit unsigned integers (packed pairs)
32
+ * - u1: 1-bit binary (packed octets)
33
+ *
34
+ * For hardware architectures:
35
+ *
36
+ * - Arm: NEON, NEON+F16, NEON+FHM, NEON+BF16, NEON+SDOT
37
+ * - x86: Haswell, Skylake, Ice Lake, Genoa, Sierra Forest
38
+ * - RISC-V: RVV
39
+ * - WASM: V128Relaxed
40
+ *
41
+ * @section numerical_stability Numerical stability
42
+ *
43
+ * All accumulations are performed with stable techniques and @b saturation in mind.
44
+ * Single-precision inputs are aggregated in double-precision. Double-precision
45
+ * inputs are handled with @b Neumaier-like compensated summation schemes. Mini-floats
46
+ * are propagated to more hardware-friendly types. And integer are handled with
47
+ * proper saturation logic, as opposed to simple pairwise saturation, meaning that
48
+ * if several extremely large values are followed by equal negative values, the
49
+ * sum will be zero.
50
+ *
51
+ * @code{.c}
52
+ *
53
+ * @endcode{.c}
54
+ *
55
+ *
56
+ * All MinMax scans are performed with respect to NaN values beyond simple total ordering.
57
+ * All positive and negative NaN values are masked out on the fly and can never be included
58
+ * in the output. For empty or NaN-only inputs, the returned argmin/argmax positions will
59
+ * be set to sentinel value @b `NK_SIZE_MAX`.
60
+ *
61
+ * @section reduction_strategy Reduction Strategy
62
+ *
63
+ * The key insight is that `_mm512_reduce_add_ps()` and similar intrinsics are
64
+ * actually serial operations - they don't parallelize the reduction across lanes.
65
+ * The correct approach is:
66
+ *
67
+ * 1. Accumulate vertically in SIMD registers throughout the entire loop
68
+ * 2. Perform a single horizontal reduction at the very end, reconstructing the lane positions
69
+ *
70
+ * @code{.c}
71
+ * __m512 sum_f32x16 = _mm512_setzero_ps();
72
+ * for (...) {
73
+ * __m512 data_f32x16 = _mm512_loadu_ps(ptr);
74
+ * sum_f32x16 = _mm512_add_ps(sum_f32x16, data_f32x16);
75
+ * }
76
+ * // Single horizontal reduce at the END only
77
+ * nk_f32_t result = nk_reduce_add_f32x16_skylake_(sum_f32x16);
78
+ * @endcode
79
+ *
80
+ * @section stride_handling Stride Handling Strategies
81
+ *
82
+ * - stride == sizeof(scalar): Contiguous SIMD loads with masked tail
83
+ * - Large stride with gather support: Use gather instructions (32/64-bit types)
84
+ * - Otherwise: Serial fallback
85
+ *
86
+ * @section argminmax Argmin/Argmax Strategy
87
+ *
88
+ * Single-pass algorithm tracking both value and index in SIMD registers:
89
+ * @code{.c}
90
+ * __m512 min_f32x16 = _mm512_set1_ps(FLT_MAX);
91
+ * __m512i min_idx_i32x16 = _mm512_setzero_si512();
92
+ * __m512i current_idx_i32x16 = _mm512_setr_epi32(0,1,2,3,...,15);
93
+ * __m512i step_i32x16 = _mm512_set1_epi32(16);
94
+ * for (...) {
95
+ * __m512 data_f32x16 = _mm512_loadu_ps(ptr);
96
+ * __mmask16 lt_mask = _mm512_cmp_ps_mask(data_f32x16, min_f32x16, _CMP_LT_OQ);
97
+ * min_f32x16 = _mm512_mask_mov_ps(min_f32x16, lt_mask, data_f32x16);
98
+ * min_idx_i32x16 = _mm512_mask_mov_epi32(min_idx_i32x16, lt_mask, current_idx_i32x16);
99
+ * current_idx_i32x16 = _mm512_add_epi32(current_idx_i32x16, step_i32x16);
100
+ * }
101
+ * @endcode
102
+ */
103
+ #ifndef NK_REDUCE_H
104
+ #define NK_REDUCE_H
105
+
106
+ #include "numkong/types.h"
107
+
108
+ #ifdef __cplusplus
109
+ extern "C" {
110
+ #endif
111
+
112
+ /**
113
+ * @brief Horizontal moments reduction (sum + sum-of-squares) over a strided array.
114
+ * @param[in] data Pointer to the input data.
115
+ * @param[in] count Number of elements to reduce.
116
+ * @param[in] stride_bytes Stride between elements in bytes, equal to `sizeof(*data)` for contiguous arrays.
117
+ * @param[out] sum_ptr Output sum.
118
+ * @param[out] sumsq_ptr Output sum of squares.
119
+ */
120
+ NK_DYNAMIC void nk_reduce_moments_f64(nk_f64_t const *data, nk_size_t count, nk_size_t stride_bytes, nk_f64_t *sum_ptr,
121
+ nk_f64_t *sumsq_ptr);
122
+
123
+ /**
124
+ * @brief Horizontal min+max reduction with argmin/argmax over a strided array.
125
+ * @param[in] data Pointer to the input data.
126
+ * @param[in] count Number of elements to reduce.
127
+ * @param[in] stride_bytes Stride between elements in bytes, equal to `sizeof(*data)` for contiguous arrays.
128
+ * @param[out] min_value_ptr Output minimum value.
129
+ * @param[out] min_index_ptr Output index of the minimum value.
130
+ * @param[out] max_value_ptr Output maximum value.
131
+ * @param[out] max_index_ptr Output index of the maximum value.
132
+ */
133
+ NK_DYNAMIC void nk_reduce_minmax_f64(nk_f64_t const *data, nk_size_t count, nk_size_t stride_bytes,
134
+ nk_f64_t *min_value_ptr, nk_size_t *min_index_ptr, nk_f64_t *max_value_ptr,
135
+ nk_size_t *max_index_ptr);
136
+
137
+ /** @copydoc nk_reduce_moments_f64 */
138
+ NK_DYNAMIC void nk_reduce_moments_f32(nk_f32_t const *data, nk_size_t count, nk_size_t stride_bytes, nk_f64_t *sum_ptr,
139
+ nk_f64_t *sumsq_ptr);
140
+ /** @copydoc nk_reduce_minmax_f64 */
141
+ NK_DYNAMIC void nk_reduce_minmax_f32(nk_f32_t const *data, nk_size_t count, nk_size_t stride_bytes,
142
+ nk_f32_t *min_value_ptr, nk_size_t *min_index_ptr, nk_f32_t *max_value_ptr,
143
+ nk_size_t *max_index_ptr);
144
+
145
+ /** @copydoc nk_reduce_moments_f64 */
146
+ NK_DYNAMIC void nk_reduce_moments_i8(nk_i8_t const *data, nk_size_t count, nk_size_t stride_bytes, nk_i64_t *sum_ptr,
147
+ nk_u64_t *sumsq_ptr);
148
+ /** @copydoc nk_reduce_minmax_f64 */
149
+ NK_DYNAMIC void nk_reduce_minmax_i8(nk_i8_t const *data, nk_size_t count, nk_size_t stride_bytes,
150
+ nk_i8_t *min_value_ptr, nk_size_t *min_index_ptr, nk_i8_t *max_value_ptr,
151
+ nk_size_t *max_index_ptr);
152
+
153
+ /** @copydoc nk_reduce_moments_f64 */
154
+ NK_DYNAMIC void nk_reduce_moments_u8(nk_u8_t const *data, nk_size_t count, nk_size_t stride_bytes, nk_u64_t *sum_ptr,
155
+ nk_u64_t *sumsq_ptr);
156
+ /** @copydoc nk_reduce_minmax_f64 */
157
+ NK_DYNAMIC void nk_reduce_minmax_u8(nk_u8_t const *data, nk_size_t count, nk_size_t stride_bytes,
158
+ nk_u8_t *min_value_ptr, nk_size_t *min_index_ptr, nk_u8_t *max_value_ptr,
159
+ nk_size_t *max_index_ptr);
160
+
161
+ /** @copydoc nk_reduce_moments_f64 */
162
+ NK_DYNAMIC void nk_reduce_moments_i16(nk_i16_t const *data, nk_size_t count, nk_size_t stride_bytes, nk_i64_t *sum_ptr,
163
+ nk_u64_t *sumsq_ptr);
164
+ /** @copydoc nk_reduce_minmax_f64 */
165
+ NK_DYNAMIC void nk_reduce_minmax_i16(nk_i16_t const *data, nk_size_t count, nk_size_t stride_bytes,
166
+ nk_i16_t *min_value_ptr, nk_size_t *min_index_ptr, nk_i16_t *max_value_ptr,
167
+ nk_size_t *max_index_ptr);
168
+
169
+ /** @copydoc nk_reduce_moments_f64 */
170
+ NK_DYNAMIC void nk_reduce_moments_u16(nk_u16_t const *data, nk_size_t count, nk_size_t stride_bytes, nk_u64_t *sum_ptr,
171
+ nk_u64_t *sumsq_ptr);
172
+ /** @copydoc nk_reduce_minmax_f64 */
173
+ NK_DYNAMIC void nk_reduce_minmax_u16(nk_u16_t const *data, nk_size_t count, nk_size_t stride_bytes,
174
+ nk_u16_t *min_value_ptr, nk_size_t *min_index_ptr, nk_u16_t *max_value_ptr,
175
+ nk_size_t *max_index_ptr);
176
+
177
+ /** @copydoc nk_reduce_moments_f64 */
178
+ NK_DYNAMIC void nk_reduce_moments_i32(nk_i32_t const *data, nk_size_t count, nk_size_t stride_bytes, nk_i64_t *sum_ptr,
179
+ nk_u64_t *sumsq_ptr);
180
+ /** @copydoc nk_reduce_minmax_f64 */
181
+ NK_DYNAMIC void nk_reduce_minmax_i32(nk_i32_t const *data, nk_size_t count, nk_size_t stride_bytes,
182
+ nk_i32_t *min_value_ptr, nk_size_t *min_index_ptr, nk_i32_t *max_value_ptr,
183
+ nk_size_t *max_index_ptr);
184
+
185
+ /** @copydoc nk_reduce_moments_f64 */
186
+ NK_DYNAMIC void nk_reduce_moments_u32(nk_u32_t const *data, nk_size_t count, nk_size_t stride_bytes, nk_u64_t *sum_ptr,
187
+ nk_u64_t *sumsq_ptr);
188
+ /** @copydoc nk_reduce_minmax_f64 */
189
+ NK_DYNAMIC void nk_reduce_minmax_u32(nk_u32_t const *data, nk_size_t count, nk_size_t stride_bytes,
190
+ nk_u32_t *min_value_ptr, nk_size_t *min_index_ptr, nk_u32_t *max_value_ptr,
191
+ nk_size_t *max_index_ptr);
192
+
193
+ /** @copydoc nk_reduce_moments_f64 */
194
+ NK_DYNAMIC void nk_reduce_moments_i64(nk_i64_t const *data, nk_size_t count, nk_size_t stride_bytes, nk_i64_t *sum_ptr,
195
+ nk_u64_t *sumsq_ptr);
196
+ /** @copydoc nk_reduce_minmax_f64 */
197
+ NK_DYNAMIC void nk_reduce_minmax_i64(nk_i64_t const *data, nk_size_t count, nk_size_t stride_bytes,
198
+ nk_i64_t *min_value_ptr, nk_size_t *min_index_ptr, nk_i64_t *max_value_ptr,
199
+ nk_size_t *max_index_ptr);
200
+
201
+ /** @copydoc nk_reduce_moments_f64 */
202
+ NK_DYNAMIC void nk_reduce_moments_u64(nk_u64_t const *data, nk_size_t count, nk_size_t stride_bytes, nk_u64_t *sum_ptr,
203
+ nk_u64_t *sumsq_ptr);
204
+ /** @copydoc nk_reduce_minmax_f64 */
205
+ NK_DYNAMIC void nk_reduce_minmax_u64(nk_u64_t const *data, nk_size_t count, nk_size_t stride_bytes,
206
+ nk_u64_t *min_value_ptr, nk_size_t *min_index_ptr, nk_u64_t *max_value_ptr,
207
+ nk_size_t *max_index_ptr);
208
+
209
+ /** @copydoc nk_reduce_moments_f64 */
210
+ NK_DYNAMIC void nk_reduce_moments_f16(nk_f16_t const *data, nk_size_t count, nk_size_t stride_bytes, nk_f32_t *sum_ptr,
211
+ nk_f32_t *sumsq_ptr);
212
+ /** @copydoc nk_reduce_minmax_f64 */
213
+ NK_DYNAMIC void nk_reduce_minmax_f16(nk_f16_t const *data, nk_size_t count, nk_size_t stride_bytes,
214
+ nk_f16_t *min_value_ptr, nk_size_t *min_index_ptr, nk_f16_t *max_value_ptr,
215
+ nk_size_t *max_index_ptr);
216
+
217
+ /** @copydoc nk_reduce_moments_f64 */
218
+ NK_DYNAMIC void nk_reduce_moments_bf16(nk_bf16_t const *data, nk_size_t count, nk_size_t stride_bytes,
219
+ nk_f32_t *sum_ptr, nk_f32_t *sumsq_ptr);
220
+ /** @copydoc nk_reduce_minmax_f64 */
221
+ NK_DYNAMIC void nk_reduce_minmax_bf16(nk_bf16_t const *data, nk_size_t count, nk_size_t stride_bytes,
222
+ nk_bf16_t *min_value_ptr, nk_size_t *min_index_ptr, nk_bf16_t *max_value_ptr,
223
+ nk_size_t *max_index_ptr);
224
+
225
+ /** @copydoc nk_reduce_moments_f64 */
226
+ NK_DYNAMIC void nk_reduce_moments_e4m3(nk_e4m3_t const *data, nk_size_t count, nk_size_t stride_bytes,
227
+ nk_f32_t *sum_ptr, nk_f32_t *sumsq_ptr);
228
+ /** @copydoc nk_reduce_minmax_f64 */
229
+ NK_DYNAMIC void nk_reduce_minmax_e4m3(nk_e4m3_t const *data, nk_size_t count, nk_size_t stride_bytes,
230
+ nk_e4m3_t *min_value_ptr, nk_size_t *min_index_ptr, nk_e4m3_t *max_value_ptr,
231
+ nk_size_t *max_index_ptr);
232
+
233
+ /** @copydoc nk_reduce_moments_f64 */
234
+ NK_DYNAMIC void nk_reduce_moments_e5m2(nk_e5m2_t const *data, nk_size_t count, nk_size_t stride_bytes,
235
+ nk_f32_t *sum_ptr, nk_f32_t *sumsq_ptr);
236
+ /** @copydoc nk_reduce_minmax_f64 */
237
+ NK_DYNAMIC void nk_reduce_minmax_e5m2(nk_e5m2_t const *data, nk_size_t count, nk_size_t stride_bytes,
238
+ nk_e5m2_t *min_value_ptr, nk_size_t *min_index_ptr, nk_e5m2_t *max_value_ptr,
239
+ nk_size_t *max_index_ptr);
240
+
241
+ /** @copydoc nk_reduce_moments_f64 */
242
+ NK_DYNAMIC void nk_reduce_moments_e2m3(nk_e2m3_t const *data, nk_size_t count, nk_size_t stride_bytes,
243
+ nk_f32_t *sum_ptr, nk_f32_t *sumsq_ptr);
244
+ /** @copydoc nk_reduce_minmax_f64 */
245
+ NK_DYNAMIC void nk_reduce_minmax_e2m3(nk_e2m3_t const *data, nk_size_t count, nk_size_t stride_bytes,
246
+ nk_e2m3_t *min_value_ptr, nk_size_t *min_index_ptr, nk_e2m3_t *max_value_ptr,
247
+ nk_size_t *max_index_ptr);
248
+
249
+ /** @copydoc nk_reduce_moments_f64 */
250
+ NK_DYNAMIC void nk_reduce_moments_e3m2(nk_e3m2_t const *data, nk_size_t count, nk_size_t stride_bytes,
251
+ nk_f32_t *sum_ptr, nk_f32_t *sumsq_ptr);
252
+ /** @copydoc nk_reduce_minmax_f64 */
253
+ NK_DYNAMIC void nk_reduce_minmax_e3m2(nk_e3m2_t const *data, nk_size_t count, nk_size_t stride_bytes,
254
+ nk_e3m2_t *min_value_ptr, nk_size_t *min_index_ptr, nk_e3m2_t *max_value_ptr,
255
+ nk_size_t *max_index_ptr);
256
+
257
+ /** @copydoc nk_reduce_moments_f64 */
258
+ NK_DYNAMIC void nk_reduce_moments_i4(nk_i4x2_t const *data, nk_size_t count, nk_size_t stride_bytes, nk_i64_t *sum_ptr,
259
+ nk_u64_t *sumsq_ptr);
260
+ /** @copydoc nk_reduce_minmax_f64 */
261
+ NK_DYNAMIC void nk_reduce_minmax_i4(nk_i4x2_t const *data, nk_size_t count, nk_size_t stride_bytes,
262
+ nk_i8_t *min_value_ptr, nk_size_t *min_index_ptr, nk_i8_t *max_value_ptr,
263
+ nk_size_t *max_index_ptr);
264
+
265
+ /** @copydoc nk_reduce_moments_f64 */
266
+ NK_DYNAMIC void nk_reduce_moments_u4(nk_u4x2_t const *data, nk_size_t count, nk_size_t stride_bytes, nk_u64_t *sum_ptr,
267
+ nk_u64_t *sumsq_ptr);
268
+ /** @copydoc nk_reduce_minmax_f64 */
269
+ NK_DYNAMIC void nk_reduce_minmax_u4(nk_u4x2_t const *data, nk_size_t count, nk_size_t stride_bytes,
270
+ nk_u8_t *min_value_ptr, nk_size_t *min_index_ptr, nk_u8_t *max_value_ptr,
271
+ nk_size_t *max_index_ptr);
272
+
273
+ /** @copydoc nk_reduce_moments_f64 */
274
+ NK_DYNAMIC void nk_reduce_moments_u1(nk_u1x8_t const *data, nk_size_t count, nk_size_t stride_bytes, nk_u64_t *sum_ptr,
275
+ nk_u64_t *sumsq_ptr);
276
+ /** @copydoc nk_reduce_minmax_f64 */
277
+ NK_DYNAMIC void nk_reduce_minmax_u1(nk_u1x8_t const *data, nk_size_t count, nk_size_t stride_bytes,
278
+ nk_u8_t *min_value_ptr, nk_size_t *min_index_ptr, nk_u8_t *max_value_ptr,
279
+ nk_size_t *max_index_ptr);
280
+
281
+ /** @copydoc nk_reduce_moments_f64 */
282
+ NK_PUBLIC void nk_reduce_moments_f32_serial(nk_f32_t const *, nk_size_t, nk_size_t, nk_f64_t *, nk_f64_t *);
283
+ /** @copydoc nk_reduce_moments_f64 */
284
+ NK_PUBLIC void nk_reduce_moments_f64_serial(nk_f64_t const *, nk_size_t, nk_size_t, nk_f64_t *, nk_f64_t *);
285
+ /** @copydoc nk_reduce_moments_f64 */
286
+ NK_PUBLIC void nk_reduce_moments_i8_serial(nk_i8_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
287
+ /** @copydoc nk_reduce_moments_f64 */
288
+ NK_PUBLIC void nk_reduce_moments_u8_serial(nk_u8_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
289
+ /** @copydoc nk_reduce_moments_f64 */
290
+ NK_PUBLIC void nk_reduce_moments_i16_serial(nk_i16_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
291
+ /** @copydoc nk_reduce_moments_f64 */
292
+ NK_PUBLIC void nk_reduce_moments_u16_serial(nk_u16_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
293
+ /** @copydoc nk_reduce_moments_f64 */
294
+ NK_PUBLIC void nk_reduce_moments_i32_serial(nk_i32_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
295
+ /** @copydoc nk_reduce_moments_f64 */
296
+ NK_PUBLIC void nk_reduce_moments_u32_serial(nk_u32_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
297
+ /** @copydoc nk_reduce_moments_f64 */
298
+ NK_PUBLIC void nk_reduce_moments_i64_serial(nk_i64_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
299
+ /** @copydoc nk_reduce_moments_f64 */
300
+ NK_PUBLIC void nk_reduce_moments_u64_serial(nk_u64_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
301
+ /** @copydoc nk_reduce_moments_f64 */
302
+ NK_PUBLIC void nk_reduce_moments_f16_serial(nk_f16_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
303
+ /** @copydoc nk_reduce_moments_f64 */
304
+ NK_PUBLIC void nk_reduce_moments_bf16_serial(nk_bf16_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
305
+ /** @copydoc nk_reduce_moments_f64 */
306
+ NK_PUBLIC void nk_reduce_moments_e4m3_serial(nk_e4m3_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
307
+ /** @copydoc nk_reduce_moments_f64 */
308
+ NK_PUBLIC void nk_reduce_moments_e5m2_serial(nk_e5m2_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
309
+ /** @copydoc nk_reduce_moments_f64 */
310
+ NK_PUBLIC void nk_reduce_moments_e2m3_serial(nk_e2m3_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
311
+ /** @copydoc nk_reduce_moments_f64 */
312
+ NK_PUBLIC void nk_reduce_moments_e3m2_serial(nk_e3m2_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
313
+ /** @copydoc nk_reduce_moments_f64 */
314
+ NK_PUBLIC void nk_reduce_moments_i4_serial(nk_i4x2_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
315
+ /** @copydoc nk_reduce_moments_f64 */
316
+ NK_PUBLIC void nk_reduce_moments_u4_serial(nk_u4x2_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
317
+ /** @copydoc nk_reduce_moments_f64 */
318
+ NK_PUBLIC void nk_reduce_moments_u1_serial(nk_u1x8_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
319
+
320
+ /** @copydoc nk_reduce_minmax_f64 */
321
+ NK_PUBLIC void nk_reduce_minmax_f32_serial(nk_f32_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_size_t *, nk_f32_t *,
322
+ nk_size_t *);
323
+ /** @copydoc nk_reduce_minmax_f64 */
324
+ NK_PUBLIC void nk_reduce_minmax_f64_serial(nk_f64_t const *, nk_size_t, nk_size_t, nk_f64_t *, nk_size_t *, nk_f64_t *,
325
+ nk_size_t *);
326
+ /** @copydoc nk_reduce_minmax_f64 */
327
+ NK_PUBLIC void nk_reduce_minmax_i8_serial(nk_i8_t const *, nk_size_t, nk_size_t, nk_i8_t *, nk_size_t *, nk_i8_t *,
328
+ nk_size_t *);
329
+ /** @copydoc nk_reduce_minmax_f64 */
330
+ NK_PUBLIC void nk_reduce_minmax_u8_serial(nk_u8_t const *, nk_size_t, nk_size_t, nk_u8_t *, nk_size_t *, nk_u8_t *,
331
+ nk_size_t *);
332
+ /** @copydoc nk_reduce_minmax_f64 */
333
+ NK_PUBLIC void nk_reduce_minmax_i16_serial(nk_i16_t const *, nk_size_t, nk_size_t, nk_i16_t *, nk_size_t *, nk_i16_t *,
334
+ nk_size_t *);
335
+ /** @copydoc nk_reduce_minmax_f64 */
336
+ NK_PUBLIC void nk_reduce_minmax_u16_serial(nk_u16_t const *, nk_size_t, nk_size_t, nk_u16_t *, nk_size_t *, nk_u16_t *,
337
+ nk_size_t *);
338
+ /** @copydoc nk_reduce_minmax_f64 */
339
+ NK_PUBLIC void nk_reduce_minmax_i32_serial(nk_i32_t const *, nk_size_t, nk_size_t, nk_i32_t *, nk_size_t *, nk_i32_t *,
340
+ nk_size_t *);
341
+ /** @copydoc nk_reduce_minmax_f64 */
342
+ NK_PUBLIC void nk_reduce_minmax_u32_serial(nk_u32_t const *, nk_size_t, nk_size_t, nk_u32_t *, nk_size_t *, nk_u32_t *,
343
+ nk_size_t *);
344
+ /** @copydoc nk_reduce_minmax_f64 */
345
+ NK_PUBLIC void nk_reduce_minmax_i64_serial(nk_i64_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_size_t *, nk_i64_t *,
346
+ nk_size_t *);
347
+ /** @copydoc nk_reduce_minmax_f64 */
348
+ NK_PUBLIC void nk_reduce_minmax_u64_serial(nk_u64_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_size_t *, nk_u64_t *,
349
+ nk_size_t *);
350
+ /** @copydoc nk_reduce_minmax_f64 */
351
+ NK_PUBLIC void nk_reduce_minmax_f16_serial(nk_f16_t const *, nk_size_t, nk_size_t, nk_f16_t *, nk_size_t *, nk_f16_t *,
352
+ nk_size_t *);
353
+ /** @copydoc nk_reduce_minmax_f64 */
354
+ NK_PUBLIC void nk_reduce_minmax_bf16_serial(nk_bf16_t const *, nk_size_t, nk_size_t, nk_bf16_t *, nk_size_t *,
355
+ nk_bf16_t *, nk_size_t *);
356
+ /** @copydoc nk_reduce_minmax_f64 */
357
+ NK_PUBLIC void nk_reduce_minmax_e4m3_serial(nk_e4m3_t const *, nk_size_t, nk_size_t, nk_e4m3_t *, nk_size_t *,
358
+ nk_e4m3_t *, nk_size_t *);
359
+ /** @copydoc nk_reduce_minmax_f64 */
360
+ NK_PUBLIC void nk_reduce_minmax_e5m2_serial(nk_e5m2_t const *, nk_size_t, nk_size_t, nk_e5m2_t *, nk_size_t *,
361
+ nk_e5m2_t *, nk_size_t *);
362
+ /** @copydoc nk_reduce_minmax_f64 */
363
+ NK_PUBLIC void nk_reduce_minmax_e2m3_serial(nk_e2m3_t const *, nk_size_t, nk_size_t, nk_e2m3_t *, nk_size_t *,
364
+ nk_e2m3_t *, nk_size_t *);
365
+ /** @copydoc nk_reduce_minmax_f64 */
366
+ NK_PUBLIC void nk_reduce_minmax_e3m2_serial(nk_e3m2_t const *, nk_size_t, nk_size_t, nk_e3m2_t *, nk_size_t *,
367
+ nk_e3m2_t *, nk_size_t *);
368
+ /** @copydoc nk_reduce_minmax_f64 */
369
+ NK_PUBLIC void nk_reduce_minmax_i4_serial(nk_i4x2_t const *, nk_size_t, nk_size_t, nk_i8_t *, nk_size_t *, nk_i8_t *,
370
+ nk_size_t *);
371
+ /** @copydoc nk_reduce_minmax_f64 */
372
+ NK_PUBLIC void nk_reduce_minmax_u4_serial(nk_u4x2_t const *, nk_size_t, nk_size_t, nk_u8_t *, nk_size_t *, nk_u8_t *,
373
+ nk_size_t *);
374
+ /** @copydoc nk_reduce_minmax_f64 */
375
+ NK_PUBLIC void nk_reduce_minmax_u1_serial(nk_u1x8_t const *, nk_size_t, nk_size_t, nk_u8_t *, nk_size_t *, nk_u8_t *,
376
+ nk_size_t *);
377
+
378
+ #if NK_TARGET_NEON
379
+ /** @copydoc nk_reduce_moments_f64 */
380
+ NK_PUBLIC void nk_reduce_moments_f32_neon(nk_f32_t const *, nk_size_t, nk_size_t, nk_f64_t *, nk_f64_t *);
381
+ /** @copydoc nk_reduce_moments_f64 */
382
+ NK_PUBLIC void nk_reduce_moments_f64_neon(nk_f64_t const *, nk_size_t, nk_size_t, nk_f64_t *, nk_f64_t *);
383
+ /** @copydoc nk_reduce_moments_f64 */
384
+ NK_PUBLIC void nk_reduce_moments_i8_neon(nk_i8_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
385
+ /** @copydoc nk_reduce_moments_f64 */
386
+ NK_PUBLIC void nk_reduce_moments_u8_neon(nk_u8_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
387
+ /** @copydoc nk_reduce_moments_f64 */
388
+ NK_PUBLIC void nk_reduce_moments_i16_neon(nk_i16_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
389
+ /** @copydoc nk_reduce_moments_f64 */
390
+ NK_PUBLIC void nk_reduce_moments_u16_neon(nk_u16_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
391
+ /** @copydoc nk_reduce_moments_f64 */
392
+ NK_PUBLIC void nk_reduce_moments_u1_neon(nk_u1x8_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
393
+ /** @copydoc nk_reduce_moments_f64 */
394
+ NK_PUBLIC void nk_reduce_moments_i32_neon(nk_i32_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
395
+ /** @copydoc nk_reduce_moments_f64 */
396
+ NK_PUBLIC void nk_reduce_moments_u32_neon(nk_u32_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
397
+ /** @copydoc nk_reduce_moments_f64 */
398
+ NK_PUBLIC void nk_reduce_moments_i64_neon(nk_i64_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
399
+ /** @copydoc nk_reduce_moments_f64 */
400
+ NK_PUBLIC void nk_reduce_moments_u64_neon(nk_u64_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
401
+ /** @copydoc nk_reduce_moments_f64 */
402
+ NK_PUBLIC void nk_reduce_moments_e2m3_neon(nk_e2m3_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
403
+ /** @copydoc nk_reduce_moments_f64 */
404
+ NK_PUBLIC void nk_reduce_moments_e3m2_neon(nk_e3m2_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
405
+ /** @copydoc nk_reduce_moments_f64 */
406
+ NK_PUBLIC void nk_reduce_moments_e4m3_neon(nk_e4m3_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
407
+ /** @copydoc nk_reduce_moments_f64 */
408
+ NK_PUBLIC void nk_reduce_moments_e5m2_neon(nk_e5m2_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
409
+ /** @copydoc nk_reduce_minmax_f64 */
410
+ NK_PUBLIC void nk_reduce_minmax_f32_neon(nk_f32_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_size_t *, nk_f32_t *,
411
+ nk_size_t *);
412
+ /** @copydoc nk_reduce_minmax_f64 */
413
+ NK_PUBLIC void nk_reduce_minmax_f64_neon(nk_f64_t const *, nk_size_t, nk_size_t, nk_f64_t *, nk_size_t *, nk_f64_t *,
414
+ nk_size_t *);
415
+ /** @copydoc nk_reduce_minmax_f64 */
416
+ NK_PUBLIC void nk_reduce_minmax_i8_neon(nk_i8_t const *, nk_size_t, nk_size_t, nk_i8_t *, nk_size_t *, nk_i8_t *,
417
+ nk_size_t *);
418
+ /** @copydoc nk_reduce_minmax_f64 */
419
+ NK_PUBLIC void nk_reduce_minmax_u8_neon(nk_u8_t const *, nk_size_t, nk_size_t, nk_u8_t *, nk_size_t *, nk_u8_t *,
420
+ nk_size_t *);
421
+ /** @copydoc nk_reduce_minmax_f64 */
422
+ NK_PUBLIC void nk_reduce_minmax_i16_neon(nk_i16_t const *, nk_size_t, nk_size_t, nk_i16_t *, nk_size_t *, nk_i16_t *,
423
+ nk_size_t *);
424
+ /** @copydoc nk_reduce_minmax_f64 */
425
+ NK_PUBLIC void nk_reduce_minmax_u16_neon(nk_u16_t const *, nk_size_t, nk_size_t, nk_u16_t *, nk_size_t *, nk_u16_t *,
426
+ nk_size_t *);
427
+ /** @copydoc nk_reduce_minmax_f64 */
428
+ NK_PUBLIC void nk_reduce_minmax_i32_neon(nk_i32_t const *, nk_size_t, nk_size_t, nk_i32_t *, nk_size_t *, nk_i32_t *,
429
+ nk_size_t *);
430
+ /** @copydoc nk_reduce_minmax_f64 */
431
+ NK_PUBLIC void nk_reduce_minmax_u32_neon(nk_u32_t const *, nk_size_t, nk_size_t, nk_u32_t *, nk_size_t *, nk_u32_t *,
432
+ nk_size_t *);
433
+ /** @copydoc nk_reduce_minmax_f64 */
434
+ NK_PUBLIC void nk_reduce_minmax_i64_neon(nk_i64_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_size_t *, nk_i64_t *,
435
+ nk_size_t *);
436
+ /** @copydoc nk_reduce_minmax_f64 */
437
+ NK_PUBLIC void nk_reduce_minmax_u64_neon(nk_u64_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_size_t *, nk_u64_t *,
438
+ nk_size_t *);
439
+ /** @copydoc nk_reduce_minmax_f64 */
440
+ NK_PUBLIC void nk_reduce_minmax_e2m3_neon(nk_e2m3_t const *, nk_size_t, nk_size_t, nk_e2m3_t *, nk_size_t *,
441
+ nk_e2m3_t *, nk_size_t *);
442
+ /** @copydoc nk_reduce_minmax_f64 */
443
+ NK_PUBLIC void nk_reduce_minmax_e3m2_neon(nk_e3m2_t const *, nk_size_t, nk_size_t, nk_e3m2_t *, nk_size_t *,
444
+ nk_e3m2_t *, nk_size_t *);
445
+ /** @copydoc nk_reduce_minmax_f64 */
446
+ NK_PUBLIC void nk_reduce_minmax_e4m3_neon(nk_e4m3_t const *, nk_size_t, nk_size_t, nk_e4m3_t *, nk_size_t *,
447
+ nk_e4m3_t *, nk_size_t *);
448
+ /** @copydoc nk_reduce_minmax_f64 */
449
+ NK_PUBLIC void nk_reduce_minmax_e5m2_neon(nk_e5m2_t const *, nk_size_t, nk_size_t, nk_e5m2_t *, nk_size_t *,
450
+ nk_e5m2_t *, nk_size_t *);
451
+ /** @copydoc nk_reduce_moments_f64 */
452
+ NK_PUBLIC void nk_reduce_moments_f16_neon(nk_f16_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
453
+ #endif // NK_TARGET_NEON
454
+
455
+ #if NK_TARGET_NEONBFDOT
456
+ /** @copydoc nk_reduce_moments_f64 */
457
+ NK_PUBLIC void nk_reduce_moments_bf16_neonbfdot(nk_bf16_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
458
+ #endif // NK_TARGET_NEONBFDOT
459
+
460
+ #if NK_TARGET_NEONSDOT
461
+ /** @copydoc nk_reduce_moments_f64 */
462
+ NK_PUBLIC void nk_reduce_moments_i8_neonsdot(nk_i8_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
463
+ /** @copydoc nk_reduce_moments_f64 */
464
+ NK_PUBLIC void nk_reduce_moments_u8_neonsdot(nk_u8_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
465
+ /** @copydoc nk_reduce_moments_f64 */
466
+ NK_PUBLIC void nk_reduce_moments_e2m3_neonsdot(nk_e2m3_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
467
+ #endif // NK_TARGET_NEONSDOT
468
+
469
+ #if NK_TARGET_NEONFHM
470
+ /** @copydoc nk_reduce_moments_f64 */
471
+ NK_PUBLIC void nk_reduce_moments_e4m3_neonfhm(nk_e4m3_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
472
+ /** @copydoc nk_reduce_moments_f64 */
473
+ NK_PUBLIC void nk_reduce_moments_e5m2_neonfhm(nk_e5m2_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
474
+ #endif // NK_TARGET_NEONFHM
475
+
476
+ #if NK_TARGET_HASWELL
477
+ /** @copydoc nk_reduce_moments_f64 */
478
+ NK_PUBLIC void nk_reduce_moments_f32_haswell(nk_f32_t const *, nk_size_t, nk_size_t, nk_f64_t *, nk_f64_t *);
479
+ /** @copydoc nk_reduce_moments_f64 */
480
+ NK_PUBLIC void nk_reduce_moments_f64_haswell(nk_f64_t const *, nk_size_t, nk_size_t, nk_f64_t *, nk_f64_t *);
481
+ /** @copydoc nk_reduce_moments_f64 */
482
+ NK_PUBLIC void nk_reduce_moments_i8_haswell(nk_i8_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
483
+ /** @copydoc nk_reduce_moments_f64 */
484
+ NK_PUBLIC void nk_reduce_moments_u8_haswell(nk_u8_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
485
+ /** @copydoc nk_reduce_moments_f64 */
486
+ NK_PUBLIC void nk_reduce_moments_i16_haswell(nk_i16_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
487
+ /** @copydoc nk_reduce_moments_f64 */
488
+ NK_PUBLIC void nk_reduce_moments_u16_haswell(nk_u16_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
489
+ /** @copydoc nk_reduce_moments_f64 */
490
+ NK_PUBLIC void nk_reduce_moments_i32_haswell(nk_i32_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
491
+ /** @copydoc nk_reduce_moments_f64 */
492
+ NK_PUBLIC void nk_reduce_moments_u32_haswell(nk_u32_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
493
+ /** @copydoc nk_reduce_moments_f64 */
494
+ NK_PUBLIC void nk_reduce_moments_i64_haswell(nk_i64_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
495
+ /** @copydoc nk_reduce_moments_f64 */
496
+ NK_PUBLIC void nk_reduce_moments_u64_haswell(nk_u64_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
497
+ /** @copydoc nk_reduce_moments_f64 */
498
+ NK_PUBLIC void nk_reduce_moments_f16_haswell(nk_f16_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
499
+ /** @copydoc nk_reduce_moments_f64 */
500
+ NK_PUBLIC void nk_reduce_moments_bf16_haswell(nk_bf16_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
501
+ /** @copydoc nk_reduce_moments_f64 */
502
+ NK_PUBLIC void nk_reduce_moments_e4m3_haswell(nk_e4m3_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
503
+ /** @copydoc nk_reduce_moments_f64 */
504
+ NK_PUBLIC void nk_reduce_moments_e5m2_haswell(nk_e5m2_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
505
+ /** @copydoc nk_reduce_moments_f64 */
506
+ NK_PUBLIC void nk_reduce_moments_e2m3_haswell(nk_e2m3_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
507
+ /** @copydoc nk_reduce_moments_f64 */
508
+ NK_PUBLIC void nk_reduce_moments_e3m2_haswell(nk_e3m2_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
509
+ /** @copydoc nk_reduce_moments_f64 */
510
+ NK_PUBLIC void nk_reduce_moments_i4_haswell(nk_i4x2_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
511
+ /** @copydoc nk_reduce_moments_f64 */
512
+ NK_PUBLIC void nk_reduce_moments_u4_haswell(nk_u4x2_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
513
+ /** @copydoc nk_reduce_moments_f64 */
514
+ NK_PUBLIC void nk_reduce_moments_u1_haswell(nk_u1x8_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
515
+ /** @copydoc nk_reduce_minmax_f64 */
516
+ NK_PUBLIC void nk_reduce_minmax_f32_haswell(nk_f32_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_size_t *, nk_f32_t *,
517
+ nk_size_t *);
518
+ /** @copydoc nk_reduce_minmax_f64 */
519
+ NK_PUBLIC void nk_reduce_minmax_f64_haswell(nk_f64_t const *, nk_size_t, nk_size_t, nk_f64_t *, nk_size_t *, nk_f64_t *,
520
+ nk_size_t *);
521
+ /** @copydoc nk_reduce_minmax_f64 */
522
+ NK_PUBLIC void nk_reduce_minmax_i8_haswell(nk_i8_t const *, nk_size_t, nk_size_t, nk_i8_t *, nk_size_t *, nk_i8_t *,
523
+ nk_size_t *);
524
+ /** @copydoc nk_reduce_minmax_f64 */
525
+ NK_PUBLIC void nk_reduce_minmax_u8_haswell(nk_u8_t const *, nk_size_t, nk_size_t, nk_u8_t *, nk_size_t *, nk_u8_t *,
526
+ nk_size_t *);
527
+ /** @copydoc nk_reduce_minmax_f64 */
528
+ NK_PUBLIC void nk_reduce_minmax_i16_haswell(nk_i16_t const *, nk_size_t, nk_size_t, nk_i16_t *, nk_size_t *, nk_i16_t *,
529
+ nk_size_t *);
530
+ /** @copydoc nk_reduce_minmax_f64 */
531
+ NK_PUBLIC void nk_reduce_minmax_u16_haswell(nk_u16_t const *, nk_size_t, nk_size_t, nk_u16_t *, nk_size_t *, nk_u16_t *,
532
+ nk_size_t *);
533
+ /** @copydoc nk_reduce_minmax_f64 */
534
+ NK_PUBLIC void nk_reduce_minmax_i32_haswell(nk_i32_t const *, nk_size_t, nk_size_t, nk_i32_t *, nk_size_t *, nk_i32_t *,
535
+ nk_size_t *);
536
+ /** @copydoc nk_reduce_minmax_f64 */
537
+ NK_PUBLIC void nk_reduce_minmax_u32_haswell(nk_u32_t const *, nk_size_t, nk_size_t, nk_u32_t *, nk_size_t *, nk_u32_t *,
538
+ nk_size_t *);
539
+ /** @copydoc nk_reduce_minmax_f64 */
540
+ NK_PUBLIC void nk_reduce_minmax_i64_haswell(nk_i64_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_size_t *, nk_i64_t *,
541
+ nk_size_t *);
542
+ /** @copydoc nk_reduce_minmax_f64 */
543
+ NK_PUBLIC void nk_reduce_minmax_u64_haswell(nk_u64_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_size_t *, nk_u64_t *,
544
+ nk_size_t *);
545
+ /** @copydoc nk_reduce_minmax_f64 */
546
+ NK_PUBLIC void nk_reduce_minmax_f16_haswell(nk_f16_t const *, nk_size_t, nk_size_t, nk_f16_t *, nk_size_t *, nk_f16_t *,
547
+ nk_size_t *);
548
+ /** @copydoc nk_reduce_minmax_f64 */
549
+ NK_PUBLIC void nk_reduce_minmax_bf16_haswell(nk_bf16_t const *, nk_size_t, nk_size_t, nk_bf16_t *, nk_size_t *,
550
+ nk_bf16_t *, nk_size_t *);
551
+ /** @copydoc nk_reduce_minmax_f64 */
552
+ NK_PUBLIC void nk_reduce_minmax_e4m3_haswell(nk_e4m3_t const *, nk_size_t, nk_size_t, nk_e4m3_t *, nk_size_t *,
553
+ nk_e4m3_t *, nk_size_t *);
554
+ /** @copydoc nk_reduce_minmax_f64 */
555
+ NK_PUBLIC void nk_reduce_minmax_e5m2_haswell(nk_e5m2_t const *, nk_size_t, nk_size_t, nk_e5m2_t *, nk_size_t *,
556
+ nk_e5m2_t *, nk_size_t *);
557
+ /** @copydoc nk_reduce_minmax_f64 */
558
+ NK_PUBLIC void nk_reduce_minmax_e2m3_haswell(nk_e2m3_t const *, nk_size_t, nk_size_t, nk_e2m3_t *, nk_size_t *,
559
+ nk_e2m3_t *, nk_size_t *);
560
+ /** @copydoc nk_reduce_minmax_f64 */
561
+ NK_PUBLIC void nk_reduce_minmax_e3m2_haswell(nk_e3m2_t const *, nk_size_t, nk_size_t, nk_e3m2_t *, nk_size_t *,
562
+ nk_e3m2_t *, nk_size_t *);
563
+ #endif // NK_TARGET_HASWELL
564
+
565
+ #if NK_TARGET_SKYLAKE
566
+ /** @copydoc nk_reduce_moments_f64 */
567
+ NK_PUBLIC void nk_reduce_moments_f32_skylake(nk_f32_t const *, nk_size_t, nk_size_t, nk_f64_t *, nk_f64_t *);
568
+ /** @copydoc nk_reduce_moments_f64 */
569
+ NK_PUBLIC void nk_reduce_moments_f64_skylake(nk_f64_t const *, nk_size_t, nk_size_t, nk_f64_t *, nk_f64_t *);
570
+ /** @copydoc nk_reduce_moments_f64 */
571
+ NK_PUBLIC void nk_reduce_moments_i8_skylake(nk_i8_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
572
+ /** @copydoc nk_reduce_moments_f64 */
573
+ NK_PUBLIC void nk_reduce_moments_u8_skylake(nk_u8_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
574
+ /** @copydoc nk_reduce_moments_f64 */
575
+ NK_PUBLIC void nk_reduce_moments_i16_skylake(nk_i16_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
576
+ /** @copydoc nk_reduce_moments_f64 */
577
+ NK_PUBLIC void nk_reduce_moments_u16_skylake(nk_u16_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
578
+ /** @copydoc nk_reduce_moments_f64 */
579
+ NK_PUBLIC void nk_reduce_moments_i32_skylake(nk_i32_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
580
+ /** @copydoc nk_reduce_moments_f64 */
581
+ NK_PUBLIC void nk_reduce_moments_u32_skylake(nk_u32_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
582
+ /** @copydoc nk_reduce_moments_f64 */
583
+ NK_PUBLIC void nk_reduce_moments_i64_skylake(nk_i64_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
584
+ /** @copydoc nk_reduce_moments_f64 */
585
+ NK_PUBLIC void nk_reduce_moments_u64_skylake(nk_u64_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
586
+ /** @copydoc nk_reduce_moments_f64 */
587
+ NK_PUBLIC void nk_reduce_moments_f16_skylake(nk_f16_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
588
+ /** @copydoc nk_reduce_moments_f64 */
589
+ NK_PUBLIC void nk_reduce_moments_bf16_skylake(nk_bf16_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
590
+ /** @copydoc nk_reduce_moments_f64 */
591
+ NK_PUBLIC void nk_reduce_moments_e4m3_skylake(nk_e4m3_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
592
+ /** @copydoc nk_reduce_moments_f64 */
593
+ NK_PUBLIC void nk_reduce_moments_e5m2_skylake(nk_e5m2_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
594
+ /** @copydoc nk_reduce_moments_f64 */
595
+ NK_PUBLIC void nk_reduce_moments_e2m3_skylake(nk_e2m3_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
596
+ /** @copydoc nk_reduce_moments_f64 */
597
+ NK_PUBLIC void nk_reduce_moments_e3m2_skylake(nk_e3m2_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
598
+ /** @copydoc nk_reduce_moments_f64 */
599
+ NK_PUBLIC void nk_reduce_moments_i4_skylake(nk_i4x2_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
600
+ /** @copydoc nk_reduce_moments_f64 */
601
+ NK_PUBLIC void nk_reduce_moments_u4_skylake(nk_u4x2_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
602
+ /** @copydoc nk_reduce_moments_f64 */
603
+ NK_PUBLIC void nk_reduce_moments_u1_skylake(nk_u1x8_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
604
+ /** @copydoc nk_reduce_minmax_f64 */
605
+ NK_PUBLIC void nk_reduce_minmax_f32_skylake(nk_f32_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_size_t *, nk_f32_t *,
606
+ nk_size_t *);
607
+ /** @copydoc nk_reduce_minmax_f64 */
608
+ NK_PUBLIC void nk_reduce_minmax_f64_skylake(nk_f64_t const *, nk_size_t, nk_size_t, nk_f64_t *, nk_size_t *, nk_f64_t *,
609
+ nk_size_t *);
610
+ /** @copydoc nk_reduce_minmax_f64 */
611
+ NK_PUBLIC void nk_reduce_minmax_i8_skylake(nk_i8_t const *, nk_size_t, nk_size_t, nk_i8_t *, nk_size_t *, nk_i8_t *,
612
+ nk_size_t *);
613
+ /** @copydoc nk_reduce_minmax_f64 */
614
+ NK_PUBLIC void nk_reduce_minmax_u8_skylake(nk_u8_t const *, nk_size_t, nk_size_t, nk_u8_t *, nk_size_t *, nk_u8_t *,
615
+ nk_size_t *);
616
+ /** @copydoc nk_reduce_minmax_f64 */
617
+ NK_PUBLIC void nk_reduce_minmax_i16_skylake(nk_i16_t const *, nk_size_t, nk_size_t, nk_i16_t *, nk_size_t *, nk_i16_t *,
618
+ nk_size_t *);
619
+ /** @copydoc nk_reduce_minmax_f64 */
620
+ NK_PUBLIC void nk_reduce_minmax_u16_skylake(nk_u16_t const *, nk_size_t, nk_size_t, nk_u16_t *, nk_size_t *, nk_u16_t *,
621
+ nk_size_t *);
622
+ /** @copydoc nk_reduce_minmax_f64 */
623
+ NK_PUBLIC void nk_reduce_minmax_i32_skylake(nk_i32_t const *, nk_size_t, nk_size_t, nk_i32_t *, nk_size_t *, nk_i32_t *,
624
+ nk_size_t *);
625
+ /** @copydoc nk_reduce_minmax_f64 */
626
+ NK_PUBLIC void nk_reduce_minmax_u32_skylake(nk_u32_t const *, nk_size_t, nk_size_t, nk_u32_t *, nk_size_t *, nk_u32_t *,
627
+ nk_size_t *);
628
+ /** @copydoc nk_reduce_minmax_f64 */
629
+ NK_PUBLIC void nk_reduce_minmax_i64_skylake(nk_i64_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_size_t *, nk_i64_t *,
630
+ nk_size_t *);
631
+ /** @copydoc nk_reduce_minmax_f64 */
632
+ NK_PUBLIC void nk_reduce_minmax_u64_skylake(nk_u64_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_size_t *, nk_u64_t *,
633
+ nk_size_t *);
634
+ /** @copydoc nk_reduce_minmax_f64 */
635
+ NK_PUBLIC void nk_reduce_minmax_f16_skylake(nk_f16_t const *, nk_size_t, nk_size_t, nk_f16_t *, nk_size_t *, nk_f16_t *,
636
+ nk_size_t *);
637
+ /** @copydoc nk_reduce_minmax_f64 */
638
+ NK_PUBLIC void nk_reduce_minmax_bf16_skylake(nk_bf16_t const *, nk_size_t, nk_size_t, nk_bf16_t *, nk_size_t *,
639
+ nk_bf16_t *, nk_size_t *);
640
+ /** @copydoc nk_reduce_minmax_f64 */
641
+ NK_PUBLIC void nk_reduce_minmax_e4m3_skylake(nk_e4m3_t const *, nk_size_t, nk_size_t, nk_e4m3_t *, nk_size_t *,
642
+ nk_e4m3_t *, nk_size_t *);
643
+ /** @copydoc nk_reduce_minmax_f64 */
644
+ NK_PUBLIC void nk_reduce_minmax_e5m2_skylake(nk_e5m2_t const *, nk_size_t, nk_size_t, nk_e5m2_t *, nk_size_t *,
645
+ nk_e5m2_t *, nk_size_t *);
646
+ /** @copydoc nk_reduce_minmax_f64 */
647
+ NK_PUBLIC void nk_reduce_minmax_e2m3_skylake(nk_e2m3_t const *, nk_size_t, nk_size_t, nk_e2m3_t *, nk_size_t *,
648
+ nk_e2m3_t *, nk_size_t *);
649
+ /** @copydoc nk_reduce_minmax_f64 */
650
+ NK_PUBLIC void nk_reduce_minmax_e3m2_skylake(nk_e3m2_t const *, nk_size_t, nk_size_t, nk_e3m2_t *, nk_size_t *,
651
+ nk_e3m2_t *, nk_size_t *);
652
+ #endif // NK_TARGET_SKYLAKE
653
+
654
+ #if NK_TARGET_ICELAKE
655
+ /** @copydoc nk_reduce_moments_f64 */
656
+ NK_PUBLIC void nk_reduce_moments_i8_icelake(nk_i8_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
657
+ /** @copydoc nk_reduce_moments_f64 */
658
+ NK_PUBLIC void nk_reduce_moments_u8_icelake(nk_u8_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
659
+ /** @copydoc nk_reduce_moments_f64 */
660
+ NK_PUBLIC void nk_reduce_moments_i16_icelake(nk_i16_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
661
+ /** @copydoc nk_reduce_moments_f64 */
662
+ NK_PUBLIC void nk_reduce_moments_e2m3_icelake(nk_e2m3_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
663
+ /** @copydoc nk_reduce_moments_f64 */
664
+ NK_PUBLIC void nk_reduce_moments_e3m2_icelake(nk_e3m2_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
665
+ #endif // NK_TARGET_ICELAKE
666
+
667
+ #if NK_TARGET_GENOA
668
+ /** @copydoc nk_reduce_moments_f64 */
669
+ NK_PUBLIC void nk_reduce_moments_bf16_genoa(nk_bf16_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
670
+ /** @copydoc nk_reduce_moments_f64 */
671
+ NK_PUBLIC void nk_reduce_moments_e4m3_genoa(nk_e4m3_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
672
+ /** @copydoc nk_reduce_moments_f64 */
673
+ NK_PUBLIC void nk_reduce_moments_e5m2_genoa(nk_e5m2_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
674
+ #endif // NK_TARGET_GENOA
675
+
676
+ #if NK_TARGET_ALDER
677
+ /** @copydoc nk_reduce_moments_f64 */
678
+ NK_PUBLIC void nk_reduce_moments_u8_alder(nk_u8_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
679
+ /** @copydoc nk_reduce_moments_f64 */
680
+ NK_PUBLIC void nk_reduce_moments_i16_alder(nk_i16_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
681
+ /** @copydoc nk_reduce_moments_f64 */
682
+ NK_PUBLIC void nk_reduce_moments_u16_alder(nk_u16_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
683
+ /** @copydoc nk_reduce_moments_f64 */
684
+ NK_PUBLIC void nk_reduce_moments_e3m2_alder(nk_e3m2_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
685
+ /** @copydoc nk_reduce_moments_f64 */
686
+ NK_PUBLIC void nk_reduce_moments_e2m3_alder(nk_e2m3_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
687
+ #endif // NK_TARGET_ALDER
688
+ #if NK_TARGET_SIERRA
689
+ /** @copydoc nk_reduce_moments_f64 */
690
+ NK_PUBLIC void nk_reduce_moments_i8_sierra(nk_i8_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
691
+ /** @copydoc nk_reduce_moments_f64 */
692
+ NK_PUBLIC void nk_reduce_moments_u8_sierra(nk_u8_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
693
+ /** @copydoc nk_reduce_moments_f64 */
694
+ NK_PUBLIC void nk_reduce_moments_e2m3_sierra(nk_e2m3_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
695
+ #endif // NK_TARGET_SIERRA
696
+
697
+ #if NK_TARGET_RVV
698
+ /** @copydoc nk_reduce_moments_f64 */
699
+ NK_PUBLIC void nk_reduce_moments_f32_rvv(nk_f32_t const *, nk_size_t, nk_size_t, nk_f64_t *, nk_f64_t *);
700
+ /** @copydoc nk_reduce_moments_f64 */
701
+ NK_PUBLIC void nk_reduce_moments_f64_rvv(nk_f64_t const *, nk_size_t, nk_size_t, nk_f64_t *, nk_f64_t *);
702
+ /** @copydoc nk_reduce_moments_f64 */
703
+ NK_PUBLIC void nk_reduce_moments_i8_rvv(nk_i8_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
704
+ /** @copydoc nk_reduce_moments_f64 */
705
+ NK_PUBLIC void nk_reduce_moments_u8_rvv(nk_u8_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
706
+ /** @copydoc nk_reduce_moments_f64 */
707
+ NK_PUBLIC void nk_reduce_moments_i16_rvv(nk_i16_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
708
+ /** @copydoc nk_reduce_moments_f64 */
709
+ NK_PUBLIC void nk_reduce_moments_u16_rvv(nk_u16_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
710
+ /** @copydoc nk_reduce_moments_f64 */
711
+ NK_PUBLIC void nk_reduce_moments_i32_rvv(nk_i32_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
712
+ /** @copydoc nk_reduce_moments_f64 */
713
+ NK_PUBLIC void nk_reduce_moments_u32_rvv(nk_u32_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
714
+ /** @copydoc nk_reduce_moments_f64 */
715
+ NK_PUBLIC void nk_reduce_moments_i64_rvv(nk_i64_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
716
+ /** @copydoc nk_reduce_moments_f64 */
717
+ NK_PUBLIC void nk_reduce_moments_u64_rvv(nk_u64_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
718
+ /** @copydoc nk_reduce_moments_f64 */
719
+ NK_PUBLIC void nk_reduce_moments_f16_rvv(nk_f16_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
720
+ /** @copydoc nk_reduce_moments_f64 */
721
+ NK_PUBLIC void nk_reduce_moments_bf16_rvv(nk_bf16_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
722
+ /** @copydoc nk_reduce_moments_f64 */
723
+ NK_PUBLIC void nk_reduce_moments_e4m3_rvv(nk_e4m3_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
724
+ /** @copydoc nk_reduce_moments_f64 */
725
+ NK_PUBLIC void nk_reduce_moments_e5m2_rvv(nk_e5m2_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
726
+ /** @copydoc nk_reduce_moments_f64 */
727
+ NK_PUBLIC void nk_reduce_moments_e2m3_rvv(nk_e2m3_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
728
+ /** @copydoc nk_reduce_moments_f64 */
729
+ NK_PUBLIC void nk_reduce_moments_e3m2_rvv(nk_e3m2_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
730
+ /** @copydoc nk_reduce_minmax_f64 */
731
+ NK_PUBLIC void nk_reduce_minmax_f32_rvv(nk_f32_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_size_t *, nk_f32_t *,
732
+ nk_size_t *);
733
+ /** @copydoc nk_reduce_minmax_f64 */
734
+ NK_PUBLIC void nk_reduce_minmax_f64_rvv(nk_f64_t const *, nk_size_t, nk_size_t, nk_f64_t *, nk_size_t *, nk_f64_t *,
735
+ nk_size_t *);
736
+ /** @copydoc nk_reduce_minmax_f64 */
737
+ NK_PUBLIC void nk_reduce_minmax_i8_rvv(nk_i8_t const *, nk_size_t, nk_size_t, nk_i8_t *, nk_size_t *, nk_i8_t *,
738
+ nk_size_t *);
739
+ /** @copydoc nk_reduce_minmax_f64 */
740
+ NK_PUBLIC void nk_reduce_minmax_u8_rvv(nk_u8_t const *, nk_size_t, nk_size_t, nk_u8_t *, nk_size_t *, nk_u8_t *,
741
+ nk_size_t *);
742
+ /** @copydoc nk_reduce_minmax_f64 */
743
+ NK_PUBLIC void nk_reduce_minmax_i16_rvv(nk_i16_t const *, nk_size_t, nk_size_t, nk_i16_t *, nk_size_t *, nk_i16_t *,
744
+ nk_size_t *);
745
+ /** @copydoc nk_reduce_minmax_f64 */
746
+ NK_PUBLIC void nk_reduce_minmax_u16_rvv(nk_u16_t const *, nk_size_t, nk_size_t, nk_u16_t *, nk_size_t *, nk_u16_t *,
747
+ nk_size_t *);
748
+ /** @copydoc nk_reduce_minmax_f64 */
749
+ NK_PUBLIC void nk_reduce_minmax_i32_rvv(nk_i32_t const *, nk_size_t, nk_size_t, nk_i32_t *, nk_size_t *, nk_i32_t *,
750
+ nk_size_t *);
751
+ /** @copydoc nk_reduce_minmax_f64 */
752
+ NK_PUBLIC void nk_reduce_minmax_u32_rvv(nk_u32_t const *, nk_size_t, nk_size_t, nk_u32_t *, nk_size_t *, nk_u32_t *,
753
+ nk_size_t *);
754
+ /** @copydoc nk_reduce_minmax_f64 */
755
+ NK_PUBLIC void nk_reduce_minmax_i64_rvv(nk_i64_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_size_t *, nk_i64_t *,
756
+ nk_size_t *);
757
+ /** @copydoc nk_reduce_minmax_f64 */
758
+ NK_PUBLIC void nk_reduce_minmax_u64_rvv(nk_u64_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_size_t *, nk_u64_t *,
759
+ nk_size_t *);
760
+ /** @copydoc nk_reduce_minmax_f64 */
761
+ NK_PUBLIC void nk_reduce_minmax_f16_rvv(nk_f16_t const *, nk_size_t, nk_size_t, nk_f16_t *, nk_size_t *, nk_f16_t *,
762
+ nk_size_t *);
763
+ /** @copydoc nk_reduce_minmax_f64 */
764
+ NK_PUBLIC void nk_reduce_minmax_bf16_rvv(nk_bf16_t const *, nk_size_t, nk_size_t, nk_bf16_t *, nk_size_t *, nk_bf16_t *,
765
+ nk_size_t *);
766
+ /** @copydoc nk_reduce_minmax_f64 */
767
+ NK_PUBLIC void nk_reduce_minmax_e4m3_rvv(nk_e4m3_t const *, nk_size_t, nk_size_t, nk_e4m3_t *, nk_size_t *, nk_e4m3_t *,
768
+ nk_size_t *);
769
+ /** @copydoc nk_reduce_minmax_f64 */
770
+ NK_PUBLIC void nk_reduce_minmax_e5m2_rvv(nk_e5m2_t const *, nk_size_t, nk_size_t, nk_e5m2_t *, nk_size_t *, nk_e5m2_t *,
771
+ nk_size_t *);
772
+ /** @copydoc nk_reduce_minmax_f64 */
773
+ NK_PUBLIC void nk_reduce_minmax_e2m3_rvv(nk_e2m3_t const *, nk_size_t, nk_size_t, nk_e2m3_t *, nk_size_t *, nk_e2m3_t *,
774
+ nk_size_t *);
775
+ /** @copydoc nk_reduce_minmax_f64 */
776
+ NK_PUBLIC void nk_reduce_minmax_e3m2_rvv(nk_e3m2_t const *, nk_size_t, nk_size_t, nk_e3m2_t *, nk_size_t *, nk_e3m2_t *,
777
+ nk_size_t *);
778
+ #endif // NK_TARGET_RVV
779
+
780
+ #if NK_TARGET_V128RELAXED
781
+ /** @copydoc nk_reduce_moments_f64 */
782
+ NK_PUBLIC void nk_reduce_moments_f32_v128relaxed(nk_f32_t const *, nk_size_t, nk_size_t, nk_f64_t *, nk_f64_t *);
783
+ /** @copydoc nk_reduce_moments_f64 */
784
+ NK_PUBLIC void nk_reduce_moments_f64_v128relaxed(nk_f64_t const *, nk_size_t, nk_size_t, nk_f64_t *, nk_f64_t *);
785
+ /** @copydoc nk_reduce_moments_f64 */
786
+ NK_PUBLIC void nk_reduce_moments_i8_v128relaxed(nk_i8_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
787
+ /** @copydoc nk_reduce_moments_f64 */
788
+ NK_PUBLIC void nk_reduce_moments_u8_v128relaxed(nk_u8_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
789
+ /** @copydoc nk_reduce_moments_f64 */
790
+ NK_PUBLIC void nk_reduce_moments_i16_v128relaxed(nk_i16_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
791
+ /** @copydoc nk_reduce_moments_f64 */
792
+ NK_PUBLIC void nk_reduce_moments_u16_v128relaxed(nk_u16_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
793
+ /** @copydoc nk_reduce_moments_f64 */
794
+ NK_PUBLIC void nk_reduce_moments_i32_v128relaxed(nk_i32_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
795
+ /** @copydoc nk_reduce_moments_f64 */
796
+ NK_PUBLIC void nk_reduce_moments_u32_v128relaxed(nk_u32_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
797
+ /** @copydoc nk_reduce_moments_f64 */
798
+ NK_PUBLIC void nk_reduce_moments_i64_v128relaxed(nk_i64_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_u64_t *);
799
+ /** @copydoc nk_reduce_moments_f64 */
800
+ NK_PUBLIC void nk_reduce_moments_u64_v128relaxed(nk_u64_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_u64_t *);
801
+ /** @copydoc nk_reduce_moments_f64 */
802
+ NK_PUBLIC void nk_reduce_moments_f16_v128relaxed(nk_f16_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
803
+ /** @copydoc nk_reduce_moments_f64 */
804
+ NK_PUBLIC void nk_reduce_moments_bf16_v128relaxed(nk_bf16_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
805
+ /** @copydoc nk_reduce_moments_f64 */
806
+ NK_PUBLIC void nk_reduce_moments_e4m3_v128relaxed(nk_e4m3_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
807
+ /** @copydoc nk_reduce_moments_f64 */
808
+ NK_PUBLIC void nk_reduce_moments_e5m2_v128relaxed(nk_e5m2_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
809
+ /** @copydoc nk_reduce_moments_f64 */
810
+ NK_PUBLIC void nk_reduce_moments_e2m3_v128relaxed(nk_e2m3_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
811
+ /** @copydoc nk_reduce_moments_f64 */
812
+ NK_PUBLIC void nk_reduce_moments_e3m2_v128relaxed(nk_e3m2_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_f32_t *);
813
+ /** @copydoc nk_reduce_minmax_f64 */
814
+ NK_PUBLIC void nk_reduce_minmax_f32_v128relaxed(nk_f32_t const *, nk_size_t, nk_size_t, nk_f32_t *, nk_size_t *,
815
+ nk_f32_t *, nk_size_t *);
816
+ /** @copydoc nk_reduce_minmax_f64 */
817
+ NK_PUBLIC void nk_reduce_minmax_f64_v128relaxed(nk_f64_t const *, nk_size_t, nk_size_t, nk_f64_t *, nk_size_t *,
818
+ nk_f64_t *, nk_size_t *);
819
+ /** @copydoc nk_reduce_minmax_f64 */
820
+ NK_PUBLIC void nk_reduce_minmax_i8_v128relaxed(nk_i8_t const *, nk_size_t, nk_size_t, nk_i8_t *, nk_size_t *, nk_i8_t *,
821
+ nk_size_t *);
822
+ /** @copydoc nk_reduce_minmax_f64 */
823
+ NK_PUBLIC void nk_reduce_minmax_u8_v128relaxed(nk_u8_t const *, nk_size_t, nk_size_t, nk_u8_t *, nk_size_t *, nk_u8_t *,
824
+ nk_size_t *);
825
+ /** @copydoc nk_reduce_minmax_f64 */
826
+ NK_PUBLIC void nk_reduce_minmax_i16_v128relaxed(nk_i16_t const *, nk_size_t, nk_size_t, nk_i16_t *, nk_size_t *,
827
+ nk_i16_t *, nk_size_t *);
828
+ /** @copydoc nk_reduce_minmax_f64 */
829
+ NK_PUBLIC void nk_reduce_minmax_u16_v128relaxed(nk_u16_t const *, nk_size_t, nk_size_t, nk_u16_t *, nk_size_t *,
830
+ nk_u16_t *, nk_size_t *);
831
+ /** @copydoc nk_reduce_minmax_f64 */
832
+ NK_PUBLIC void nk_reduce_minmax_i32_v128relaxed(nk_i32_t const *, nk_size_t, nk_size_t, nk_i32_t *, nk_size_t *,
833
+ nk_i32_t *, nk_size_t *);
834
+ /** @copydoc nk_reduce_minmax_f64 */
835
+ NK_PUBLIC void nk_reduce_minmax_u32_v128relaxed(nk_u32_t const *, nk_size_t, nk_size_t, nk_u32_t *, nk_size_t *,
836
+ nk_u32_t *, nk_size_t *);
837
+ /** @copydoc nk_reduce_minmax_f64 */
838
+ NK_PUBLIC void nk_reduce_minmax_i64_v128relaxed(nk_i64_t const *, nk_size_t, nk_size_t, nk_i64_t *, nk_size_t *,
839
+ nk_i64_t *, nk_size_t *);
840
+ /** @copydoc nk_reduce_minmax_f64 */
841
+ NK_PUBLIC void nk_reduce_minmax_u64_v128relaxed(nk_u64_t const *, nk_size_t, nk_size_t, nk_u64_t *, nk_size_t *,
842
+ nk_u64_t *, nk_size_t *);
843
+ /** @copydoc nk_reduce_minmax_f64 */
844
+ NK_PUBLIC void nk_reduce_minmax_f16_v128relaxed(nk_f16_t const *, nk_size_t, nk_size_t, nk_f16_t *, nk_size_t *,
845
+ nk_f16_t *, nk_size_t *);
846
+ /** @copydoc nk_reduce_minmax_f64 */
847
+ NK_PUBLIC void nk_reduce_minmax_bf16_v128relaxed(nk_bf16_t const *, nk_size_t, nk_size_t, nk_bf16_t *, nk_size_t *,
848
+ nk_bf16_t *, nk_size_t *);
849
+ /** @copydoc nk_reduce_minmax_f64 */
850
+ NK_PUBLIC void nk_reduce_minmax_e4m3_v128relaxed(nk_e4m3_t const *, nk_size_t, nk_size_t, nk_e4m3_t *, nk_size_t *,
851
+ nk_e4m3_t *, nk_size_t *);
852
+ /** @copydoc nk_reduce_minmax_f64 */
853
+ NK_PUBLIC void nk_reduce_minmax_e5m2_v128relaxed(nk_e5m2_t const *, nk_size_t, nk_size_t, nk_e5m2_t *, nk_size_t *,
854
+ nk_e5m2_t *, nk_size_t *);
855
+ /** @copydoc nk_reduce_minmax_f64 */
856
+ NK_PUBLIC void nk_reduce_minmax_e2m3_v128relaxed(nk_e2m3_t const *, nk_size_t, nk_size_t, nk_e2m3_t *, nk_size_t *,
857
+ nk_e2m3_t *, nk_size_t *);
858
+ /** @copydoc nk_reduce_minmax_f64 */
859
+ NK_PUBLIC void nk_reduce_minmax_e3m2_v128relaxed(nk_e3m2_t const *, nk_size_t, nk_size_t, nk_e3m2_t *, nk_size_t *,
860
+ nk_e3m2_t *, nk_size_t *);
861
+ #endif // NK_TARGET_V128RELAXED
862
+
863
+ /**
864
+ * @brief Returns the accumulator dtype for the `sum` output of reduce_moments.
865
+ *
866
+ * Float types accumulate into wider floats; signed ints into i64; unsigned ints into u64.
867
+ */
868
+ NK_INTERNAL nk_dtype_t nk_reduce_moments_sum_dtype(nk_dtype_t dtype) {
869
+ switch (dtype) {
870
+ case nk_f64_k: return nk_f64_k;
871
+ case nk_f32_k: return nk_f64_k;
872
+ case nk_f16_k: return nk_f32_k;
873
+ case nk_bf16_k: return nk_f32_k;
874
+ case nk_e4m3_k: return nk_f32_k;
875
+ case nk_e5m2_k: return nk_f32_k;
876
+ case nk_e2m3_k: return nk_f32_k;
877
+ case nk_e3m2_k: return nk_f32_k;
878
+ case nk_i8_k: return nk_i64_k;
879
+ case nk_i16_k: return nk_i64_k;
880
+ case nk_i32_k: return nk_i64_k;
881
+ case nk_i64_k: return nk_i64_k;
882
+ case nk_i4_k: return nk_i64_k;
883
+ case nk_u8_k: return nk_u64_k;
884
+ case nk_u16_k: return nk_u64_k;
885
+ case nk_u32_k: return nk_u64_k;
886
+ case nk_u64_k: return nk_u64_k;
887
+ case nk_u4_k: return nk_u64_k;
888
+ case nk_u1_k: return nk_u64_k;
889
+ default: return nk_dtype_unknown_k;
890
+ }
891
+ }
892
+
893
+ /**
894
+ * @brief Returns the accumulator dtype for the `sumsq` output of reduce_moments.
895
+ *
896
+ * Same as sum except all integers (signed and unsigned) accumulate into u64.
897
+ */
898
+ NK_INTERNAL nk_dtype_t nk_reduce_moments_sumsq_dtype(nk_dtype_t dtype) {
899
+ switch (dtype) {
900
+ case nk_f64_k: return nk_f64_k;
901
+ case nk_f32_k: return nk_f64_k;
902
+ case nk_f16_k: return nk_f32_k;
903
+ case nk_bf16_k: return nk_f32_k;
904
+ case nk_e4m3_k: return nk_f32_k;
905
+ case nk_e5m2_k: return nk_f32_k;
906
+ case nk_e2m3_k: return nk_f32_k;
907
+ case nk_e3m2_k: return nk_f32_k;
908
+ case nk_i8_k: return nk_u64_k;
909
+ case nk_i16_k: return nk_u64_k;
910
+ case nk_i32_k: return nk_u64_k;
911
+ case nk_i64_k: return nk_u64_k;
912
+ case nk_i4_k: return nk_u64_k;
913
+ case nk_u8_k: return nk_u64_k;
914
+ case nk_u16_k: return nk_u64_k;
915
+ case nk_u32_k: return nk_u64_k;
916
+ case nk_u64_k: return nk_u64_k;
917
+ case nk_u4_k: return nk_u64_k;
918
+ case nk_u1_k: return nk_u64_k;
919
+ default: return nk_dtype_unknown_k;
920
+ }
921
+ }
922
+
923
+ /**
924
+ * @brief Returns the value dtype for reduce_minmax outputs.
925
+ *
926
+ * Standard types return themselves. Sub-byte types widen: i4->i8, u4->u8, u1->u8.
927
+ */
928
+ NK_INTERNAL nk_dtype_t nk_reduce_minmax_value_dtype(nk_dtype_t dtype) {
929
+ switch (dtype) {
930
+ case nk_i4_k: return nk_i8_k;
931
+ case nk_u4_k: return nk_u8_k;
932
+ case nk_u1_k: return nk_u8_k;
933
+ default: return dtype;
934
+ }
935
+ }
936
+
937
+ #ifdef __cplusplus
938
+ } // extern "C"
939
+ #endif
940
+
941
+ #include "numkong/reduce/serial.h"
942
+ #include "numkong/reduce/neon.h"
943
+ #include "numkong/reduce/neonbfdot.h"
944
+ #include "numkong/reduce/neonsdot.h"
945
+ #include "numkong/reduce/neonfhm.h"
946
+ #include "numkong/reduce/haswell.h"
947
+ #include "numkong/reduce/skylake.h"
948
+ #include "numkong/reduce/icelake.h"
949
+ #include "numkong/reduce/genoa.h"
950
+ #include "numkong/reduce/alder.h"
951
+ #include "numkong/reduce/sierra.h"
952
+ #include "numkong/reduce/rvv.h"
953
+ #include "numkong/reduce/v128relaxed.h"
954
+
955
+ #ifdef __cplusplus
956
+ extern "C" {
957
+ #endif
958
+
959
+ #if !NK_DYNAMIC_DISPATCH
960
+
961
+ NK_PUBLIC void nk_reduce_moments_f32(nk_f32_t const *d, nk_size_t n, nk_size_t s, nk_f64_t *sum, nk_f64_t *sumsq) {
962
+ #if NK_TARGET_SKYLAKE
963
+ nk_reduce_moments_f32_skylake(d, n, s, sum, sumsq);
964
+ #elif NK_TARGET_HASWELL
965
+ nk_reduce_moments_f32_haswell(d, n, s, sum, sumsq);
966
+ #elif NK_TARGET_NEON
967
+ nk_reduce_moments_f32_neon(d, n, s, sum, sumsq);
968
+ #elif NK_TARGET_RVV
969
+ nk_reduce_moments_f32_rvv(d, n, s, sum, sumsq);
970
+ #elif NK_TARGET_V128RELAXED
971
+ nk_reduce_moments_f32_v128relaxed(d, n, s, sum, sumsq);
972
+ #else
973
+ nk_reduce_moments_f32_serial(d, n, s, sum, sumsq);
974
+ #endif
975
+ }
976
+
977
+ NK_PUBLIC void nk_reduce_minmax_f32(nk_f32_t const *d, nk_size_t n, nk_size_t s, nk_f32_t *mn, nk_size_t *mi,
978
+ nk_f32_t *mx, nk_size_t *xi) {
979
+ #if NK_TARGET_SKYLAKE
980
+ nk_reduce_minmax_f32_skylake(d, n, s, mn, mi, mx, xi);
981
+ #elif NK_TARGET_HASWELL
982
+ nk_reduce_minmax_f32_haswell(d, n, s, mn, mi, mx, xi);
983
+ #elif NK_TARGET_NEON
984
+ nk_reduce_minmax_f32_neon(d, n, s, mn, mi, mx, xi);
985
+ #elif NK_TARGET_RVV
986
+ nk_reduce_minmax_f32_rvv(d, n, s, mn, mi, mx, xi);
987
+ #elif NK_TARGET_V128RELAXED
988
+ nk_reduce_minmax_f32_v128relaxed(d, n, s, mn, mi, mx, xi);
989
+ #else
990
+ nk_reduce_minmax_f32_serial(d, n, s, mn, mi, mx, xi);
991
+ #endif
992
+ }
993
+
994
+ NK_PUBLIC void nk_reduce_moments_f64(nk_f64_t const *d, nk_size_t n, nk_size_t s, nk_f64_t *sum, nk_f64_t *sumsq) {
995
+ #if NK_TARGET_SKYLAKE
996
+ nk_reduce_moments_f64_skylake(d, n, s, sum, sumsq);
997
+ #elif NK_TARGET_HASWELL
998
+ nk_reduce_moments_f64_haswell(d, n, s, sum, sumsq);
999
+ #elif NK_TARGET_NEON
1000
+ nk_reduce_moments_f64_neon(d, n, s, sum, sumsq);
1001
+ #elif NK_TARGET_RVV
1002
+ nk_reduce_moments_f64_rvv(d, n, s, sum, sumsq);
1003
+ #elif NK_TARGET_V128RELAXED
1004
+ nk_reduce_moments_f64_v128relaxed(d, n, s, sum, sumsq);
1005
+ #else
1006
+ nk_reduce_moments_f64_serial(d, n, s, sum, sumsq);
1007
+ #endif
1008
+ }
1009
+
1010
+ NK_PUBLIC void nk_reduce_minmax_f64(nk_f64_t const *d, nk_size_t n, nk_size_t s, nk_f64_t *mn, nk_size_t *mi,
1011
+ nk_f64_t *mx, nk_size_t *xi) {
1012
+ #if NK_TARGET_SKYLAKE
1013
+ nk_reduce_minmax_f64_skylake(d, n, s, mn, mi, mx, xi);
1014
+ #elif NK_TARGET_HASWELL
1015
+ nk_reduce_minmax_f64_haswell(d, n, s, mn, mi, mx, xi);
1016
+ #elif NK_TARGET_NEON
1017
+ nk_reduce_minmax_f64_neon(d, n, s, mn, mi, mx, xi);
1018
+ #elif NK_TARGET_RVV
1019
+ nk_reduce_minmax_f64_rvv(d, n, s, mn, mi, mx, xi);
1020
+ #elif NK_TARGET_V128RELAXED
1021
+ nk_reduce_minmax_f64_v128relaxed(d, n, s, mn, mi, mx, xi);
1022
+ #else
1023
+ nk_reduce_minmax_f64_serial(d, n, s, mn, mi, mx, xi);
1024
+ #endif
1025
+ }
1026
+
1027
+ NK_PUBLIC void nk_reduce_moments_i8(nk_i8_t const *d, nk_size_t n, nk_size_t s, nk_i64_t *sum, nk_u64_t *sumsq) {
1028
+ #if NK_TARGET_ICELAKE
1029
+ nk_reduce_moments_i8_icelake(d, n, s, sum, sumsq);
1030
+ #elif NK_TARGET_SKYLAKE
1031
+ nk_reduce_moments_i8_skylake(d, n, s, sum, sumsq);
1032
+ #elif NK_TARGET_SIERRA
1033
+ nk_reduce_moments_i8_sierra(d, n, s, sum, sumsq);
1034
+ #elif NK_TARGET_HASWELL
1035
+ nk_reduce_moments_i8_haswell(d, n, s, sum, sumsq);
1036
+ #elif NK_TARGET_NEONSDOT
1037
+ nk_reduce_moments_i8_neonsdot(d, n, s, sum, sumsq);
1038
+ #elif NK_TARGET_NEON
1039
+ nk_reduce_moments_i8_neon(d, n, s, sum, sumsq);
1040
+ #elif NK_TARGET_RVV
1041
+ nk_reduce_moments_i8_rvv(d, n, s, sum, sumsq);
1042
+ #elif NK_TARGET_V128RELAXED
1043
+ nk_reduce_moments_i8_v128relaxed(d, n, s, sum, sumsq);
1044
+ #else
1045
+ nk_reduce_moments_i8_serial(d, n, s, sum, sumsq);
1046
+ #endif
1047
+ }
1048
+
1049
+ NK_PUBLIC void nk_reduce_minmax_i8(nk_i8_t const *d, nk_size_t n, nk_size_t s, nk_i8_t *mn, nk_size_t *mi, nk_i8_t *mx,
1050
+ nk_size_t *xi) {
1051
+ #if NK_TARGET_SKYLAKE
1052
+ nk_reduce_minmax_i8_skylake(d, n, s, mn, mi, mx, xi);
1053
+ #elif NK_TARGET_HASWELL
1054
+ nk_reduce_minmax_i8_haswell(d, n, s, mn, mi, mx, xi);
1055
+ #elif NK_TARGET_NEON
1056
+ nk_reduce_minmax_i8_neon(d, n, s, mn, mi, mx, xi);
1057
+ #elif NK_TARGET_RVV
1058
+ nk_reduce_minmax_i8_rvv(d, n, s, mn, mi, mx, xi);
1059
+ #elif NK_TARGET_V128RELAXED
1060
+ nk_reduce_minmax_i8_v128relaxed(d, n, s, mn, mi, mx, xi);
1061
+ #else
1062
+ nk_reduce_minmax_i8_serial(d, n, s, mn, mi, mx, xi);
1063
+ #endif
1064
+ }
1065
+
1066
+ NK_PUBLIC void nk_reduce_moments_u8(nk_u8_t const *d, nk_size_t n, nk_size_t s, nk_u64_t *sum, nk_u64_t *sumsq) {
1067
+ #if NK_TARGET_ICELAKE
1068
+ nk_reduce_moments_u8_icelake(d, n, s, sum, sumsq);
1069
+ #elif NK_TARGET_SKYLAKE
1070
+ nk_reduce_moments_u8_skylake(d, n, s, sum, sumsq);
1071
+ #elif NK_TARGET_SIERRA
1072
+ nk_reduce_moments_u8_sierra(d, n, s, sum, sumsq);
1073
+ #elif NK_TARGET_ALDER
1074
+ nk_reduce_moments_u8_alder(d, n, s, sum, sumsq);
1075
+ #elif NK_TARGET_HASWELL
1076
+ nk_reduce_moments_u8_haswell(d, n, s, sum, sumsq);
1077
+ #elif NK_TARGET_NEONSDOT
1078
+ nk_reduce_moments_u8_neonsdot(d, n, s, sum, sumsq);
1079
+ #elif NK_TARGET_NEON
1080
+ nk_reduce_moments_u8_neon(d, n, s, sum, sumsq);
1081
+ #elif NK_TARGET_RVV
1082
+ nk_reduce_moments_u8_rvv(d, n, s, sum, sumsq);
1083
+ #elif NK_TARGET_V128RELAXED
1084
+ nk_reduce_moments_u8_v128relaxed(d, n, s, sum, sumsq);
1085
+ #else
1086
+ nk_reduce_moments_u8_serial(d, n, s, sum, sumsq);
1087
+ #endif
1088
+ }
1089
+
1090
+ NK_PUBLIC void nk_reduce_minmax_u8(nk_u8_t const *d, nk_size_t n, nk_size_t s, nk_u8_t *mn, nk_size_t *mi, nk_u8_t *mx,
1091
+ nk_size_t *xi) {
1092
+ #if NK_TARGET_SKYLAKE
1093
+ nk_reduce_minmax_u8_skylake(d, n, s, mn, mi, mx, xi);
1094
+ #elif NK_TARGET_HASWELL
1095
+ nk_reduce_minmax_u8_haswell(d, n, s, mn, mi, mx, xi);
1096
+ #elif NK_TARGET_NEON
1097
+ nk_reduce_minmax_u8_neon(d, n, s, mn, mi, mx, xi);
1098
+ #elif NK_TARGET_RVV
1099
+ nk_reduce_minmax_u8_rvv(d, n, s, mn, mi, mx, xi);
1100
+ #elif NK_TARGET_V128RELAXED
1101
+ nk_reduce_minmax_u8_v128relaxed(d, n, s, mn, mi, mx, xi);
1102
+ #else
1103
+ nk_reduce_minmax_u8_serial(d, n, s, mn, mi, mx, xi);
1104
+ #endif
1105
+ }
1106
+
1107
+ NK_PUBLIC void nk_reduce_moments_i16(nk_i16_t const *d, nk_size_t n, nk_size_t s, nk_i64_t *sum, nk_u64_t *sumsq) {
1108
+ #if NK_TARGET_ICELAKE
1109
+ nk_reduce_moments_i16_icelake(d, n, s, sum, sumsq);
1110
+ #elif NK_TARGET_SKYLAKE
1111
+ nk_reduce_moments_i16_skylake(d, n, s, sum, sumsq);
1112
+ #elif NK_TARGET_ALDER
1113
+ nk_reduce_moments_i16_alder(d, n, s, sum, sumsq);
1114
+ #elif NK_TARGET_HASWELL
1115
+ nk_reduce_moments_i16_haswell(d, n, s, sum, sumsq);
1116
+ #elif NK_TARGET_NEON
1117
+ nk_reduce_moments_i16_neon(d, n, s, sum, sumsq);
1118
+ #elif NK_TARGET_RVV
1119
+ nk_reduce_moments_i16_rvv(d, n, s, sum, sumsq);
1120
+ #elif NK_TARGET_V128RELAXED
1121
+ nk_reduce_moments_i16_v128relaxed(d, n, s, sum, sumsq);
1122
+ #else
1123
+ nk_reduce_moments_i16_serial(d, n, s, sum, sumsq);
1124
+ #endif
1125
+ }
1126
+
1127
+ NK_PUBLIC void nk_reduce_minmax_i16(nk_i16_t const *d, nk_size_t n, nk_size_t s, nk_i16_t *mn, nk_size_t *mi,
1128
+ nk_i16_t *mx, nk_size_t *xi) {
1129
+ #if NK_TARGET_SKYLAKE
1130
+ nk_reduce_minmax_i16_skylake(d, n, s, mn, mi, mx, xi);
1131
+ #elif NK_TARGET_HASWELL
1132
+ nk_reduce_minmax_i16_haswell(d, n, s, mn, mi, mx, xi);
1133
+ #elif NK_TARGET_NEON
1134
+ nk_reduce_minmax_i16_neon(d, n, s, mn, mi, mx, xi);
1135
+ #elif NK_TARGET_RVV
1136
+ nk_reduce_minmax_i16_rvv(d, n, s, mn, mi, mx, xi);
1137
+ #elif NK_TARGET_V128RELAXED
1138
+ nk_reduce_minmax_i16_v128relaxed(d, n, s, mn, mi, mx, xi);
1139
+ #else
1140
+ nk_reduce_minmax_i16_serial(d, n, s, mn, mi, mx, xi);
1141
+ #endif
1142
+ }
1143
+
1144
+ NK_PUBLIC void nk_reduce_moments_u16(nk_u16_t const *d, nk_size_t n, nk_size_t s, nk_u64_t *sum, nk_u64_t *sumsq) {
1145
+ #if NK_TARGET_SKYLAKE
1146
+ nk_reduce_moments_u16_skylake(d, n, s, sum, sumsq);
1147
+ #elif NK_TARGET_ALDER
1148
+ nk_reduce_moments_u16_alder(d, n, s, sum, sumsq);
1149
+ #elif NK_TARGET_HASWELL
1150
+ nk_reduce_moments_u16_haswell(d, n, s, sum, sumsq);
1151
+ #elif NK_TARGET_NEON
1152
+ nk_reduce_moments_u16_neon(d, n, s, sum, sumsq);
1153
+ #elif NK_TARGET_RVV
1154
+ nk_reduce_moments_u16_rvv(d, n, s, sum, sumsq);
1155
+ #elif NK_TARGET_V128RELAXED
1156
+ nk_reduce_moments_u16_v128relaxed(d, n, s, sum, sumsq);
1157
+ #else
1158
+ nk_reduce_moments_u16_serial(d, n, s, sum, sumsq);
1159
+ #endif
1160
+ }
1161
+
1162
+ NK_PUBLIC void nk_reduce_minmax_u16(nk_u16_t const *d, nk_size_t n, nk_size_t s, nk_u16_t *mn, nk_size_t *mi,
1163
+ nk_u16_t *mx, nk_size_t *xi) {
1164
+ #if NK_TARGET_SKYLAKE
1165
+ nk_reduce_minmax_u16_skylake(d, n, s, mn, mi, mx, xi);
1166
+ #elif NK_TARGET_HASWELL
1167
+ nk_reduce_minmax_u16_haswell(d, n, s, mn, mi, mx, xi);
1168
+ #elif NK_TARGET_NEON
1169
+ nk_reduce_minmax_u16_neon(d, n, s, mn, mi, mx, xi);
1170
+ #elif NK_TARGET_RVV
1171
+ nk_reduce_minmax_u16_rvv(d, n, s, mn, mi, mx, xi);
1172
+ #elif NK_TARGET_V128RELAXED
1173
+ nk_reduce_minmax_u16_v128relaxed(d, n, s, mn, mi, mx, xi);
1174
+ #else
1175
+ nk_reduce_minmax_u16_serial(d, n, s, mn, mi, mx, xi);
1176
+ #endif
1177
+ }
1178
+
1179
+ NK_PUBLIC void nk_reduce_moments_i32(nk_i32_t const *d, nk_size_t n, nk_size_t s, nk_i64_t *sum, nk_u64_t *sumsq) {
1180
+ #if NK_TARGET_SKYLAKE
1181
+ nk_reduce_moments_i32_skylake(d, n, s, sum, sumsq);
1182
+ #elif NK_TARGET_HASWELL
1183
+ nk_reduce_moments_i32_haswell(d, n, s, sum, sumsq);
1184
+ #elif NK_TARGET_NEON
1185
+ nk_reduce_moments_i32_neon(d, n, s, sum, sumsq);
1186
+ #elif NK_TARGET_RVV
1187
+ nk_reduce_moments_i32_rvv(d, n, s, sum, sumsq);
1188
+ #elif NK_TARGET_V128RELAXED
1189
+ nk_reduce_moments_i32_v128relaxed(d, n, s, sum, sumsq);
1190
+ #else
1191
+ nk_reduce_moments_i32_serial(d, n, s, sum, sumsq);
1192
+ #endif
1193
+ }
1194
+
1195
+ NK_PUBLIC void nk_reduce_minmax_i32(nk_i32_t const *d, nk_size_t n, nk_size_t s, nk_i32_t *mn, nk_size_t *mi,
1196
+ nk_i32_t *mx, nk_size_t *xi) {
1197
+ #if NK_TARGET_SKYLAKE
1198
+ nk_reduce_minmax_i32_skylake(d, n, s, mn, mi, mx, xi);
1199
+ #elif NK_TARGET_HASWELL
1200
+ nk_reduce_minmax_i32_haswell(d, n, s, mn, mi, mx, xi);
1201
+ #elif NK_TARGET_NEON
1202
+ nk_reduce_minmax_i32_neon(d, n, s, mn, mi, mx, xi);
1203
+ #elif NK_TARGET_RVV
1204
+ nk_reduce_minmax_i32_rvv(d, n, s, mn, mi, mx, xi);
1205
+ #elif NK_TARGET_V128RELAXED
1206
+ nk_reduce_minmax_i32_v128relaxed(d, n, s, mn, mi, mx, xi);
1207
+ #else
1208
+ nk_reduce_minmax_i32_serial(d, n, s, mn, mi, mx, xi);
1209
+ #endif
1210
+ }
1211
+
1212
+ NK_PUBLIC void nk_reduce_moments_u32(nk_u32_t const *d, nk_size_t n, nk_size_t s, nk_u64_t *sum, nk_u64_t *sumsq) {
1213
+ #if NK_TARGET_SKYLAKE
1214
+ nk_reduce_moments_u32_skylake(d, n, s, sum, sumsq);
1215
+ #elif NK_TARGET_HASWELL
1216
+ nk_reduce_moments_u32_haswell(d, n, s, sum, sumsq);
1217
+ #elif NK_TARGET_NEON
1218
+ nk_reduce_moments_u32_neon(d, n, s, sum, sumsq);
1219
+ #elif NK_TARGET_RVV
1220
+ nk_reduce_moments_u32_rvv(d, n, s, sum, sumsq);
1221
+ #elif NK_TARGET_V128RELAXED
1222
+ nk_reduce_moments_u32_v128relaxed(d, n, s, sum, sumsq);
1223
+ #else
1224
+ nk_reduce_moments_u32_serial(d, n, s, sum, sumsq);
1225
+ #endif
1226
+ }
1227
+
1228
+ NK_PUBLIC void nk_reduce_minmax_u32(nk_u32_t const *d, nk_size_t n, nk_size_t s, nk_u32_t *mn, nk_size_t *mi,
1229
+ nk_u32_t *mx, nk_size_t *xi) {
1230
+ #if NK_TARGET_SKYLAKE
1231
+ nk_reduce_minmax_u32_skylake(d, n, s, mn, mi, mx, xi);
1232
+ #elif NK_TARGET_HASWELL
1233
+ nk_reduce_minmax_u32_haswell(d, n, s, mn, mi, mx, xi);
1234
+ #elif NK_TARGET_NEON
1235
+ nk_reduce_minmax_u32_neon(d, n, s, mn, mi, mx, xi);
1236
+ #elif NK_TARGET_RVV
1237
+ nk_reduce_minmax_u32_rvv(d, n, s, mn, mi, mx, xi);
1238
+ #elif NK_TARGET_V128RELAXED
1239
+ nk_reduce_minmax_u32_v128relaxed(d, n, s, mn, mi, mx, xi);
1240
+ #else
1241
+ nk_reduce_minmax_u32_serial(d, n, s, mn, mi, mx, xi);
1242
+ #endif
1243
+ }
1244
+
1245
+ NK_PUBLIC void nk_reduce_moments_i64(nk_i64_t const *d, nk_size_t n, nk_size_t s, nk_i64_t *sum, nk_u64_t *sumsq) {
1246
+ #if NK_TARGET_SKYLAKE
1247
+ nk_reduce_moments_i64_skylake(d, n, s, sum, sumsq);
1248
+ #elif NK_TARGET_HASWELL
1249
+ nk_reduce_moments_i64_haswell(d, n, s, sum, sumsq);
1250
+ #elif NK_TARGET_NEON
1251
+ nk_reduce_moments_i64_neon(d, n, s, sum, sumsq);
1252
+ #elif NK_TARGET_RVV
1253
+ nk_reduce_moments_i64_rvv(d, n, s, sum, sumsq);
1254
+ #elif NK_TARGET_V128RELAXED
1255
+ nk_reduce_moments_i64_v128relaxed(d, n, s, sum, sumsq);
1256
+ #else
1257
+ nk_reduce_moments_i64_serial(d, n, s, sum, sumsq);
1258
+ #endif
1259
+ }
1260
+
1261
+ NK_PUBLIC void nk_reduce_minmax_i64(nk_i64_t const *d, nk_size_t n, nk_size_t s, nk_i64_t *mn, nk_size_t *mi,
1262
+ nk_i64_t *mx, nk_size_t *xi) {
1263
+ #if NK_TARGET_SKYLAKE
1264
+ nk_reduce_minmax_i64_skylake(d, n, s, mn, mi, mx, xi);
1265
+ #elif NK_TARGET_HASWELL
1266
+ nk_reduce_minmax_i64_haswell(d, n, s, mn, mi, mx, xi);
1267
+ #elif NK_TARGET_NEON
1268
+ nk_reduce_minmax_i64_neon(d, n, s, mn, mi, mx, xi);
1269
+ #elif NK_TARGET_RVV
1270
+ nk_reduce_minmax_i64_rvv(d, n, s, mn, mi, mx, xi);
1271
+ #elif NK_TARGET_V128RELAXED
1272
+ nk_reduce_minmax_i64_v128relaxed(d, n, s, mn, mi, mx, xi);
1273
+ #else
1274
+ nk_reduce_minmax_i64_serial(d, n, s, mn, mi, mx, xi);
1275
+ #endif
1276
+ }
1277
+
1278
+ NK_PUBLIC void nk_reduce_moments_u64(nk_u64_t const *d, nk_size_t n, nk_size_t s, nk_u64_t *sum, nk_u64_t *sumsq) {
1279
+ #if NK_TARGET_SKYLAKE
1280
+ nk_reduce_moments_u64_skylake(d, n, s, sum, sumsq);
1281
+ #elif NK_TARGET_HASWELL
1282
+ nk_reduce_moments_u64_haswell(d, n, s, sum, sumsq);
1283
+ #elif NK_TARGET_NEON
1284
+ nk_reduce_moments_u64_neon(d, n, s, sum, sumsq);
1285
+ #elif NK_TARGET_RVV
1286
+ nk_reduce_moments_u64_rvv(d, n, s, sum, sumsq);
1287
+ #elif NK_TARGET_V128RELAXED
1288
+ nk_reduce_moments_u64_v128relaxed(d, n, s, sum, sumsq);
1289
+ #else
1290
+ nk_reduce_moments_u64_serial(d, n, s, sum, sumsq);
1291
+ #endif
1292
+ }
1293
+
1294
+ NK_PUBLIC void nk_reduce_minmax_u64(nk_u64_t const *d, nk_size_t n, nk_size_t s, nk_u64_t *mn, nk_size_t *mi,
1295
+ nk_u64_t *mx, nk_size_t *xi) {
1296
+ #if NK_TARGET_SKYLAKE
1297
+ nk_reduce_minmax_u64_skylake(d, n, s, mn, mi, mx, xi);
1298
+ #elif NK_TARGET_HASWELL
1299
+ nk_reduce_minmax_u64_haswell(d, n, s, mn, mi, mx, xi);
1300
+ #elif NK_TARGET_NEON
1301
+ nk_reduce_minmax_u64_neon(d, n, s, mn, mi, mx, xi);
1302
+ #elif NK_TARGET_RVV
1303
+ nk_reduce_minmax_u64_rvv(d, n, s, mn, mi, mx, xi);
1304
+ #elif NK_TARGET_V128RELAXED
1305
+ nk_reduce_minmax_u64_v128relaxed(d, n, s, mn, mi, mx, xi);
1306
+ #else
1307
+ nk_reduce_minmax_u64_serial(d, n, s, mn, mi, mx, xi);
1308
+ #endif
1309
+ }
1310
+
1311
+ NK_PUBLIC void nk_reduce_moments_f16(nk_f16_t const *d, nk_size_t n, nk_size_t s, nk_f32_t *sum, nk_f32_t *sumsq) {
1312
+ #if NK_TARGET_SKYLAKE
1313
+ nk_reduce_moments_f16_skylake(d, n, s, sum, sumsq);
1314
+ #elif NK_TARGET_HASWELL
1315
+ nk_reduce_moments_f16_haswell(d, n, s, sum, sumsq);
1316
+ #elif NK_TARGET_NEON
1317
+ nk_reduce_moments_f16_neon(d, n, s, sum, sumsq);
1318
+ #elif NK_TARGET_RVV
1319
+ nk_reduce_moments_f16_rvv(d, n, s, sum, sumsq);
1320
+ #elif NK_TARGET_V128RELAXED
1321
+ nk_reduce_moments_f16_v128relaxed(d, n, s, sum, sumsq);
1322
+ #else
1323
+ nk_reduce_moments_f16_serial(d, n, s, sum, sumsq);
1324
+ #endif
1325
+ }
1326
+
1327
+ NK_PUBLIC void nk_reduce_minmax_f16(nk_f16_t const *d, nk_size_t n, nk_size_t s, nk_f16_t *mn, nk_size_t *mi,
1328
+ nk_f16_t *mx, nk_size_t *xi) {
1329
+ #if NK_TARGET_SKYLAKE
1330
+ nk_reduce_minmax_f16_skylake(d, n, s, mn, mi, mx, xi);
1331
+ #elif NK_TARGET_HASWELL
1332
+ nk_reduce_minmax_f16_haswell(d, n, s, mn, mi, mx, xi);
1333
+ #elif NK_TARGET_NEONHALF
1334
+ nk_reduce_minmax_f16_serial(d, n, s, mn, mi, mx, xi);
1335
+ #elif NK_TARGET_RVV
1336
+ nk_reduce_minmax_f16_rvv(d, n, s, mn, mi, mx, xi);
1337
+ #elif NK_TARGET_V128RELAXED
1338
+ nk_reduce_minmax_f16_v128relaxed(d, n, s, mn, mi, mx, xi);
1339
+ #else
1340
+ nk_reduce_minmax_f16_serial(d, n, s, mn, mi, mx, xi);
1341
+ #endif
1342
+ }
1343
+
1344
+ NK_PUBLIC void nk_reduce_moments_bf16(nk_bf16_t const *d, nk_size_t n, nk_size_t s, nk_f32_t *sum, nk_f32_t *sumsq) {
1345
+ #if NK_TARGET_GENOA
1346
+ nk_reduce_moments_bf16_genoa(d, n, s, sum, sumsq);
1347
+ #elif NK_TARGET_SKYLAKE
1348
+ nk_reduce_moments_bf16_skylake(d, n, s, sum, sumsq);
1349
+ #elif NK_TARGET_HASWELL
1350
+ nk_reduce_moments_bf16_haswell(d, n, s, sum, sumsq);
1351
+ #elif NK_TARGET_NEONBFDOT
1352
+ nk_reduce_moments_bf16_neonbfdot(d, n, s, sum, sumsq);
1353
+ #elif NK_TARGET_RVV
1354
+ nk_reduce_moments_bf16_rvv(d, n, s, sum, sumsq);
1355
+ #elif NK_TARGET_V128RELAXED
1356
+ nk_reduce_moments_bf16_v128relaxed(d, n, s, sum, sumsq);
1357
+ #else
1358
+ nk_reduce_moments_bf16_serial(d, n, s, sum, sumsq);
1359
+ #endif
1360
+ }
1361
+
1362
+ NK_PUBLIC void nk_reduce_minmax_bf16(nk_bf16_t const *d, nk_size_t n, nk_size_t s, nk_bf16_t *mn, nk_size_t *mi,
1363
+ nk_bf16_t *mx, nk_size_t *xi) {
1364
+ #if NK_TARGET_SKYLAKE
1365
+ nk_reduce_minmax_bf16_skylake(d, n, s, mn, mi, mx, xi);
1366
+ #elif NK_TARGET_HASWELL
1367
+ nk_reduce_minmax_bf16_haswell(d, n, s, mn, mi, mx, xi);
1368
+ #elif NK_TARGET_RVV
1369
+ nk_reduce_minmax_bf16_rvv(d, n, s, mn, mi, mx, xi);
1370
+ #elif NK_TARGET_V128RELAXED
1371
+ nk_reduce_minmax_bf16_v128relaxed(d, n, s, mn, mi, mx, xi);
1372
+ #else
1373
+ nk_reduce_minmax_bf16_serial(d, n, s, mn, mi, mx, xi);
1374
+ #endif
1375
+ }
1376
+
1377
+ NK_PUBLIC void nk_reduce_moments_e4m3(nk_e4m3_t const *d, nk_size_t n, nk_size_t s, nk_f32_t *sum, nk_f32_t *sumsq) {
1378
+ #if NK_TARGET_GENOA
1379
+ nk_reduce_moments_e4m3_genoa(d, n, s, sum, sumsq);
1380
+ #elif NK_TARGET_SKYLAKE
1381
+ nk_reduce_moments_e4m3_skylake(d, n, s, sum, sumsq);
1382
+ #elif NK_TARGET_HASWELL
1383
+ nk_reduce_moments_e4m3_haswell(d, n, s, sum, sumsq);
1384
+ #elif NK_TARGET_NEONFHM
1385
+ nk_reduce_moments_e4m3_neonfhm(d, n, s, sum, sumsq);
1386
+ #elif NK_TARGET_NEON
1387
+ nk_reduce_moments_e4m3_neon(d, n, s, sum, sumsq);
1388
+ #elif NK_TARGET_RVV
1389
+ nk_reduce_moments_e4m3_rvv(d, n, s, sum, sumsq);
1390
+ #elif NK_TARGET_V128RELAXED
1391
+ nk_reduce_moments_e4m3_v128relaxed(d, n, s, sum, sumsq);
1392
+ #else
1393
+ nk_reduce_moments_e4m3_serial(d, n, s, sum, sumsq);
1394
+ #endif
1395
+ }
1396
+
1397
+ NK_PUBLIC void nk_reduce_minmax_e4m3(nk_e4m3_t const *d, nk_size_t n, nk_size_t s, nk_e4m3_t *mn, nk_size_t *mi,
1398
+ nk_e4m3_t *mx, nk_size_t *xi) {
1399
+ #if NK_TARGET_SKYLAKE
1400
+ nk_reduce_minmax_e4m3_skylake(d, n, s, mn, mi, mx, xi);
1401
+ #elif NK_TARGET_HASWELL
1402
+ nk_reduce_minmax_e4m3_haswell(d, n, s, mn, mi, mx, xi);
1403
+ #elif NK_TARGET_NEON
1404
+ nk_reduce_minmax_e4m3_neon(d, n, s, mn, mi, mx, xi);
1405
+ #elif NK_TARGET_RVV
1406
+ nk_reduce_minmax_e4m3_rvv(d, n, s, mn, mi, mx, xi);
1407
+ #elif NK_TARGET_V128RELAXED
1408
+ nk_reduce_minmax_e4m3_v128relaxed(d, n, s, mn, mi, mx, xi);
1409
+ #else
1410
+ nk_reduce_minmax_e4m3_serial(d, n, s, mn, mi, mx, xi);
1411
+ #endif
1412
+ }
1413
+
1414
+ NK_PUBLIC void nk_reduce_moments_e5m2(nk_e5m2_t const *d, nk_size_t n, nk_size_t s, nk_f32_t *sum, nk_f32_t *sumsq) {
1415
+ #if NK_TARGET_GENOA
1416
+ nk_reduce_moments_e5m2_genoa(d, n, s, sum, sumsq);
1417
+ #elif NK_TARGET_SKYLAKE
1418
+ nk_reduce_moments_e5m2_skylake(d, n, s, sum, sumsq);
1419
+ #elif NK_TARGET_HASWELL
1420
+ nk_reduce_moments_e5m2_haswell(d, n, s, sum, sumsq);
1421
+ #elif NK_TARGET_NEONFHM
1422
+ nk_reduce_moments_e5m2_neonfhm(d, n, s, sum, sumsq);
1423
+ #elif NK_TARGET_NEON
1424
+ nk_reduce_moments_e5m2_neon(d, n, s, sum, sumsq);
1425
+ #elif NK_TARGET_RVV
1426
+ nk_reduce_moments_e5m2_rvv(d, n, s, sum, sumsq);
1427
+ #elif NK_TARGET_V128RELAXED
1428
+ nk_reduce_moments_e5m2_v128relaxed(d, n, s, sum, sumsq);
1429
+ #else
1430
+ nk_reduce_moments_e5m2_serial(d, n, s, sum, sumsq);
1431
+ #endif
1432
+ }
1433
+
1434
+ NK_PUBLIC void nk_reduce_minmax_e5m2(nk_e5m2_t const *d, nk_size_t n, nk_size_t s, nk_e5m2_t *mn, nk_size_t *mi,
1435
+ nk_e5m2_t *mx, nk_size_t *xi) {
1436
+ #if NK_TARGET_SKYLAKE
1437
+ nk_reduce_minmax_e5m2_skylake(d, n, s, mn, mi, mx, xi);
1438
+ #elif NK_TARGET_HASWELL
1439
+ nk_reduce_minmax_e5m2_haswell(d, n, s, mn, mi, mx, xi);
1440
+ #elif NK_TARGET_NEON
1441
+ nk_reduce_minmax_e5m2_neon(d, n, s, mn, mi, mx, xi);
1442
+ #elif NK_TARGET_RVV
1443
+ nk_reduce_minmax_e5m2_rvv(d, n, s, mn, mi, mx, xi);
1444
+ #elif NK_TARGET_V128RELAXED
1445
+ nk_reduce_minmax_e5m2_v128relaxed(d, n, s, mn, mi, mx, xi);
1446
+ #else
1447
+ nk_reduce_minmax_e5m2_serial(d, n, s, mn, mi, mx, xi);
1448
+ #endif
1449
+ }
1450
+
1451
+ NK_PUBLIC void nk_reduce_moments_e2m3(nk_e2m3_t const *d, nk_size_t n, nk_size_t s, nk_f32_t *sum, nk_f32_t *sumsq) {
1452
+ #if NK_TARGET_ICELAKE
1453
+ nk_reduce_moments_e2m3_icelake(d, n, s, sum, sumsq);
1454
+ #elif NK_TARGET_SKYLAKE
1455
+ nk_reduce_moments_e2m3_skylake(d, n, s, sum, sumsq);
1456
+ #elif NK_TARGET_SIERRA
1457
+ nk_reduce_moments_e2m3_sierra(d, n, s, sum, sumsq);
1458
+ #elif NK_TARGET_ALDER
1459
+ nk_reduce_moments_e2m3_alder(d, n, s, sum, sumsq);
1460
+ #elif NK_TARGET_HASWELL
1461
+ nk_reduce_moments_e2m3_haswell(d, n, s, sum, sumsq);
1462
+ #elif NK_TARGET_NEONSDOT
1463
+ nk_reduce_moments_e2m3_neonsdot(d, n, s, sum, sumsq);
1464
+ #elif NK_TARGET_NEON
1465
+ nk_reduce_moments_e2m3_neon(d, n, s, sum, sumsq);
1466
+ #elif NK_TARGET_RVV
1467
+ nk_reduce_moments_e2m3_rvv(d, n, s, sum, sumsq);
1468
+ #elif NK_TARGET_V128RELAXED
1469
+ nk_reduce_moments_e2m3_v128relaxed(d, n, s, sum, sumsq);
1470
+ #else
1471
+ nk_reduce_moments_e2m3_serial(d, n, s, sum, sumsq);
1472
+ #endif
1473
+ }
1474
+
1475
+ NK_PUBLIC void nk_reduce_minmax_e2m3(nk_e2m3_t const *d, nk_size_t n, nk_size_t s, nk_e2m3_t *mn, nk_size_t *mi,
1476
+ nk_e2m3_t *mx, nk_size_t *xi) {
1477
+ #if NK_TARGET_SKYLAKE
1478
+ nk_reduce_minmax_e2m3_skylake(d, n, s, mn, mi, mx, xi);
1479
+ #elif NK_TARGET_HASWELL
1480
+ nk_reduce_minmax_e2m3_haswell(d, n, s, mn, mi, mx, xi);
1481
+ #elif NK_TARGET_NEON
1482
+ nk_reduce_minmax_e2m3_neon(d, n, s, mn, mi, mx, xi);
1483
+ #elif NK_TARGET_RVV
1484
+ nk_reduce_minmax_e2m3_rvv(d, n, s, mn, mi, mx, xi);
1485
+ #elif NK_TARGET_V128RELAXED
1486
+ nk_reduce_minmax_e2m3_v128relaxed(d, n, s, mn, mi, mx, xi);
1487
+ #else
1488
+ nk_reduce_minmax_e2m3_serial(d, n, s, mn, mi, mx, xi);
1489
+ #endif
1490
+ }
1491
+
1492
+ NK_PUBLIC void nk_reduce_moments_e3m2(nk_e3m2_t const *d, nk_size_t n, nk_size_t s, nk_f32_t *sum, nk_f32_t *sumsq) {
1493
+ #if NK_TARGET_ICELAKE
1494
+ nk_reduce_moments_e3m2_icelake(d, n, s, sum, sumsq);
1495
+ #elif NK_TARGET_SKYLAKE
1496
+ nk_reduce_moments_e3m2_skylake(d, n, s, sum, sumsq);
1497
+ #elif NK_TARGET_ALDER
1498
+ nk_reduce_moments_e3m2_alder(d, n, s, sum, sumsq);
1499
+ #elif NK_TARGET_HASWELL
1500
+ nk_reduce_moments_e3m2_haswell(d, n, s, sum, sumsq);
1501
+ #elif NK_TARGET_NEON
1502
+ nk_reduce_moments_e3m2_neon(d, n, s, sum, sumsq);
1503
+ #elif NK_TARGET_RVV
1504
+ nk_reduce_moments_e3m2_rvv(d, n, s, sum, sumsq);
1505
+ #elif NK_TARGET_V128RELAXED
1506
+ nk_reduce_moments_e3m2_v128relaxed(d, n, s, sum, sumsq);
1507
+ #else
1508
+ nk_reduce_moments_e3m2_serial(d, n, s, sum, sumsq);
1509
+ #endif
1510
+ }
1511
+
1512
+ NK_PUBLIC void nk_reduce_minmax_e3m2(nk_e3m2_t const *d, nk_size_t n, nk_size_t s, nk_e3m2_t *mn, nk_size_t *mi,
1513
+ nk_e3m2_t *mx, nk_size_t *xi) {
1514
+ #if NK_TARGET_SKYLAKE
1515
+ nk_reduce_minmax_e3m2_skylake(d, n, s, mn, mi, mx, xi);
1516
+ #elif NK_TARGET_HASWELL
1517
+ nk_reduce_minmax_e3m2_haswell(d, n, s, mn, mi, mx, xi);
1518
+ #elif NK_TARGET_NEON
1519
+ nk_reduce_minmax_e3m2_neon(d, n, s, mn, mi, mx, xi);
1520
+ #elif NK_TARGET_RVV
1521
+ nk_reduce_minmax_e3m2_rvv(d, n, s, mn, mi, mx, xi);
1522
+ #elif NK_TARGET_V128RELAXED
1523
+ nk_reduce_minmax_e3m2_v128relaxed(d, n, s, mn, mi, mx, xi);
1524
+ #else
1525
+ nk_reduce_minmax_e3m2_serial(d, n, s, mn, mi, mx, xi);
1526
+ #endif
1527
+ }
1528
+
1529
+ NK_PUBLIC void nk_reduce_moments_i4(nk_i4x2_t const *d, nk_size_t n, nk_size_t s, nk_i64_t *sum, nk_u64_t *sumsq) {
1530
+ #if NK_TARGET_SKYLAKE
1531
+ nk_reduce_moments_i4_skylake(d, n, s, sum, sumsq);
1532
+ #elif NK_TARGET_HASWELL
1533
+ nk_reduce_moments_i4_haswell(d, n, s, sum, sumsq);
1534
+ #else
1535
+ nk_reduce_moments_i4_serial(d, n, s, sum, sumsq);
1536
+ #endif
1537
+ }
1538
+
1539
+ NK_PUBLIC void nk_reduce_minmax_i4(nk_i4x2_t const *d, nk_size_t n, nk_size_t s, nk_i8_t *mn, nk_size_t *mi,
1540
+ nk_i8_t *mx, nk_size_t *xi) {
1541
+ nk_reduce_minmax_i4_serial(d, n, s, mn, mi, mx, xi);
1542
+ }
1543
+
1544
+ NK_PUBLIC void nk_reduce_moments_u4(nk_u4x2_t const *d, nk_size_t n, nk_size_t s, nk_u64_t *sum, nk_u64_t *sumsq) {
1545
+ #if NK_TARGET_SKYLAKE
1546
+ nk_reduce_moments_u4_skylake(d, n, s, sum, sumsq);
1547
+ #elif NK_TARGET_HASWELL
1548
+ nk_reduce_moments_u4_haswell(d, n, s, sum, sumsq);
1549
+ #else
1550
+ nk_reduce_moments_u4_serial(d, n, s, sum, sumsq);
1551
+ #endif
1552
+ }
1553
+
1554
+ NK_PUBLIC void nk_reduce_minmax_u4(nk_u4x2_t const *d, nk_size_t n, nk_size_t s, nk_u8_t *mn, nk_size_t *mi,
1555
+ nk_u8_t *mx, nk_size_t *xi) {
1556
+ nk_reduce_minmax_u4_serial(d, n, s, mn, mi, mx, xi);
1557
+ }
1558
+
1559
+ NK_PUBLIC void nk_reduce_moments_u1(nk_u1x8_t const *d, nk_size_t n, nk_size_t s, nk_u64_t *sum, nk_u64_t *sumsq) {
1560
+ #if NK_TARGET_SKYLAKE
1561
+ nk_reduce_moments_u1_skylake(d, n, s, sum, sumsq);
1562
+ #elif NK_TARGET_HASWELL
1563
+ nk_reduce_moments_u1_haswell(d, n, s, sum, sumsq);
1564
+ #elif NK_TARGET_NEON
1565
+ nk_reduce_moments_u1_neon(d, n, s, sum, sumsq);
1566
+ #else
1567
+ nk_reduce_moments_u1_serial(d, n, s, sum, sumsq);
1568
+ #endif
1569
+ }
1570
+
1571
+ NK_PUBLIC void nk_reduce_minmax_u1(nk_u1x8_t const *d, nk_size_t n, nk_size_t s, nk_u8_t *mn, nk_size_t *mi,
1572
+ nk_u8_t *mx, nk_size_t *xi) {
1573
+ nk_reduce_minmax_u1_serial(d, n, s, mn, mi, mx, xi);
1574
+ }
1575
+
1576
+ #endif // !NK_DYNAMIC_DISPATCH
1577
+
1578
+ #ifdef __cplusplus
1579
+ } // extern "C"
1580
+ #endif
1581
+
1582
+ #endif // NK_REDUCE_H