usearch 2.21.4 → 2.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (602) hide show
  1. package/README.md +24 -24
  2. package/binding.gyp +15 -37
  3. package/c/CMakeLists.txt +4 -5
  4. package/c/README.md +7 -7
  5. package/c/lib.cpp +32 -14
  6. package/c/test.c +83 -1
  7. package/c/usearch.h +24 -3
  8. package/cpp/CMakeLists.txt +4 -0
  9. package/cpp/README.md +5 -5
  10. package/cpp/bench.cpp +97 -116
  11. package/cpp/test.cpp +117 -20
  12. package/include/usearch/index.hpp +224 -48
  13. package/include/usearch/index_dense.hpp +105 -40
  14. package/include/usearch/index_plugins.hpp +1387 -204
  15. package/javascript/dist/cjs/usearch.d.ts +8 -3
  16. package/javascript/dist/cjs/usearch.js +12 -4
  17. package/javascript/dist/esm/usearch.d.ts +8 -3
  18. package/javascript/dist/esm/usearch.js +12 -4
  19. package/javascript/lib.cpp +17 -0
  20. package/javascript/usearch.ts +14 -6
  21. package/numkong/.clang-tidy +30 -0
  22. package/{simsimd → numkong}/.cmake-format.py +18 -0
  23. package/numkong/.editorconfig +12 -0
  24. package/numkong/.git-blame-ignore-revs +123 -0
  25. package/numkong/.mailmap +15 -0
  26. package/numkong/.spi.yml +11 -0
  27. package/numkong/.swift-format +14 -0
  28. package/numkong/CITATION.cff +81 -0
  29. package/numkong/CONTRIBUTING.md +500 -0
  30. package/numkong/Cargo.toml +54 -0
  31. package/numkong/MANIFEST.in +8 -0
  32. package/numkong/Package.swift +84 -0
  33. package/numkong/README.md +569 -0
  34. package/numkong/bench/README.md +217 -0
  35. package/numkong/bench/bench-browser.html +323 -0
  36. package/numkong/bench/bench.cpp +344 -0
  37. package/numkong/bench/bench.hpp +816 -0
  38. package/numkong/bench/bench.js +148 -0
  39. package/numkong/bench/bench.mjs +616 -0
  40. package/numkong/bench/bench_attention.cpp +113 -0
  41. package/numkong/bench/bench_cast.cpp +264 -0
  42. package/numkong/bench/bench_cross_amx.cpp +62 -0
  43. package/numkong/bench/bench_cross_arm.cpp +245 -0
  44. package/numkong/bench/bench_cross_blas.cpp +309 -0
  45. package/numkong/bench/bench_cross_loongarch.cpp +106 -0
  46. package/numkong/bench/bench_cross_power.cpp +84 -0
  47. package/numkong/bench/bench_cross_rvv.cpp +121 -0
  48. package/numkong/bench/bench_cross_serial.cpp +151 -0
  49. package/numkong/bench/bench_cross_sme.cpp +163 -0
  50. package/numkong/bench/bench_cross_wasm.cpp +142 -0
  51. package/numkong/bench/bench_cross_x86.cpp +455 -0
  52. package/numkong/bench/bench_curved.cpp +210 -0
  53. package/numkong/bench/bench_dot.cpp +315 -0
  54. package/numkong/bench/bench_each.cpp +503 -0
  55. package/numkong/bench/bench_geospatial.cpp +112 -0
  56. package/numkong/bench/bench_maxsim.cpp +154 -0
  57. package/numkong/bench/bench_mesh.cpp +148 -0
  58. package/numkong/bench/bench_probability.cpp +60 -0
  59. package/numkong/bench/bench_reduce.cpp +371 -0
  60. package/numkong/bench/bench_set.cpp +73 -0
  61. package/numkong/bench/bench_sparse.cpp +198 -0
  62. package/numkong/bench/bench_spatial.cpp +347 -0
  63. package/numkong/bench/bench_trigonometry.cpp +137 -0
  64. package/numkong/bench/swift/Bench.swift +506 -0
  65. package/numkong/binding.gyp +169 -0
  66. package/numkong/build.rs +484 -0
  67. package/numkong/c/dispatch.h +512 -0
  68. package/numkong/c/dispatch_bf16.c +447 -0
  69. package/numkong/c/dispatch_bf16c.c +52 -0
  70. package/numkong/c/dispatch_e2m3.c +296 -0
  71. package/numkong/c/dispatch_e3m2.c +284 -0
  72. package/numkong/c/dispatch_e4m3.c +318 -0
  73. package/numkong/c/dispatch_e5m2.c +316 -0
  74. package/numkong/c/dispatch_f16.c +452 -0
  75. package/numkong/c/dispatch_f16c.c +58 -0
  76. package/numkong/c/dispatch_f32.c +434 -0
  77. package/numkong/c/dispatch_f32c.c +99 -0
  78. package/numkong/c/dispatch_f64.c +348 -0
  79. package/numkong/c/dispatch_f64c.c +98 -0
  80. package/numkong/c/dispatch_i16.c +96 -0
  81. package/numkong/c/dispatch_i32.c +89 -0
  82. package/numkong/c/dispatch_i4.c +153 -0
  83. package/numkong/c/dispatch_i64.c +86 -0
  84. package/numkong/c/dispatch_i8.c +348 -0
  85. package/numkong/c/dispatch_other.c +348 -0
  86. package/numkong/c/dispatch_u1.c +193 -0
  87. package/numkong/c/dispatch_u16.c +124 -0
  88. package/numkong/c/dispatch_u32.c +118 -0
  89. package/numkong/c/dispatch_u4.c +153 -0
  90. package/numkong/c/dispatch_u64.c +102 -0
  91. package/numkong/c/dispatch_u8.c +364 -0
  92. package/numkong/c/numkong.c +940 -0
  93. package/numkong/cmake/nk_arm_isa_probes.cmake +61 -0
  94. package/numkong/cmake/nk_isa_probe.cmake +90 -0
  95. package/numkong/cmake/nk_loongarch_isa_probes.cmake +15 -0
  96. package/numkong/cmake/nk_math_lib.cmake +46 -0
  97. package/numkong/cmake/nk_power_isa_probes.cmake +15 -0
  98. package/numkong/cmake/nk_riscv_isa_probes.cmake +19 -0
  99. package/numkong/cmake/nk_x86_isa_probes.cmake +35 -0
  100. package/numkong/cmake/toolchain-aarch64-gnu.cmake +86 -0
  101. package/numkong/cmake/toolchain-android-arm64.cmake +25 -0
  102. package/numkong/cmake/toolchain-android-armv7.cmake +25 -0
  103. package/numkong/cmake/toolchain-loongarch64-gnu.cmake +68 -0
  104. package/numkong/cmake/toolchain-ppc64le-gnu.cmake +74 -0
  105. package/numkong/cmake/toolchain-riscv64-gnu.cmake +107 -0
  106. package/numkong/cmake/toolchain-riscv64-llvm.cmake +114 -0
  107. package/numkong/cmake/toolchain-wasi.cmake +77 -0
  108. package/numkong/cmake/toolchain-wasm.cmake +70 -0
  109. package/numkong/cmake/toolchain-wasm64.cmake +62 -0
  110. package/numkong/cmake/toolchain-x86_64-llvm.cmake +47 -0
  111. package/numkong/include/README.md +643 -0
  112. package/numkong/include/module.modulemap +129 -0
  113. package/numkong/include/numkong/attention/sapphireamx.h +1363 -0
  114. package/numkong/include/numkong/attention/sme.h +2075 -0
  115. package/numkong/include/numkong/attention.h +49 -0
  116. package/numkong/include/numkong/capabilities.h +930 -0
  117. package/numkong/include/numkong/cast/README.md +262 -0
  118. package/numkong/include/numkong/cast/diamond.h +64 -0
  119. package/numkong/include/numkong/cast/haswell.h +823 -0
  120. package/numkong/include/numkong/cast/icelake.h +475 -0
  121. package/numkong/include/numkong/cast/loongsonasx.h +252 -0
  122. package/numkong/include/numkong/cast/neon.h +1174 -0
  123. package/numkong/include/numkong/cast/powervsx.h +449 -0
  124. package/numkong/include/numkong/cast/rvv.h +970 -0
  125. package/numkong/include/numkong/cast/sapphire.h +262 -0
  126. package/numkong/include/numkong/cast/serial.h +2336 -0
  127. package/numkong/include/numkong/cast/skylake.h +915 -0
  128. package/numkong/include/numkong/cast/v128relaxed.h +537 -0
  129. package/numkong/include/numkong/cast.h +254 -0
  130. package/numkong/include/numkong/cast.hpp +44 -0
  131. package/numkong/include/numkong/curved/README.md +223 -0
  132. package/numkong/include/numkong/curved/genoa.h +182 -0
  133. package/numkong/include/numkong/curved/haswell.h +276 -0
  134. package/numkong/include/numkong/curved/neon.h +329 -0
  135. package/numkong/include/numkong/curved/neonbfdot.h +211 -0
  136. package/numkong/include/numkong/curved/rvv.h +305 -0
  137. package/numkong/include/numkong/curved/serial.h +207 -0
  138. package/numkong/include/numkong/curved/skylake.h +457 -0
  139. package/numkong/include/numkong/curved/smef64.h +530 -0
  140. package/numkong/include/numkong/curved.h +513 -0
  141. package/numkong/include/numkong/curved.hpp +144 -0
  142. package/numkong/include/numkong/dot/README.md +442 -0
  143. package/numkong/include/numkong/dot/alder.h +563 -0
  144. package/numkong/include/numkong/dot/diamond.h +158 -0
  145. package/numkong/include/numkong/dot/genoa.h +289 -0
  146. package/numkong/include/numkong/dot/haswell.h +1723 -0
  147. package/numkong/include/numkong/dot/icelake.h +997 -0
  148. package/numkong/include/numkong/dot/loongsonasx.h +671 -0
  149. package/numkong/include/numkong/dot/neon.h +869 -0
  150. package/numkong/include/numkong/dot/neonbfdot.h +243 -0
  151. package/numkong/include/numkong/dot/neonfhm.h +358 -0
  152. package/numkong/include/numkong/dot/neonfp8.h +323 -0
  153. package/numkong/include/numkong/dot/neonsdot.h +622 -0
  154. package/numkong/include/numkong/dot/powervsx.h +752 -0
  155. package/numkong/include/numkong/dot/rvv.h +722 -0
  156. package/numkong/include/numkong/dot/rvvbb.h +72 -0
  157. package/numkong/include/numkong/dot/rvvbf16.h +123 -0
  158. package/numkong/include/numkong/dot/rvvhalf.h +129 -0
  159. package/numkong/include/numkong/dot/sapphire.h +141 -0
  160. package/numkong/include/numkong/dot/serial.h +874 -0
  161. package/numkong/include/numkong/dot/sierra.h +405 -0
  162. package/numkong/include/numkong/dot/skylake.h +1116 -0
  163. package/numkong/include/numkong/dot/sve.h +420 -0
  164. package/numkong/include/numkong/dot/svebfdot.h +75 -0
  165. package/numkong/include/numkong/dot/svehalf.h +168 -0
  166. package/numkong/include/numkong/dot/svesdot.h +90 -0
  167. package/numkong/include/numkong/dot/v128relaxed.h +1293 -0
  168. package/numkong/include/numkong/dot.h +1136 -0
  169. package/numkong/include/numkong/dot.hpp +94 -0
  170. package/numkong/include/numkong/dots/README.md +496 -0
  171. package/numkong/include/numkong/dots/alder.h +117 -0
  172. package/numkong/include/numkong/dots/diamond.h +86 -0
  173. package/numkong/include/numkong/dots/genoa.h +100 -0
  174. package/numkong/include/numkong/dots/graniteamx.h +733 -0
  175. package/numkong/include/numkong/dots/haswell.h +310 -0
  176. package/numkong/include/numkong/dots/icelake.h +180 -0
  177. package/numkong/include/numkong/dots/loongsonasx.h +176 -0
  178. package/numkong/include/numkong/dots/neon.h +123 -0
  179. package/numkong/include/numkong/dots/neonbfdot.h +59 -0
  180. package/numkong/include/numkong/dots/neonfhm.h +96 -0
  181. package/numkong/include/numkong/dots/neonfp8.h +99 -0
  182. package/numkong/include/numkong/dots/neonsdot.h +144 -0
  183. package/numkong/include/numkong/dots/powervsx.h +194 -0
  184. package/numkong/include/numkong/dots/rvv.h +2593 -0
  185. package/numkong/include/numkong/dots/sapphireamx.h +4017 -0
  186. package/numkong/include/numkong/dots/serial.h +2867 -0
  187. package/numkong/include/numkong/dots/sierra.h +100 -0
  188. package/numkong/include/numkong/dots/skylake.h +207 -0
  189. package/numkong/include/numkong/dots/sme.h +5041 -0
  190. package/numkong/include/numkong/dots/smebi32.h +477 -0
  191. package/numkong/include/numkong/dots/smef64.h +1328 -0
  192. package/numkong/include/numkong/dots/smehalf.h +47 -0
  193. package/numkong/include/numkong/dots/v128relaxed.h +317 -0
  194. package/numkong/include/numkong/dots.h +3110 -0
  195. package/numkong/include/numkong/dots.hpp +641 -0
  196. package/numkong/include/numkong/each/README.md +465 -0
  197. package/numkong/include/numkong/each/haswell.h +1658 -0
  198. package/numkong/include/numkong/each/icelake.h +272 -0
  199. package/numkong/include/numkong/each/neon.h +1138 -0
  200. package/numkong/include/numkong/each/neonbfdot.h +211 -0
  201. package/numkong/include/numkong/each/neonhalf.h +318 -0
  202. package/numkong/include/numkong/each/rvv.h +1121 -0
  203. package/numkong/include/numkong/each/sapphire.h +343 -0
  204. package/numkong/include/numkong/each/serial.h +282 -0
  205. package/numkong/include/numkong/each/skylake.h +1562 -0
  206. package/numkong/include/numkong/each/v128relaxed.h +562 -0
  207. package/numkong/include/numkong/each.h +2232 -0
  208. package/numkong/include/numkong/each.hpp +434 -0
  209. package/numkong/include/numkong/geospatial/README.md +147 -0
  210. package/numkong/include/numkong/geospatial/haswell.h +633 -0
  211. package/numkong/include/numkong/geospatial/neon.h +615 -0
  212. package/numkong/include/numkong/geospatial/rvv.h +701 -0
  213. package/numkong/include/numkong/geospatial/serial.h +309 -0
  214. package/numkong/include/numkong/geospatial/skylake.h +613 -0
  215. package/numkong/include/numkong/geospatial/v128relaxed.h +652 -0
  216. package/numkong/include/numkong/geospatial.h +453 -0
  217. package/numkong/include/numkong/geospatial.hpp +235 -0
  218. package/numkong/include/numkong/matrix.hpp +336 -0
  219. package/numkong/include/numkong/maxsim/README.md +187 -0
  220. package/numkong/include/numkong/maxsim/alder.h +511 -0
  221. package/numkong/include/numkong/maxsim/genoa.h +115 -0
  222. package/numkong/include/numkong/maxsim/haswell.h +553 -0
  223. package/numkong/include/numkong/maxsim/icelake.h +480 -0
  224. package/numkong/include/numkong/maxsim/neonsdot.h +394 -0
  225. package/numkong/include/numkong/maxsim/sapphireamx.h +877 -0
  226. package/numkong/include/numkong/maxsim/serial.h +490 -0
  227. package/numkong/include/numkong/maxsim/sme.h +993 -0
  228. package/numkong/include/numkong/maxsim/v128relaxed.h +280 -0
  229. package/numkong/include/numkong/maxsim.h +571 -0
  230. package/numkong/include/numkong/maxsim.hpp +133 -0
  231. package/numkong/include/numkong/mesh/README.md +219 -0
  232. package/numkong/include/numkong/mesh/haswell.h +2013 -0
  233. package/numkong/include/numkong/mesh/neon.h +1821 -0
  234. package/numkong/include/numkong/mesh/neonbfdot.h +771 -0
  235. package/numkong/include/numkong/mesh/rvv.h +936 -0
  236. package/numkong/include/numkong/mesh/serial.h +721 -0
  237. package/numkong/include/numkong/mesh/skylake.h +2344 -0
  238. package/numkong/include/numkong/mesh/v128relaxed.h +1081 -0
  239. package/numkong/include/numkong/mesh.h +666 -0
  240. package/numkong/include/numkong/mesh.hpp +701 -0
  241. package/numkong/include/numkong/numkong.h +78 -0
  242. package/numkong/include/numkong/numkong.hpp +58 -0
  243. package/numkong/include/numkong/probability/README.md +177 -0
  244. package/numkong/include/numkong/probability/haswell.h +267 -0
  245. package/numkong/include/numkong/probability/neon.h +255 -0
  246. package/numkong/include/numkong/probability/rvv.h +414 -0
  247. package/numkong/include/numkong/probability/serial.h +181 -0
  248. package/numkong/include/numkong/probability/skylake.h +324 -0
  249. package/numkong/include/numkong/probability.h +380 -0
  250. package/numkong/include/numkong/probability.hpp +120 -0
  251. package/numkong/include/numkong/random.h +50 -0
  252. package/numkong/include/numkong/random.hpp +285 -0
  253. package/numkong/include/numkong/reduce/README.md +552 -0
  254. package/numkong/include/numkong/reduce/alder.h +636 -0
  255. package/numkong/include/numkong/reduce/genoa.h +201 -0
  256. package/numkong/include/numkong/reduce/haswell.h +3785 -0
  257. package/numkong/include/numkong/reduce/icelake.h +549 -0
  258. package/numkong/include/numkong/reduce/neon.h +3980 -0
  259. package/numkong/include/numkong/reduce/neonbfdot.h +142 -0
  260. package/numkong/include/numkong/reduce/neonfhm.h +293 -0
  261. package/numkong/include/numkong/reduce/neonsdot.h +357 -0
  262. package/numkong/include/numkong/reduce/rvv.h +3533 -0
  263. package/numkong/include/numkong/reduce/serial.h +753 -0
  264. package/numkong/include/numkong/reduce/sierra.h +338 -0
  265. package/numkong/include/numkong/reduce/skylake.h +3794 -0
  266. package/numkong/include/numkong/reduce/sve.h +52 -0
  267. package/numkong/include/numkong/reduce/v128relaxed.h +2302 -0
  268. package/numkong/include/numkong/reduce.h +1582 -0
  269. package/numkong/include/numkong/reduce.hpp +778 -0
  270. package/numkong/include/numkong/scalar/README.md +89 -0
  271. package/numkong/include/numkong/scalar/haswell.h +122 -0
  272. package/numkong/include/numkong/scalar/loongsonasx.h +74 -0
  273. package/numkong/include/numkong/scalar/neon.h +122 -0
  274. package/numkong/include/numkong/scalar/neonhalf.h +70 -0
  275. package/numkong/include/numkong/scalar/powervsx.h +96 -0
  276. package/numkong/include/numkong/scalar/rvv.h +211 -0
  277. package/numkong/include/numkong/scalar/sapphire.h +74 -0
  278. package/numkong/include/numkong/scalar/serial.h +332 -0
  279. package/numkong/include/numkong/scalar/v128relaxed.h +56 -0
  280. package/numkong/include/numkong/scalar.h +696 -0
  281. package/numkong/include/numkong/set/README.md +179 -0
  282. package/numkong/include/numkong/set/haswell.h +334 -0
  283. package/numkong/include/numkong/set/icelake.h +485 -0
  284. package/numkong/include/numkong/set/loongsonasx.h +181 -0
  285. package/numkong/include/numkong/set/neon.h +363 -0
  286. package/numkong/include/numkong/set/powervsx.h +326 -0
  287. package/numkong/include/numkong/set/rvv.h +226 -0
  288. package/numkong/include/numkong/set/rvvbb.h +117 -0
  289. package/numkong/include/numkong/set/serial.h +174 -0
  290. package/numkong/include/numkong/set/sve.h +187 -0
  291. package/numkong/include/numkong/set/v128relaxed.h +240 -0
  292. package/numkong/include/numkong/set.h +471 -0
  293. package/numkong/include/numkong/set.hpp +114 -0
  294. package/numkong/include/numkong/sets/README.md +149 -0
  295. package/numkong/include/numkong/sets/haswell.h +63 -0
  296. package/numkong/include/numkong/sets/icelake.h +66 -0
  297. package/numkong/include/numkong/sets/loongsonasx.h +52 -0
  298. package/numkong/include/numkong/sets/neon.h +61 -0
  299. package/numkong/include/numkong/sets/powervsx.h +65 -0
  300. package/numkong/include/numkong/sets/serial.h +43 -0
  301. package/numkong/include/numkong/sets/smebi32.h +1135 -0
  302. package/numkong/include/numkong/sets/v128relaxed.h +58 -0
  303. package/numkong/include/numkong/sets.h +382 -0
  304. package/numkong/include/numkong/sparse/README.md +156 -0
  305. package/numkong/include/numkong/sparse/icelake.h +463 -0
  306. package/numkong/include/numkong/sparse/neon.h +288 -0
  307. package/numkong/include/numkong/sparse/serial.h +117 -0
  308. package/numkong/include/numkong/sparse/sve2.h +504 -0
  309. package/numkong/include/numkong/sparse/turin.h +322 -0
  310. package/numkong/include/numkong/sparse.h +363 -0
  311. package/numkong/include/numkong/sparse.hpp +113 -0
  312. package/numkong/include/numkong/spatial/README.md +439 -0
  313. package/numkong/include/numkong/spatial/alder.h +604 -0
  314. package/numkong/include/numkong/spatial/diamond.h +240 -0
  315. package/numkong/include/numkong/spatial/genoa.h +222 -0
  316. package/numkong/include/numkong/spatial/haswell.h +979 -0
  317. package/numkong/include/numkong/spatial/icelake.h +1067 -0
  318. package/numkong/include/numkong/spatial/loongsonasx.h +483 -0
  319. package/numkong/include/numkong/spatial/neon.h +846 -0
  320. package/numkong/include/numkong/spatial/neonbfdot.h +164 -0
  321. package/numkong/include/numkong/spatial/neonfp8.h +258 -0
  322. package/numkong/include/numkong/spatial/neonsdot.h +429 -0
  323. package/numkong/include/numkong/spatial/powervsx.h +738 -0
  324. package/numkong/include/numkong/spatial/rvv.h +991 -0
  325. package/numkong/include/numkong/spatial/rvvbf16.h +128 -0
  326. package/numkong/include/numkong/spatial/rvvhalf.h +120 -0
  327. package/numkong/include/numkong/spatial/serial.h +347 -0
  328. package/numkong/include/numkong/spatial/sierra.h +516 -0
  329. package/numkong/include/numkong/spatial/skylake.h +605 -0
  330. package/numkong/include/numkong/spatial/sve.h +246 -0
  331. package/numkong/include/numkong/spatial/svebfdot.h +125 -0
  332. package/numkong/include/numkong/spatial/svehalf.h +136 -0
  333. package/numkong/include/numkong/spatial/svesdot.h +143 -0
  334. package/numkong/include/numkong/spatial/v128relaxed.h +969 -0
  335. package/numkong/include/numkong/spatial.h +1681 -0
  336. package/numkong/include/numkong/spatial.hpp +183 -0
  337. package/numkong/include/numkong/spatials/README.md +580 -0
  338. package/numkong/include/numkong/spatials/alder.h +94 -0
  339. package/numkong/include/numkong/spatials/diamond.h +82 -0
  340. package/numkong/include/numkong/spatials/genoa.h +94 -0
  341. package/numkong/include/numkong/spatials/graniteamx.h +173 -0
  342. package/numkong/include/numkong/spatials/haswell.h +219 -0
  343. package/numkong/include/numkong/spatials/icelake.h +113 -0
  344. package/numkong/include/numkong/spatials/loongsonasx.h +153 -0
  345. package/numkong/include/numkong/spatials/neon.h +109 -0
  346. package/numkong/include/numkong/spatials/neonbfdot.h +60 -0
  347. package/numkong/include/numkong/spatials/neonfhm.h +92 -0
  348. package/numkong/include/numkong/spatials/neonfp8.h +111 -0
  349. package/numkong/include/numkong/spatials/neonsdot.h +143 -0
  350. package/numkong/include/numkong/spatials/powervsx.h +153 -0
  351. package/numkong/include/numkong/spatials/rvv.h +1976 -0
  352. package/numkong/include/numkong/spatials/sapphireamx.h +1149 -0
  353. package/numkong/include/numkong/spatials/serial.h +248 -0
  354. package/numkong/include/numkong/spatials/sierra.h +96 -0
  355. package/numkong/include/numkong/spatials/skylake.h +184 -0
  356. package/numkong/include/numkong/spatials/sme.h +1927 -0
  357. package/numkong/include/numkong/spatials/smef64.h +483 -0
  358. package/numkong/include/numkong/spatials/v128relaxed.h +240 -0
  359. package/numkong/include/numkong/spatials.h +3374 -0
  360. package/numkong/include/numkong/spatials.hpp +509 -0
  361. package/numkong/include/numkong/tensor.hpp +1981 -0
  362. package/numkong/include/numkong/trigonometry/README.md +184 -0
  363. package/numkong/include/numkong/trigonometry/haswell.h +653 -0
  364. package/numkong/include/numkong/trigonometry/neon.h +638 -0
  365. package/numkong/include/numkong/trigonometry/rvv.h +700 -0
  366. package/numkong/include/numkong/trigonometry/serial.h +703 -0
  367. package/numkong/include/numkong/trigonometry/skylake.h +725 -0
  368. package/numkong/include/numkong/trigonometry/v128relaxed.h +667 -0
  369. package/numkong/include/numkong/trigonometry.h +467 -0
  370. package/numkong/include/numkong/trigonometry.hpp +166 -0
  371. package/numkong/include/numkong/types.h +1695 -0
  372. package/numkong/include/numkong/types.hpp +6027 -0
  373. package/numkong/include/numkong/vector.hpp +766 -0
  374. package/numkong/javascript/@numkong-darwin-arm64/package.json +26 -0
  375. package/numkong/javascript/@numkong-darwin-x64/package.json +26 -0
  376. package/numkong/javascript/@numkong-linux-arm64/package.json +25 -0
  377. package/numkong/javascript/@numkong-linux-x64/package.json +25 -0
  378. package/numkong/javascript/@numkong-win32-arm64/package.json +25 -0
  379. package/numkong/javascript/@numkong-win32-x64/package.json +25 -0
  380. package/numkong/javascript/README.md +254 -0
  381. package/numkong/javascript/node-gyp-build.d.ts +4 -0
  382. package/numkong/javascript/numkong-browser.ts +40 -0
  383. package/numkong/javascript/numkong-wasm.ts +750 -0
  384. package/numkong/javascript/numkong.c +712 -0
  385. package/numkong/javascript/numkong.ts +613 -0
  386. package/{simsimd → numkong}/javascript/tsconfig-base.json +6 -3
  387. package/numkong/javascript/tsconfig-cjs.json +13 -0
  388. package/{simsimd → numkong}/javascript/tsconfig-esm.json +1 -1
  389. package/numkong/javascript/types.ts +784 -0
  390. package/numkong/numkong.gypi +104 -0
  391. package/numkong/package.json +108 -0
  392. package/numkong/probes/arm_neon.c +8 -0
  393. package/numkong/probes/arm_neon_bfdot.c +9 -0
  394. package/numkong/probes/arm_neon_fhm.c +9 -0
  395. package/numkong/probes/arm_neon_half.c +8 -0
  396. package/numkong/probes/arm_neon_sdot.c +9 -0
  397. package/numkong/probes/arm_neonfp8.c +9 -0
  398. package/numkong/probes/arm_sme.c +16 -0
  399. package/numkong/probes/arm_sme2.c +16 -0
  400. package/numkong/probes/arm_sme2p1.c +16 -0
  401. package/numkong/probes/arm_sme_bf16.c +16 -0
  402. package/numkong/probes/arm_sme_bi32.c +16 -0
  403. package/numkong/probes/arm_sme_f64.c +16 -0
  404. package/numkong/probes/arm_sme_fa64.c +14 -0
  405. package/numkong/probes/arm_sme_half.c +16 -0
  406. package/numkong/probes/arm_sme_lut2.c +15 -0
  407. package/numkong/probes/arm_sve.c +18 -0
  408. package/numkong/probes/arm_sve2.c +20 -0
  409. package/numkong/probes/arm_sve2p1.c +18 -0
  410. package/numkong/probes/arm_sve_bfdot.c +20 -0
  411. package/numkong/probes/arm_sve_half.c +18 -0
  412. package/numkong/probes/arm_sve_sdot.c +21 -0
  413. package/numkong/probes/loongarch_lasx.c +12 -0
  414. package/numkong/probes/power_vsx.c +12 -0
  415. package/numkong/probes/probe.js +127 -0
  416. package/numkong/probes/riscv_rvv.c +14 -0
  417. package/numkong/probes/riscv_rvv_bb.c +15 -0
  418. package/numkong/probes/riscv_rvv_bf16.c +17 -0
  419. package/numkong/probes/riscv_rvv_half.c +14 -0
  420. package/numkong/probes/wasm_v128relaxed.c +11 -0
  421. package/numkong/probes/x86_alder.c +17 -0
  422. package/numkong/probes/x86_diamond.c +17 -0
  423. package/numkong/probes/x86_genoa.c +17 -0
  424. package/numkong/probes/x86_graniteamx.c +19 -0
  425. package/numkong/probes/x86_haswell.c +11 -0
  426. package/numkong/probes/x86_icelake.c +17 -0
  427. package/numkong/probes/x86_sapphire.c +16 -0
  428. package/numkong/probes/x86_sapphireamx.c +18 -0
  429. package/numkong/probes/x86_sierra.c +17 -0
  430. package/numkong/probes/x86_skylake.c +15 -0
  431. package/numkong/probes/x86_turin.c +17 -0
  432. package/numkong/rust/README.md +698 -0
  433. package/numkong/rust/capabilities.rs +96 -0
  434. package/numkong/rust/cast.rs +314 -0
  435. package/numkong/rust/curved.rs +391 -0
  436. package/numkong/rust/each.rs +2721 -0
  437. package/numkong/rust/geospatial.rs +343 -0
  438. package/numkong/rust/matrix.rs +5424 -0
  439. package/numkong/rust/maxsim.rs +540 -0
  440. package/numkong/rust/mesh.rs +837 -0
  441. package/numkong/rust/numkong.rs +409 -0
  442. package/numkong/rust/probability.rs +272 -0
  443. package/numkong/rust/reduce.rs +1249 -0
  444. package/numkong/rust/set.rs +194 -0
  445. package/numkong/rust/sparse.rs +513 -0
  446. package/numkong/rust/spatial.rs +1815 -0
  447. package/numkong/rust/tensor.rs +7565 -0
  448. package/numkong/rust/types.rs +3666 -0
  449. package/numkong/rust/vector.rs +1899 -0
  450. package/numkong/rustfmt.toml +2 -0
  451. package/numkong/swift/Matrix.swift +1388 -0
  452. package/numkong/swift/MaxSim.swift +151 -0
  453. package/numkong/swift/NumKong.swift +283 -0
  454. package/numkong/swift/Numerics.swift +329 -0
  455. package/numkong/swift/README.md +433 -0
  456. package/numkong/swift/Scalar.swift +741 -0
  457. package/numkong/swift/Tensor.swift +209 -0
  458. package/numkong/test/README.md +315 -0
  459. package/numkong/test/playwright.config.ts +16 -0
  460. package/numkong/test/swift/Test.swift +534 -0
  461. package/numkong/test/test-browser-bundle-runner.mjs +36 -0
  462. package/numkong/test/test-browser-bundle.html +188 -0
  463. package/numkong/test/test-browser-runner.mjs +43 -0
  464. package/numkong/test/test-browser.html +305 -0
  465. package/numkong/test/test-dtypes.mjs +453 -0
  466. package/numkong/test/test-wasm.mjs +267 -0
  467. package/numkong/test/test.cpp +442 -0
  468. package/numkong/test/test.hpp +580 -0
  469. package/numkong/test/test.mjs +363 -0
  470. package/numkong/test/test_base.py +1041 -0
  471. package/numkong/test/test_cast.cpp +242 -0
  472. package/numkong/test/test_cross.hpp +551 -0
  473. package/numkong/test/test_cross.py +467 -0
  474. package/numkong/test/test_cross_amx.cpp +50 -0
  475. package/numkong/test/test_cross_arm.cpp +225 -0
  476. package/numkong/test/test_cross_blas.cpp +354 -0
  477. package/numkong/test/test_cross_loongarch.cpp +90 -0
  478. package/numkong/test/test_cross_power.cpp +73 -0
  479. package/numkong/test/test_cross_rvv.cpp +109 -0
  480. package/numkong/test/test_cross_serial.cpp +181 -0
  481. package/numkong/test/test_cross_sme.cpp +148 -0
  482. package/numkong/test/test_cross_wasm.cpp +141 -0
  483. package/numkong/test/test_cross_x86.cpp +442 -0
  484. package/numkong/test/test_curved.cpp +182 -0
  485. package/numkong/test/test_curved.py +207 -0
  486. package/numkong/test/test_dot.cpp +353 -0
  487. package/numkong/test/test_dot.py +296 -0
  488. package/numkong/test/test_each.cpp +437 -0
  489. package/numkong/test/test_each.py +756 -0
  490. package/numkong/test/test_geospatial.cpp +155 -0
  491. package/numkong/test/test_geospatial.py +241 -0
  492. package/numkong/test/test_maxsim.cpp +138 -0
  493. package/numkong/test/test_maxsim.py +209 -0
  494. package/numkong/test/test_mesh.cpp +203 -0
  495. package/numkong/test/test_mesh.py +394 -0
  496. package/numkong/test/test_probability.cpp +136 -0
  497. package/numkong/test/test_probability.py +166 -0
  498. package/numkong/test/test_reduce.cpp +563 -0
  499. package/numkong/test/test_reduce.py +781 -0
  500. package/numkong/test/test_set.cpp +151 -0
  501. package/numkong/test/test_set.py +120 -0
  502. package/numkong/test/test_similarities.py +579 -0
  503. package/numkong/test/test_sparse.cpp +121 -0
  504. package/numkong/test/test_sparse.py +118 -0
  505. package/numkong/test/test_spatial.cpp +518 -0
  506. package/numkong/test/test_spatial.py +269 -0
  507. package/numkong/test/test_tensor.cpp +884 -0
  508. package/numkong/test/test_tensor.py +1417 -0
  509. package/numkong/test/test_trigonometry.cpp +156 -0
  510. package/numkong/test/test_trigonometry.py +180 -0
  511. package/package.json +7 -8
  512. package/prebuilds/darwin-arm64+x64/usearch.node +0 -0
  513. package/prebuilds/linux-arm64/usearch.node +0 -0
  514. package/prebuilds/linux-x64/usearch.node +0 -0
  515. package/fp16/CMakeLists.txt +0 -176
  516. package/fp16/LICENSE +0 -11
  517. package/fp16/README.md +0 -20
  518. package/fp16/bench/alt-element.cc +0 -89
  519. package/fp16/bench/from-alt-array.cc +0 -175
  520. package/fp16/bench/from-ieee-array.cc +0 -399
  521. package/fp16/bench/ieee-element.cc +0 -272
  522. package/fp16/bench/to-alt-array.cc +0 -91
  523. package/fp16/bench/to-ieee-array.cc +0 -303
  524. package/fp16/cmake/DownloadGoogleBenchmark.cmake +0 -15
  525. package/fp16/cmake/DownloadGoogleTest.cmake +0 -15
  526. package/fp16/cmake/DownloadPSimd.cmake +0 -15
  527. package/fp16/configure.py +0 -65
  528. package/fp16/confu.yaml +0 -8
  529. package/fp16/include/fp16/__init__.py +0 -0
  530. package/fp16/include/fp16/avx.py +0 -50
  531. package/fp16/include/fp16/avx2.py +0 -53
  532. package/fp16/include/fp16/bitcasts.h +0 -92
  533. package/fp16/include/fp16/fp16.h +0 -451
  534. package/fp16/include/fp16/psimd.h +0 -131
  535. package/fp16/include/fp16.h +0 -11
  536. package/fp16/jni/Android.mk +0 -6
  537. package/fp16/jni/Application.mk +0 -4
  538. package/fp16/test/alt-from-fp32-value.cc +0 -498
  539. package/fp16/test/alt-to-fp32-bits.cc +0 -263
  540. package/fp16/test/alt-to-fp32-psimd.cc +0 -145
  541. package/fp16/test/alt-to-fp32-value.cc +0 -348
  542. package/fp16/test/alt-to-fp32x2-psimd.cc +0 -245
  543. package/fp16/test/bitcasts.cc +0 -56
  544. package/fp16/test/ieee-from-fp32-value.cc +0 -523
  545. package/fp16/test/ieee-to-fp32-bits.cc +0 -333
  546. package/fp16/test/ieee-to-fp32-psimd.cc +0 -312
  547. package/fp16/test/ieee-to-fp32-value.cc +0 -420
  548. package/fp16/test/ieee-to-fp32x2-psimd.cc +0 -541
  549. package/fp16/test/peachpy/alt-xmm-to-fp32-xmm-avx.cc +0 -96
  550. package/fp16/test/peachpy/alt-xmm-to-fp32-ymm-avx2.cc +0 -96
  551. package/fp16/test/peachpy/stubs.py +0 -38
  552. package/fp16/test/tables.cc +0 -530
  553. package/fp16/test/tables.h +0 -13
  554. package/fp16/third-party/THHalf.h +0 -92
  555. package/fp16/third-party/eigen-half.h +0 -170
  556. package/fp16/third-party/float16-compressor.h +0 -80
  557. package/fp16/third-party/half.hpp +0 -2916
  558. package/fp16/third-party/npy-halffloat.h +0 -328
  559. package/simsimd/.git-blame-ignore-revs +0 -2
  560. package/simsimd/CONTRIBUTING.md +0 -321
  561. package/simsimd/Cargo.toml +0 -49
  562. package/simsimd/MANIFEST.in +0 -4
  563. package/simsimd/Package.swift +0 -28
  564. package/simsimd/README.md +0 -1493
  565. package/simsimd/binding.gyp +0 -35
  566. package/simsimd/build.rs +0 -70
  567. package/simsimd/c/lib.c +0 -374
  568. package/simsimd/include/module.modulemap +0 -4
  569. package/simsimd/include/simsimd/binary.h +0 -486
  570. package/simsimd/include/simsimd/curved.h +0 -1541
  571. package/simsimd/include/simsimd/dot.h +0 -1853
  572. package/simsimd/include/simsimd/elementwise.h +0 -2465
  573. package/simsimd/include/simsimd/geospatial.h +0 -43
  574. package/simsimd/include/simsimd/mesh.h +0 -69
  575. package/simsimd/include/simsimd/probability.h +0 -606
  576. package/simsimd/include/simsimd/simsimd.h +0 -2567
  577. package/simsimd/include/simsimd/sparse.h +0 -1384
  578. package/simsimd/include/simsimd/spatial.h +0 -2335
  579. package/simsimd/include/simsimd/types.h +0 -666
  580. package/simsimd/javascript/fallback.ts +0 -233
  581. package/simsimd/javascript/lib.c +0 -125
  582. package/simsimd/javascript/node-gyp-build.d.ts +0 -1
  583. package/simsimd/javascript/simsimd.ts +0 -179
  584. package/simsimd/javascript/tsconfig-cjs.json +0 -8
  585. package/simsimd/package-lock.json +0 -1761
  586. package/simsimd/package.json +0 -61
  587. package/simsimd/rust/lib.rs +0 -1821
  588. package/simsimd/scripts/bench.cxx +0 -1170
  589. package/simsimd/scripts/bench.ipynb +0 -187
  590. package/simsimd/scripts/bench.js +0 -127
  591. package/simsimd/scripts/bench.rs +0 -876
  592. package/simsimd/scripts/bench_vectors.py +0 -734
  593. package/simsimd/scripts/bench_vectors_live.py +0 -213
  594. package/simsimd/scripts/test.c +0 -187
  595. package/simsimd/scripts/test.mjs +0 -220
  596. package/simsimd/scripts/test.py +0 -1505
  597. package/simsimd/swift/SimSIMD.swift +0 -149
  598. package/simsimd/swift/Test.swift +0 -128
  599. /package/{simsimd → numkong}/CODE_OF_CONDUCT.md +0 -0
  600. /package/{simsimd → numkong}/LICENSE +0 -0
  601. /package/{simsimd → numkong}/javascript/dist-package-cjs.json +0 -0
  602. /package/{simsimd → numkong}/javascript/dist-package-esm.json +0 -0
@@ -0,0 +1,1136 @@
1
+ /**
2
+ * @brief SIMD-accelerated Dot Products for Real and Complex Numbers.
3
+ * @file include/numkong/dot.h
4
+ * @author Ash Vardanian
5
+ * @date February 24, 2024
6
+ *
7
+ * Contains:
8
+ *
9
+ * - Dot Product for Real and Complex vectors
10
+ * - Conjugate Dot Product for Complex vectors
11
+ *
12
+ * For dtypes:
13
+ *
14
+ * - f64: 64-bit IEEE floating point numbers → 64-bit floats
15
+ * - f32: 32-bit IEEE floating point numbers → 64-bit floats
16
+ * - f16: 16-bit IEEE floating point numbers → 32-bit floats
17
+ * - bf16: 16-bit brain floating point numbers → 32-bit floats
18
+ * - e4m3: 8-bit e4m3 floating point numbers → 32-bit floats
19
+ * - e5m2: 8-bit e5m2 floating point numbers → 32-bit floats
20
+ * - e2m3: 8-bit e2m3 floating point numbers (MX) → 32-bit floats
21
+ * - e3m2: 8-bit e3m2 floating point numbers (MX) → 32-bit floats
22
+ * - i8: 8-bit signed integers → 32-bit signed integers
23
+ * - u8: 8-bit unsigned integers → 32-bit unsigned integers
24
+ * - i4: 4-bit signed integers (packed nibble pairs) → 32-bit signed integers
25
+ * - u4: 4-bit unsigned integers (packed nibble pairs) → 32-bit unsigned integers
26
+ * - u1: 1-bit binary (packed octets) → 32-bit unsigned integers
27
+ *
28
+ * Complex dot product variants:
29
+ *
30
+ * - f64c: 64-bit complex pairs → 64-bit complex
31
+ * - f32c: 32-bit complex pairs → 64-bit complex
32
+ * - f16c: 16-bit complex pairs → 32-bit complex
33
+ * - bf16c: 16-bit brain complex pairs → 32-bit complex
34
+ *
35
+ * For hardware architectures:
36
+ *
37
+ * - Arm: NEON, NEON+I8, NEON+F16, NEON+FHM, NEON+BF16, SVE, SVE+F16
38
+ * - x86: Haswell, Skylake, Ice Lake, Genoa, Sapphire Rapids, Sierra Forest
39
+ * - RISC-V: RVV, RVV+BF16, RVV+HALF, RVV+BB
40
+ * - WASM: V128Relaxed
41
+ *
42
+ * @section numerical_stability Numerical Stability
43
+ *
44
+ * - f64: Dot2/Ogita-Rump-Oishi style compensated summation across serial and SIMD stateful paths.
45
+ * - f32: public outputs widen to f64/f64c. Arithmetic widens before the first lossy reduction step.
46
+ * - f16/bf16: Promoted to f32 accumulator.
47
+ * - e4m3/e5m2: Promoted to f32. On Sapphire, e2m3/e3m2 use f16 intermediate with periodic
48
+ * flush to f32 every 128 elements to avoid f16 overflow (max lane sum ~225 / ~3136).
49
+ * - i8: i32 accumulator. Max product |(-128)²| = 16,384. Overflows at n > 2^31/16,384 ≈ 131K.
50
+ * - u8: u32 accumulator. Max product 255² = 65,025. Overflows at n > 2^32/65,025 ≈ 66K.
51
+ * - i4: i32 accumulator. Max product 8² = 64. Safe for n ≤ ~33M.
52
+ * - u4: u32 accumulator. Max product 15² = 225. Safe for n ≤ ~19M.
53
+ * - u1: Popcount of AND into u32. Safe for n_bits ≤ 2^32.
54
+ * - Complex: Components accumulated independently; same guarantees as real counterpart.
55
+ *
56
+ * @section streaming_api Streaming API
57
+ *
58
+ * For compile-time dispatch and vector-at-a-time accumulation, we provide streaming helpers
59
+ * that accept two `nk_b512_vec_t` blocks and update a running sum for non-complex dot
60
+ * products. The `<count>` suffix reflects how many scalars of that type fit in a 512-bit block.
61
+ * The helpers are exposed per scalar type as:
62
+ *
63
+ * - nk_dot_<type>x<count>_state_<isa>_t
64
+ * - nk_dot_<type>x<count>_init_<isa>
65
+ * - nk_dot_<type>x<count>_update_<isa>
66
+ * - nk_dot_<type>x<count>_finalize_<isa>
67
+ *
68
+ * @section x86_instructions Relevant x86 Instructions
69
+ *
70
+ * Floating-point dot products use FMA (VFMADD231PS/PD) for sum += a[i]*b[i] accumulation.
71
+ * Integer i8 dot products use VPMADDUBSW (u8 × i8 → i16) + VPMADDWD (i16 × 1 → i32) on Haswell,
72
+ * or the newer VNNI instructions VPDPBUSD/VPDPWSSD on Ice Lake+ for direct u8 × i8 → i32.
73
+ * BF16 dot products (VDPBF16PS) are Genoa-only, accumulating bf16 pairs directly to f32.
74
+ * Genoa shows 40% faster integer multiply-add (3c vs 5c) than Ice Lake.
75
+ *
76
+ * Intrinsic Instruction Haswell Icelake Genoa
77
+ * _mm256_fmadd_ps VFMADD231PS (YMM, YMM, YMM) 5cy @ p01 4cy @ p01 4cy @ p01
78
+ * _mm256_fmadd_pd VFMADD231PD (YMM, YMM, YMM) 5cy @ p01 4cy @ p01 4cy @ p01
79
+ * _mm256_maddubs_epi16 VPMADDUBSW (YMM, YMM, YMM) 5cy @ p0 5cy @ p01 3cy @ p01
80
+ * _mm256_madd_epi16 VPMADDWD (YMM, YMM, YMM) 5cy @ p0 5cy @ p01 3cy @ p01
81
+ * _mm256_dpbusd_epi32 VPDPBUSD (YMM, YMM, YMM) n/a 5cy @ p01 4cy @ p01
82
+ * _mm512_dpwssd_epi32 VPDPWSSD (ZMM, ZMM, ZMM) n/a 5cy @ p0 4cy @ p01
83
+ * _mm512_dpbf16_ps VDPBF16PS (ZMM, ZMM, ZMM) n/a n/a 6cy @ p01
84
+ *
85
+ * @section arm_neon_instructions Relevant ARM NEON Instructions
86
+ *
87
+ * NEON integer dot products use SDOT/UDOT (ARMv8.2 dotprod) for direct i8 × i8 → i32 or u8 × u8 → u32
88
+ * accumulation - 4x faster than the multiply-add sequence on older cores. BFDOT (ARMv8.6 bf16)
89
+ * provides native bf16 dot products on Graviton 3+. Complex dot products use LD2 for deinterleaved
90
+ * loads of real/imag pairs, though its L01+V throughput can bottleneck on memory-bound workloads.
91
+ *
92
+ * Intrinsic Instruction M1 Firestorm Graviton 3 Graviton 4
93
+ * vfmaq_f32 FMLA.S (vec) 4cy @ V0123 4cy @ V0123 4cy @ V0123
94
+ * vfmaq_f64 FMLA.D (vec) 4cy @ V0123 4cy @ V0123 4cy @ V0123
95
+ * vdotq_s32 SDOT (vec) 3cy @ V0123 3cy @ V0123 3cy @ V0123
96
+ * vdotq_u32 UDOT (vec) 3cy @ V0123 3cy @ V0123 3cy @ V0123
97
+ * vbfdotq_f32 BFDOT (vec) N/A 4cy @ V0123 5cy @ V0123
98
+ * vld2q_f32 LD2 (Q-form) 5cy @ L01+V 8cy @ L01+V 8cy @ L01+V
99
+ *
100
+ * @section arm_sve_instructions Relevant ARM SVE Instructions
101
+ *
102
+ * SVE implementations use predicated FMA (svmla_f32_x) with WHILELT for tail masking, avoiding
103
+ * scalar cleanup loops. FADDV performs horizontal reduction; notably 45% faster on Graviton 4
104
+ * (6c) than Graviton 3 (11c). SVE complex dot products use svld2 for structure loads.
105
+ *
106
+ * Intrinsic Instruction Graviton 3 Graviton 4
107
+ * svmla_f32_x FMLA (pred) 4cy @ V0123 4cy @ V0123
108
+ * svmls_f32_x FMLS (pred) 4cy @ V0123 4cy @ V0123
109
+ * svwhilelt_b32 WHILELT 3cy @ M0 3cy @ M0
110
+ * svld2_f32 LD2 (SVE) 8cy @ L01+V 8cy @ L01+V
111
+ * svaddv_f32 FADDV 11cy @ V0123 6cy @ V0123
112
+ *
113
+ * @section complex_instructions Complex Number Optimizations
114
+ *
115
+ * Standard complex multiplication involves subtraction for the real part.
116
+ * Instead of using subtracting variants of FMA for every element, we accumulate real
117
+ * and imaginary products positively and apply a single bitwise XOR to flip the sign
118
+ * bits before the final horizontal reduction. This delayed application of the sign
119
+ * flip doubles the throughput on older x86 architectures like Haswell by maximizing
120
+ * FMA unit utilization and reducing execution dependency chains.
121
+ *
122
+ * @section references References
123
+ *
124
+ * - x86 intrinsics: https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html
125
+ * - Arm intrinsics: https://developer.arm.com/architectures/instruction-sets/intrinsics/
126
+ *
127
+ */
128
+ #ifndef NK_DOT_H
129
+ #define NK_DOT_H
130
+
131
+ #include "numkong/types.h"
132
+
133
+ #if defined(__cplusplus)
134
+ extern "C" {
135
+ #endif
136
+
137
+ /**
138
+ * @brief Dot product computing the sum of elementwise products between two vectors.
139
+ *
140
+ * @param[in] a The first vector.
141
+ * @param[in] b The second vector.
142
+ * @param[in] n The number of elements in the vectors.
143
+ * @param[out] result The output dot product value.
144
+ *
145
+ * @note The output value can be negative.
146
+ * @note The output value is zero if and only if the two vectors are orthogonal.
147
+ * @note Defined for floating-point, integer, and binary data types.
148
+ */
149
+ NK_DYNAMIC void nk_dot_f32(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f64_t *result);
150
+ /** @copydoc nk_dot_f32 */
151
+ NK_DYNAMIC void nk_dot_f64(nk_f64_t const *a, nk_f64_t const *b, nk_size_t n, nk_f64_t *result);
152
+ /** @copydoc nk_dot_f32 */
153
+ NK_DYNAMIC void nk_dot_f16(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f32_t *result);
154
+ /** @copydoc nk_dot_f32 */
155
+ NK_DYNAMIC void nk_dot_bf16(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_f32_t *result);
156
+ /** @copydoc nk_dot_f32 */
157
+ NK_DYNAMIC void nk_dot_i8(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_i32_t *result);
158
+ /** @copydoc nk_dot_f32 */
159
+ NK_DYNAMIC void nk_dot_u8(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_u32_t *result);
160
+ /** @copydoc nk_dot_f32 */
161
+ NK_DYNAMIC void nk_dot_i4(nk_i4x2_t const *a, nk_i4x2_t const *b, nk_size_t n, nk_i32_t *result);
162
+ /** @copydoc nk_dot_f32 */
163
+ NK_DYNAMIC void nk_dot_u4(nk_u4x2_t const *a, nk_u4x2_t const *b, nk_size_t n, nk_u32_t *result);
164
+ /** @copydoc nk_dot_f32 */
165
+ NK_DYNAMIC void nk_dot_u1(nk_u1x8_t const *a, nk_u1x8_t const *b, nk_size_t n_bits, nk_u32_t *result);
166
+ /** @copydoc nk_dot_f32 */
167
+ NK_DYNAMIC void nk_dot_e4m3(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_f32_t *result);
168
+ /** @copydoc nk_dot_f32 */
169
+ NK_DYNAMIC void nk_dot_e5m2(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_f32_t *result);
170
+ /** @copydoc nk_dot_f32 */
171
+ NK_DYNAMIC void nk_dot_e2m3(nk_e2m3_t const *a, nk_e2m3_t const *b, nk_size_t n, nk_f32_t *result);
172
+ /** @copydoc nk_dot_f32 */
173
+ NK_DYNAMIC void nk_dot_e3m2(nk_e3m2_t const *a, nk_e3m2_t const *b, nk_size_t n, nk_f32_t *result);
174
+
175
+ /**
176
+ * @brief Complex dot product computing the sum of elementwise products between two complex vectors.
177
+ *
178
+ * @param[in] a_pairs The first complex vector.
179
+ * @param[in] b_pairs The second complex vector.
180
+ * @param[in] count_pairs The number of complex pairs in the vectors.
181
+ * @param[out] result The output complex value as {real, imag}.
182
+ */
183
+ NK_DYNAMIC void nk_dot_f32c(nk_f32c_t const *a_pairs, nk_f32c_t const *b_pairs, nk_size_t count_pairs,
184
+ nk_f64c_t *result);
185
+ /** @copydoc nk_dot_f32c */
186
+ NK_DYNAMIC void nk_dot_f64c(nk_f64c_t const *a_pairs, nk_f64c_t const *b_pairs, nk_size_t count_pairs,
187
+ nk_f64c_t *result);
188
+ /** @copydoc nk_dot_f32c */
189
+ NK_DYNAMIC void nk_dot_f16c(nk_f16c_t const *a_pairs, nk_f16c_t const *b_pairs, nk_size_t count_pairs,
190
+ nk_f32c_t *result);
191
+ /** @copydoc nk_dot_f32c */
192
+ NK_DYNAMIC void nk_dot_bf16c(nk_bf16c_t const *a_pairs, nk_bf16c_t const *b_pairs, nk_size_t count_pairs,
193
+ nk_f32c_t *result);
194
+
195
+ /**
196
+ * @brief Complex conjugate dot product between two complex vectors.
197
+ *
198
+ * @param[in] a_pairs The first complex vector.
199
+ * @param[in] b_pairs The second complex vector.
200
+ * @param[in] count_pairs The number of complex pairs in the vectors.
201
+ * @param[out] result The output complex value as {real, imag}.
202
+ */
203
+ NK_DYNAMIC void nk_vdot_f32c(nk_f32c_t const *a_pairs, nk_f32c_t const *b_pairs, nk_size_t count_pairs,
204
+ nk_f64c_t *result);
205
+ /** @copydoc nk_vdot_f32c */
206
+ NK_DYNAMIC void nk_vdot_f64c(nk_f64c_t const *a_pairs, nk_f64c_t const *b_pairs, nk_size_t count_pairs,
207
+ nk_f64c_t *result);
208
+ /** @copydoc nk_vdot_f32c */
209
+ NK_DYNAMIC void nk_vdot_f16c(nk_f16c_t const *a_pairs, nk_f16c_t const *b_pairs, nk_size_t count_pairs,
210
+ nk_f32c_t *result);
211
+ /** @copydoc nk_vdot_f32c */
212
+ NK_DYNAMIC void nk_vdot_bf16c(nk_bf16c_t const *a_pairs, nk_bf16c_t const *b_pairs, nk_size_t count_pairs,
213
+ nk_f32c_t *result);
214
+
215
+ /** @copydoc nk_dot_f64 */
216
+ NK_PUBLIC void nk_dot_f64_serial(nk_f64_t const *a, nk_f64_t const *b, nk_size_t n, nk_f64_t *result);
217
+ /** @copydoc nk_dot_f64c */
218
+ NK_PUBLIC void nk_dot_f64c_serial(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t *result);
219
+ /** @copydoc nk_vdot_f64c */
220
+ NK_PUBLIC void nk_vdot_f64c_serial(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t *result);
221
+
222
+ /** @copydoc nk_dot_f32 */
223
+ NK_PUBLIC void nk_dot_f32_serial(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f64_t *result);
224
+ /** @copydoc nk_dot_f32c */
225
+ NK_PUBLIC void nk_dot_f32c_serial(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f64c_t *result);
226
+ /** @copydoc nk_vdot_f32c */
227
+ NK_PUBLIC void nk_vdot_f32c_serial(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f64c_t *result);
228
+
229
+ /** @copydoc nk_dot_f16 */
230
+ NK_PUBLIC void nk_dot_f16_serial(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f32_t *result);
231
+ /** @copydoc nk_dot_f16c */
232
+ NK_PUBLIC void nk_dot_f16c_serial(nk_f16c_t const *a, nk_f16c_t const *b, nk_size_t n, nk_f32c_t *result);
233
+ /** @copydoc nk_vdot_f16c */
234
+ NK_PUBLIC void nk_vdot_f16c_serial(nk_f16c_t const *a, nk_f16c_t const *b, nk_size_t n, nk_f32c_t *result);
235
+
236
+ /** @copydoc nk_dot_bf16 */
237
+ NK_PUBLIC void nk_dot_bf16_serial(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_f32_t *result);
238
+ /** @copydoc nk_dot_bf16c */
239
+ NK_PUBLIC void nk_dot_bf16c_serial(nk_bf16c_t const *a, nk_bf16c_t const *b, nk_size_t n, nk_f32c_t *result);
240
+ /** @copydoc nk_vdot_bf16c */
241
+ NK_PUBLIC void nk_vdot_bf16c_serial(nk_bf16c_t const *a, nk_bf16c_t const *b, nk_size_t n, nk_f32c_t *result);
242
+
243
+ /** @copydoc nk_dot_i8 */
244
+ NK_PUBLIC void nk_dot_i8_serial(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_i32_t *result);
245
+ /** @copydoc nk_dot_u8 */
246
+ NK_PUBLIC void nk_dot_u8_serial(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_u32_t *result);
247
+ /** @copydoc nk_dot_i4 */
248
+ NK_PUBLIC void nk_dot_i4_serial(nk_i4x2_t const *a, nk_i4x2_t const *b, nk_size_t n, nk_i32_t *result);
249
+ /** @copydoc nk_dot_u4 */
250
+ NK_PUBLIC void nk_dot_u4_serial(nk_u4x2_t const *a, nk_u4x2_t const *b, nk_size_t n, nk_u32_t *result);
251
+ /** @copydoc nk_dot_u1 */
252
+ NK_PUBLIC void nk_dot_u1_serial(nk_u1x8_t const *a, nk_u1x8_t const *b, nk_size_t n_bits, nk_u32_t *result);
253
+
254
+ /** @copydoc nk_dot_e4m3 */
255
+ NK_PUBLIC void nk_dot_e4m3_serial(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_f32_t *result);
256
+ /** @copydoc nk_dot_e5m2 */
257
+ NK_PUBLIC void nk_dot_e5m2_serial(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_f32_t *result);
258
+ /** @copydoc nk_dot_e2m3 */
259
+ NK_PUBLIC void nk_dot_e2m3_serial(nk_e2m3_t const *a, nk_e2m3_t const *b, nk_size_t n, nk_f32_t *result);
260
+ /** @copydoc nk_dot_e3m2 */
261
+ NK_PUBLIC void nk_dot_e3m2_serial(nk_e3m2_t const *a, nk_e3m2_t const *b, nk_size_t n, nk_f32_t *result);
262
+
263
+ #if NK_TARGET_NEON
264
+ /** @copydoc nk_dot_f32 */
265
+ NK_PUBLIC void nk_dot_f32_neon(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f64_t *result);
266
+ /** @copydoc nk_dot_f32c */
267
+ NK_PUBLIC void nk_dot_f32c_neon(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f64c_t *result);
268
+ /** @copydoc nk_vdot_f32c */
269
+ NK_PUBLIC void nk_vdot_f32c_neon(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f64c_t *result);
270
+
271
+ /** @copydoc nk_dot_f64 */
272
+ NK_PUBLIC void nk_dot_f64_neon(nk_f64_t const *a, nk_f64_t const *b, nk_size_t n, nk_f64_t *result);
273
+ /** @copydoc nk_dot_f64c */
274
+ NK_PUBLIC void nk_dot_f64c_neon(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t *result);
275
+ /** @copydoc nk_vdot_f64c */
276
+ NK_PUBLIC void nk_vdot_f64c_neon(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t *result);
277
+
278
+ /** @copydoc nk_dot_bf16 */
279
+ NK_PUBLIC void nk_dot_bf16_neon(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_f32_t *result);
280
+
281
+ /** @copydoc nk_dot_e4m3 */
282
+ NK_PUBLIC void nk_dot_e4m3_neon(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_f32_t *result);
283
+ /** @copydoc nk_dot_e5m2 */
284
+ NK_PUBLIC void nk_dot_e5m2_neon(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_f32_t *result);
285
+ /** @copydoc nk_dot_e2m3 */
286
+ NK_PUBLIC void nk_dot_e2m3_neon(nk_e2m3_t const *a, nk_e2m3_t const *b, nk_size_t n, nk_f32_t *result);
287
+ /** @copydoc nk_dot_e3m2 */
288
+ NK_PUBLIC void nk_dot_e3m2_neon(nk_e3m2_t const *a, nk_e3m2_t const *b, nk_size_t n, nk_f32_t *result);
289
+
290
+ /** @copydoc nk_dot_u1 */
291
+ NK_PUBLIC void nk_dot_u1_neon(nk_u1x8_t const *a, nk_u1x8_t const *b, nk_size_t n_bits, nk_u32_t *result);
292
+
293
+ /** @copydoc nk_dot_f16 */
294
+ NK_PUBLIC void nk_dot_f16_neon(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f32_t *result);
295
+
296
+ /** @copydoc nk_dot_f16c */
297
+ NK_PUBLIC void nk_dot_f16c_neon(nk_f16c_t const *a, nk_f16c_t const *b, nk_size_t n, nk_f32c_t *result);
298
+ /** @copydoc nk_vdot_f16c */
299
+ NK_PUBLIC void nk_vdot_f16c_neon(nk_f16c_t const *a, nk_f16c_t const *b, nk_size_t n, nk_f32c_t *result);
300
+
301
+ #endif // NK_TARGET_NEON
302
+
303
+ #if NK_TARGET_NEONFHM
304
+ /** @copydoc nk_dot_f16 */
305
+ NK_PUBLIC void nk_dot_f16_neonfhm(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f32_t *result);
306
+ /** @copydoc nk_dot_e4m3 */
307
+ NK_PUBLIC void nk_dot_e4m3_neonfhm(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_f32_t *result);
308
+ /** @copydoc nk_dot_e5m2 */
309
+ NK_PUBLIC void nk_dot_e5m2_neonfhm(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_f32_t *result);
310
+ /** @copydoc nk_dot_f16c */
311
+ NK_PUBLIC void nk_dot_f16c_neonfhm(nk_f16c_t const *a, nk_f16c_t const *b, nk_size_t n, nk_f32c_t *result);
312
+ /** @copydoc nk_vdot_f16c */
313
+ NK_PUBLIC void nk_vdot_f16c_neonfhm(nk_f16c_t const *a, nk_f16c_t const *b, nk_size_t n, nk_f32c_t *result);
314
+ #endif // NK_TARGET_NEONFHM
315
+
316
+ #if NK_TARGET_NEONSDOT
317
+ /** @copydoc nk_dot_i8 */
318
+ NK_PUBLIC void nk_dot_i8_neonsdot(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_i32_t *result);
319
+ /** @copydoc nk_dot_u8 */
320
+ NK_PUBLIC void nk_dot_u8_neonsdot(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_u32_t *result);
321
+ /** @copydoc nk_dot_i4 */
322
+ NK_PUBLIC void nk_dot_i4_neonsdot(nk_i4x2_t const *a, nk_i4x2_t const *b, nk_size_t n, nk_i32_t *result);
323
+ /** @copydoc nk_dot_u4 */
324
+ NK_PUBLIC void nk_dot_u4_neonsdot(nk_u4x2_t const *a, nk_u4x2_t const *b, nk_size_t n, nk_u32_t *result);
325
+ /** @copydoc nk_dot_e2m3 */
326
+ NK_PUBLIC void nk_dot_e2m3_neonsdot(nk_e2m3_t const *a, nk_e2m3_t const *b, nk_size_t n, nk_f32_t *result);
327
+ /** @copydoc nk_dot_e3m2 */
328
+ NK_PUBLIC void nk_dot_e3m2_neonsdot(nk_e3m2_t const *a, nk_e3m2_t const *b, nk_size_t n, nk_f32_t *result);
329
+ #endif // NK_TARGET_NEONSDOT
330
+
331
+ #if NK_TARGET_SVESDOT
332
+ /** @copydoc nk_dot_i8 */
333
+ NK_PUBLIC void nk_dot_i8_svesdot(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_i32_t *result);
334
+ /** @copydoc nk_dot_u8 */
335
+ NK_PUBLIC void nk_dot_u8_svesdot(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_u32_t *result);
336
+ #endif // NK_TARGET_SVESDOT
337
+
338
+ #if NK_TARGET_NEONBFDOT
339
+ /** @copydoc nk_dot_bf16 */
340
+ NK_PUBLIC void nk_dot_bf16_neonbfdot(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_f32_t *result);
341
+ /** @copydoc nk_dot_e4m3 */
342
+ NK_PUBLIC void nk_dot_e4m3_neonbfdot(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_f32_t *result);
343
+ /** @copydoc nk_dot_e5m2 */
344
+ NK_PUBLIC void nk_dot_e5m2_neonbfdot(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_f32_t *result);
345
+ /** @copydoc nk_dot_bf16c */
346
+ NK_PUBLIC void nk_dot_bf16c_neonbfdot(nk_bf16c_t const *a, nk_bf16c_t const *b, nk_size_t n, nk_f32c_t *result);
347
+ /** @copydoc nk_vdot_bf16c */
348
+ NK_PUBLIC void nk_vdot_bf16c_neonbfdot(nk_bf16c_t const *a, nk_bf16c_t const *b, nk_size_t n, nk_f32c_t *result);
349
+ #endif // NK_TARGET_NEONBFDOT
350
+
351
+ #if NK_TARGET_NEONFP8
352
+ /** @copydoc nk_dot_e4m3 */
353
+ NK_PUBLIC void nk_dot_e4m3_neonfp8(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_f32_t *result);
354
+ /** @copydoc nk_dot_e5m2 */
355
+ NK_PUBLIC void nk_dot_e5m2_neonfp8(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_f32_t *result);
356
+ /** @copydoc nk_dot_e2m3 */
357
+ NK_PUBLIC void nk_dot_e2m3_neonfp8(nk_e2m3_t const *a, nk_e2m3_t const *b, nk_size_t n, nk_f32_t *result);
358
+ /** @copydoc nk_dot_e3m2 */
359
+ NK_PUBLIC void nk_dot_e3m2_neonfp8(nk_e3m2_t const *a, nk_e3m2_t const *b, nk_size_t n, nk_f32_t *result);
360
+ #endif // NK_TARGET_NEONFP8
361
+
362
+ #if NK_TARGET_SVE
363
+ /** @copydoc nk_dot_f32 */
364
+ NK_PUBLIC void nk_dot_f32_sve(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f64_t *result);
365
+ /** @copydoc nk_dot_f32c */
366
+ NK_PUBLIC void nk_dot_f32c_sve(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f64c_t *result);
367
+ /** @copydoc nk_vdot_f32c */
368
+ NK_PUBLIC void nk_vdot_f32c_sve(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f64c_t *result);
369
+ /** @copydoc nk_dot_f64 */
370
+ NK_PUBLIC void nk_dot_f64_sve(nk_f64_t const *a, nk_f64_t const *b, nk_size_t n, nk_f64_t *result);
371
+ /** @copydoc nk_dot_f64c */
372
+ NK_PUBLIC void nk_dot_f64c_sve(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t *result);
373
+ /** @copydoc nk_vdot_f64c */
374
+ NK_PUBLIC void nk_vdot_f64c_sve(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t *result);
375
+ #endif // NK_TARGET_SVE
376
+
377
+ #if NK_TARGET_SVEHALF
378
+ /** @copydoc nk_dot_f16 */
379
+ NK_PUBLIC void nk_dot_f16_svehalf(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f32_t *result);
380
+ /** @copydoc nk_dot_f16c */
381
+ NK_PUBLIC void nk_dot_f16c_svehalf(nk_f16c_t const *a, nk_f16c_t const *b, nk_size_t n, nk_f32c_t *result);
382
+ /** @copydoc nk_vdot_f16c */
383
+ NK_PUBLIC void nk_vdot_f16c_svehalf(nk_f16c_t const *a, nk_f16c_t const *b, nk_size_t n, nk_f32c_t *result);
384
+ #endif // NK_TARGET_SVEHALF
385
+
386
+ #if NK_TARGET_SVEBFDOT
387
+ /** @copydoc nk_dot_bf16 */
388
+ NK_PUBLIC void nk_dot_bf16_svebfdot(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_f32_t *result);
389
+ #endif // NK_TARGET_SVEBFDOT
390
+ #if NK_TARGET_HASWELL
391
+ /** @copydoc nk_dot_f32 */
392
+ NK_PUBLIC void nk_dot_f32_haswell(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f64_t *result);
393
+ /** @copydoc nk_dot_f64 */
394
+ NK_PUBLIC void nk_dot_f64_haswell(nk_f64_t const *a, nk_f64_t const *b, nk_size_t n, nk_f64_t *result);
395
+ /** @copydoc nk_dot_f32c */
396
+ NK_PUBLIC void nk_dot_f32c_haswell(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f64c_t *result);
397
+ /** @copydoc nk_vdot_f32c */
398
+ NK_PUBLIC void nk_vdot_f32c_haswell(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f64c_t *result);
399
+ /** @copydoc nk_dot_f64c */
400
+ NK_PUBLIC void nk_dot_f64c_haswell(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t *result);
401
+ /** @copydoc nk_vdot_f64c */
402
+ NK_PUBLIC void nk_vdot_f64c_haswell(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t *result);
403
+
404
+ /** @copydoc nk_dot_f16 */
405
+ NK_PUBLIC void nk_dot_f16_haswell(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f32_t *result);
406
+ /** @copydoc nk_dot_f16c */
407
+ NK_PUBLIC void nk_dot_f16c_haswell(nk_f16c_t const *a, nk_f16c_t const *b, nk_size_t n, nk_f32c_t *result);
408
+ /** @copydoc nk_vdot_f16c */
409
+ NK_PUBLIC void nk_vdot_f16c_haswell(nk_f16c_t const *a, nk_f16c_t const *b, nk_size_t n, nk_f32c_t *result);
410
+
411
+ /** @copydoc nk_dot_bf16 */
412
+ NK_PUBLIC void nk_dot_bf16_haswell(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_f32_t *result);
413
+ /** @copydoc nk_dot_bf16c */
414
+ NK_PUBLIC void nk_dot_bf16c_haswell(nk_bf16c_t const *a, nk_bf16c_t const *b, nk_size_t n, nk_f32c_t *result);
415
+ /** @copydoc nk_vdot_bf16c */
416
+ NK_PUBLIC void nk_vdot_bf16c_haswell(nk_bf16c_t const *a, nk_bf16c_t const *b, nk_size_t n, nk_f32c_t *result);
417
+
418
+ /** @copydoc nk_dot_e4m3 */
419
+ NK_PUBLIC void nk_dot_e4m3_haswell(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_f32_t *result);
420
+ /** @copydoc nk_dot_e5m2 */
421
+ NK_PUBLIC void nk_dot_e5m2_haswell(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_f32_t *result);
422
+ /** @copydoc nk_dot_e2m3 */
423
+ NK_PUBLIC void nk_dot_e2m3_haswell(nk_e2m3_t const *a, nk_e2m3_t const *b, nk_size_t n, nk_f32_t *result);
424
+ /** @copydoc nk_dot_e3m2 */
425
+ NK_PUBLIC void nk_dot_e3m2_haswell(nk_e3m2_t const *a, nk_e3m2_t const *b, nk_size_t n, nk_f32_t *result);
426
+
427
+ /** @copydoc nk_dot_i8 */
428
+ NK_PUBLIC void nk_dot_i8_haswell(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_i32_t *result);
429
+ /** @copydoc nk_dot_u8 */
430
+ NK_PUBLIC void nk_dot_u8_haswell(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_u32_t *result);
431
+ /** @copydoc nk_dot_i4 */
432
+ NK_PUBLIC void nk_dot_i4_haswell(nk_i4x2_t const *a, nk_i4x2_t const *b, nk_size_t n, nk_i32_t *result);
433
+ /** @copydoc nk_dot_u4 */
434
+ NK_PUBLIC void nk_dot_u4_haswell(nk_u4x2_t const *a, nk_u4x2_t const *b, nk_size_t n, nk_u32_t *result);
435
+ /** @copydoc nk_dot_u1 */
436
+ NK_PUBLIC void nk_dot_u1_haswell(nk_u1x8_t const *a, nk_u1x8_t const *b, nk_size_t n_bits, nk_u32_t *result);
437
+
438
+ #endif // NK_TARGET_HASWELL
439
+
440
+ #if NK_TARGET_SKYLAKE
441
+ /** @copydoc nk_dot_f64 */
442
+ NK_PUBLIC void nk_dot_f64_skylake(nk_f64_t const *a, nk_f64_t const *b, nk_size_t n, nk_f64_t *result);
443
+ /** @copydoc nk_dot_f64c */
444
+ NK_PUBLIC void nk_dot_f64c_skylake(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t *result);
445
+ /** @copydoc nk_vdot_f64c */
446
+ NK_PUBLIC void nk_vdot_f64c_skylake(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t *result);
447
+
448
+ /** @copydoc nk_dot_f32 */
449
+ NK_PUBLIC void nk_dot_f32_skylake(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f64_t *result);
450
+ /** @copydoc nk_dot_f32c */
451
+ NK_PUBLIC void nk_dot_f32c_skylake(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f64c_t *result);
452
+ /** @copydoc nk_vdot_f32c */
453
+ NK_PUBLIC void nk_vdot_f32c_skylake(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f64c_t *result);
454
+
455
+ /** @copydoc nk_dot_f16 */
456
+ NK_PUBLIC void nk_dot_f16_skylake(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f32_t *result);
457
+ /** @copydoc nk_dot_bf16 */
458
+ NK_PUBLIC void nk_dot_bf16_skylake(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_f32_t *result);
459
+
460
+ /** @copydoc nk_dot_e4m3 */
461
+ NK_PUBLIC void nk_dot_e4m3_skylake(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_f32_t *result);
462
+ /** @copydoc nk_dot_e5m2 */
463
+ NK_PUBLIC void nk_dot_e5m2_skylake(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_f32_t *result);
464
+ /** @copydoc nk_dot_e2m3 */
465
+ NK_PUBLIC void nk_dot_e2m3_skylake(nk_e2m3_t const *a, nk_e2m3_t const *b, nk_size_t n, nk_f32_t *result);
466
+ /** @copydoc nk_dot_e3m2 */
467
+ NK_PUBLIC void nk_dot_e3m2_skylake(nk_e3m2_t const *a, nk_e3m2_t const *b, nk_size_t n, nk_f32_t *result);
468
+
469
+ /** @copydoc nk_dot_i8 */
470
+ NK_PUBLIC void nk_dot_i8_skylake(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_i32_t *result);
471
+ /** @copydoc nk_dot_u8 */
472
+ NK_PUBLIC void nk_dot_u8_skylake(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_u32_t *result);
473
+ #endif // NK_TARGET_SKYLAKE
474
+
475
+ #if NK_TARGET_ICELAKE
476
+ /** @copydoc nk_dot_i8 */
477
+ NK_PUBLIC void nk_dot_i8_icelake(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_i32_t *result);
478
+ /** @copydoc nk_dot_u8 */
479
+ NK_PUBLIC void nk_dot_u8_icelake(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_u32_t *result);
480
+ /** @copydoc nk_dot_i8 */
481
+ NK_PUBLIC void nk_dot_i4_icelake(nk_i4x2_t const *a, nk_i4x2_t const *b, nk_size_t n, nk_i32_t *result);
482
+ /** @copydoc nk_dot_u8 */
483
+ NK_PUBLIC void nk_dot_u4_icelake(nk_u4x2_t const *a, nk_u4x2_t const *b, nk_size_t n, nk_u32_t *result);
484
+ /** @copydoc nk_dot_e2m3 */
485
+ NK_PUBLIC void nk_dot_e2m3_icelake(nk_e2m3_t const *a, nk_e2m3_t const *b, nk_size_t n, nk_f32_t *result);
486
+ /** @copydoc nk_dot_e3m2 */
487
+ NK_PUBLIC void nk_dot_e3m2_icelake(nk_e3m2_t const *a, nk_e3m2_t const *b, nk_size_t n, nk_f32_t *result);
488
+ /** @copydoc nk_dot_u1 */
489
+ NK_PUBLIC void nk_dot_u1_icelake(nk_u1x8_t const *a, nk_u1x8_t const *b, nk_size_t n_bits, nk_u32_t *result);
490
+ /** @copydoc nk_dot_e4m3 */
491
+ NK_PUBLIC void nk_dot_e4m3_icelake(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_f32_t *result);
492
+ #endif // NK_TARGET_ICELAKE
493
+
494
+ #if NK_TARGET_GENOA
495
+ /** @copydoc nk_dot_bf16 */
496
+ NK_PUBLIC void nk_dot_bf16_genoa(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_f32_t *result);
497
+ /** @copydoc nk_dot_bf16c */
498
+ NK_PUBLIC void nk_dot_bf16c_genoa(nk_bf16c_t const *a, nk_bf16c_t const *b, nk_size_t n, nk_f32c_t *result);
499
+ /** @copydoc nk_vdot_bf16c */
500
+ NK_PUBLIC void nk_vdot_bf16c_genoa(nk_bf16c_t const *a, nk_bf16c_t const *b, nk_size_t n, nk_f32c_t *result);
501
+
502
+ /** @copydoc nk_dot_e5m2 */
503
+ NK_PUBLIC void nk_dot_e5m2_genoa(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_f32_t *result);
504
+ #endif // NK_TARGET_GENOA
505
+
506
+ #if NK_TARGET_DIAMOND
507
+ /** @copydoc nk_dot_f16 */
508
+ NK_PUBLIC void nk_dot_f16_diamond(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f32_t *result);
509
+ /** @copydoc nk_dot_e4m3 */
510
+ NK_PUBLIC void nk_dot_e4m3_diamond(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_f32_t *result);
511
+ /** @copydoc nk_dot_e5m2 */
512
+ NK_PUBLIC void nk_dot_e5m2_diamond(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_f32_t *result);
513
+ #endif // NK_TARGET_DIAMOND
514
+
515
+ #if NK_TARGET_ALDER
516
+ /** @copydoc nk_dot_i8 */
517
+ NK_PUBLIC void nk_dot_i8_alder(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_i32_t *result);
518
+ /** @copydoc nk_dot_u8 */
519
+ NK_PUBLIC void nk_dot_u8_alder(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_u32_t *result);
520
+ /** @copydoc nk_dot_e2m3 */
521
+ NK_PUBLIC void nk_dot_e2m3_alder(nk_e2m3_t const *a, nk_e2m3_t const *b, nk_size_t n, nk_f32_t *result);
522
+ #endif // NK_TARGET_ALDER
523
+
524
+ #if NK_TARGET_SIERRA
525
+ /** @copydoc nk_dot_i8 */
526
+ NK_PUBLIC void nk_dot_i8_sierra(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_i32_t *result);
527
+ /** @copydoc nk_dot_u8 */
528
+ NK_PUBLIC void nk_dot_u8_sierra(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_u32_t *result);
529
+ /** @copydoc nk_dot_e2m3 */
530
+ NK_PUBLIC void nk_dot_e2m3_sierra(nk_e2m3_t const *a, nk_e2m3_t const *b, nk_size_t n, nk_f32_t *result);
531
+ #endif // NK_TARGET_SIERRA
532
+
533
+ #if NK_TARGET_RVV
534
+ /** @copydoc nk_dot_f32 */
535
+ NK_PUBLIC void nk_dot_f32_rvv(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f64_t *result);
536
+ /** @copydoc nk_dot_f64 */
537
+ NK_PUBLIC void nk_dot_f64_rvv(nk_f64_t const *a, nk_f64_t const *b, nk_size_t n, nk_f64_t *result);
538
+ /** @copydoc nk_dot_f16 */
539
+ NK_PUBLIC void nk_dot_f16_rvv(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f32_t *result);
540
+ /** @copydoc nk_dot_bf16 */
541
+ NK_PUBLIC void nk_dot_bf16_rvv(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_f32_t *result);
542
+ /** @copydoc nk_dot_i8 */
543
+ NK_PUBLIC void nk_dot_i8_rvv(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_i32_t *result);
544
+ /** @copydoc nk_dot_u8 */
545
+ NK_PUBLIC void nk_dot_u8_rvv(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_u32_t *result);
546
+ /** @copydoc nk_dot_e4m3 */
547
+ NK_PUBLIC void nk_dot_e4m3_rvv(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_f32_t *result);
548
+ /** @copydoc nk_dot_e5m2 */
549
+ NK_PUBLIC void nk_dot_e5m2_rvv(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_f32_t *result);
550
+ /** @copydoc nk_dot_e2m3 */
551
+ NK_PUBLIC void nk_dot_e2m3_rvv(nk_e2m3_t const *a, nk_e2m3_t const *b, nk_size_t n, nk_f32_t *result);
552
+ /** @copydoc nk_dot_e3m2 */
553
+ NK_PUBLIC void nk_dot_e3m2_rvv(nk_e3m2_t const *a, nk_e3m2_t const *b, nk_size_t n, nk_f32_t *result);
554
+ /** @copydoc nk_dot_i4 */
555
+ NK_PUBLIC void nk_dot_i4_rvv(nk_i4x2_t const *a, nk_i4x2_t const *b, nk_size_t n, nk_i32_t *result);
556
+ /** @copydoc nk_dot_u4 */
557
+ NK_PUBLIC void nk_dot_u4_rvv(nk_u4x2_t const *a, nk_u4x2_t const *b, nk_size_t n, nk_u32_t *result);
558
+ /** @copydoc nk_dot_u1 */
559
+ NK_PUBLIC void nk_dot_u1_rvv(nk_u1x8_t const *a, nk_u1x8_t const *b, nk_size_t n_bits, nk_u32_t *result);
560
+ /** @copydoc nk_dot_f32c */
561
+ NK_PUBLIC void nk_dot_f32c_rvv(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f64c_t *result);
562
+ /** @copydoc nk_vdot_f32c */
563
+ NK_PUBLIC void nk_vdot_f32c_rvv(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f64c_t *result);
564
+ /** @copydoc nk_dot_f64c */
565
+ NK_PUBLIC void nk_dot_f64c_rvv(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t *result);
566
+ /** @copydoc nk_vdot_f64c */
567
+ NK_PUBLIC void nk_vdot_f64c_rvv(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t *result);
568
+ #endif // NK_TARGET_RVV
569
+
570
+ #if NK_TARGET_RVVHALF
571
+ /** @copydoc nk_dot_f16 */
572
+ NK_PUBLIC void nk_dot_f16_rvvhalf(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f32_t *result);
573
+ /** @copydoc nk_dot_e4m3 */
574
+ NK_PUBLIC void nk_dot_e4m3_rvvhalf(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_f32_t *result);
575
+ /** @copydoc nk_dot_e5m2 */
576
+ NK_PUBLIC void nk_dot_e5m2_rvvhalf(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_f32_t *result);
577
+ #endif // NK_TARGET_RVVHALF
578
+
579
+ #if NK_TARGET_RVVBF16
580
+ /** @copydoc nk_dot_bf16 */
581
+ NK_PUBLIC void nk_dot_bf16_rvvbf16(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_f32_t *result);
582
+ /** @copydoc nk_dot_e4m3 */
583
+ NK_PUBLIC void nk_dot_e4m3_rvvbf16(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_f32_t *result);
584
+ /** @copydoc nk_dot_e5m2 */
585
+ NK_PUBLIC void nk_dot_e5m2_rvvbf16(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_f32_t *result);
586
+ #endif // NK_TARGET_RVVBF16
587
+
588
+ #if NK_TARGET_RVVBB
589
+ /** @copydoc nk_dot_u1 */
590
+ NK_PUBLIC void nk_dot_u1_rvvbb(nk_u1x8_t const *a, nk_u1x8_t const *b, nk_size_t n_bits, nk_u32_t *result);
591
+ #endif // NK_TARGET_RVVBB
592
+
593
+ #if NK_TARGET_V128RELAXED
594
+ /** @copydoc nk_dot_f32 */
595
+ NK_PUBLIC void nk_dot_f32_v128relaxed(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f64_t *result);
596
+ /** @copydoc nk_dot_f64 */
597
+ NK_PUBLIC void nk_dot_f64_v128relaxed(nk_f64_t const *a, nk_f64_t const *b, nk_size_t n, nk_f64_t *result);
598
+ /** @copydoc nk_dot_f16 */
599
+ NK_PUBLIC void nk_dot_f16_v128relaxed(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f32_t *result);
600
+ /** @copydoc nk_dot_bf16 */
601
+ NK_PUBLIC void nk_dot_bf16_v128relaxed(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_f32_t *result);
602
+ /** @copydoc nk_dot_i8 */
603
+ NK_PUBLIC void nk_dot_i8_v128relaxed(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_i32_t *result);
604
+ /** @copydoc nk_dot_u8 */
605
+ NK_PUBLIC void nk_dot_u8_v128relaxed(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_u32_t *result);
606
+ /** @copydoc nk_dot_e2m3 */
607
+ NK_PUBLIC void nk_dot_e2m3_v128relaxed(nk_e2m3_t const *a, nk_e2m3_t const *b, nk_size_t n, nk_f32_t *result);
608
+ /** @copydoc nk_dot_e3m2 */
609
+ NK_PUBLIC void nk_dot_e3m2_v128relaxed(nk_e3m2_t const *a, nk_e3m2_t const *b, nk_size_t n, nk_f32_t *result);
610
+ /** @copydoc nk_dot_u1 */
611
+ NK_PUBLIC void nk_dot_u1_v128relaxed(nk_u1x8_t const *a, nk_u1x8_t const *b, nk_size_t n_bits, nk_u32_t *result);
612
+ /** @copydoc nk_dot_f32 */
613
+ NK_PUBLIC void nk_dot_e4m3_v128relaxed(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_f32_t *result);
614
+ /** @copydoc nk_dot_f32 */
615
+ NK_PUBLIC void nk_dot_e5m2_v128relaxed(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_f32_t *result);
616
+ /** @copydoc nk_dot_i4 */
617
+ NK_PUBLIC void nk_dot_i4_v128relaxed(nk_i4x2_t const *a, nk_i4x2_t const *b, nk_size_t n, nk_i32_t *result);
618
+ /** @copydoc nk_dot_u4 */
619
+ NK_PUBLIC void nk_dot_u4_v128relaxed(nk_u4x2_t const *a, nk_u4x2_t const *b, nk_size_t n, nk_u32_t *result);
620
+ /** @copydoc nk_dot_f32c */
621
+ NK_PUBLIC void nk_dot_f32c_v128relaxed(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f64c_t *result);
622
+ /** @copydoc nk_dot_f32c */
623
+ NK_PUBLIC void nk_vdot_f32c_v128relaxed(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f64c_t *result);
624
+ /** @copydoc nk_dot_f64c */
625
+ NK_PUBLIC void nk_dot_f64c_v128relaxed(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t *result);
626
+ /** @copydoc nk_dot_f64c */
627
+ NK_PUBLIC void nk_vdot_f64c_v128relaxed(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t *result);
628
+ #endif // NK_TARGET_V128RELAXED
629
+
630
+ /**
631
+ * @brief Returns the output dtype for dot products.
632
+ */
633
+ NK_INTERNAL nk_dtype_t nk_dot_output_dtype(nk_dtype_t dtype) {
634
+ switch (dtype) {
635
+ case nk_f64_k: return nk_f64_k;
636
+ case nk_f32_k: return nk_f64_k;
637
+ case nk_f16_k: return nk_f32_k;
638
+ case nk_bf16_k: return nk_f32_k;
639
+ case nk_e4m3_k: return nk_f32_k;
640
+ case nk_e5m2_k: return nk_f32_k;
641
+ case nk_e2m3_k: return nk_f32_k;
642
+ case nk_e3m2_k: return nk_f32_k;
643
+ case nk_f64c_k: return nk_f64c_k;
644
+ case nk_f32c_k: return nk_f64c_k;
645
+ case nk_f16c_k: return nk_f32c_k;
646
+ case nk_bf16c_k: return nk_f32c_k;
647
+ case nk_i8_k: return nk_i32_k;
648
+ case nk_u8_k: return nk_u32_k;
649
+ case nk_i4_k: return nk_i32_k;
650
+ case nk_u4_k: return nk_u32_k;
651
+ case nk_u1_k: return nk_u32_k;
652
+ default: return nk_dtype_unknown_k;
653
+ }
654
+ }
655
+
656
+ #if defined(__cplusplus)
657
+ } // extern "C"
658
+ #endif
659
+
660
+ #include "numkong/dot/serial.h"
661
+ #include "numkong/dot/neon.h"
662
+ #include "numkong/dot/neonsdot.h"
663
+ #include "numkong/dot/neonfhm.h"
664
+ #include "numkong/dot/neonbfdot.h"
665
+ #include "numkong/dot/neonfp8.h"
666
+ #include "numkong/dot/sve.h"
667
+ #include "numkong/dot/svehalf.h"
668
+ #include "numkong/dot/svebfdot.h"
669
+ #include "numkong/dot/svesdot.h"
670
+ #include "numkong/dot/haswell.h"
671
+ #include "numkong/dot/skylake.h"
672
+ #include "numkong/dot/icelake.h"
673
+ #include "numkong/dot/genoa.h"
674
+ #include "numkong/dot/diamond.h"
675
+ #include "numkong/dot/sapphire.h"
676
+ #include "numkong/dot/alder.h"
677
+ #include "numkong/dot/sierra.h"
678
+ #include "numkong/dot/rvv.h"
679
+ #include "numkong/dot/rvvbb.h"
680
+ #include "numkong/dot/rvvhalf.h"
681
+ #include "numkong/dot/rvvbf16.h"
682
+ #include "numkong/dot/powervsx.h"
683
+ #include "numkong/dot/v128relaxed.h"
684
+ #include "numkong/dot/loongsonasx.h"
685
+
686
+ #if defined(__cplusplus)
687
+ extern "C" {
688
+ #endif
689
+
690
+ #if !NK_DYNAMIC_DISPATCH
691
+
692
+ NK_PUBLIC void nk_dot_i8(nk_i8_t const *a, nk_i8_t const *b, nk_size_t n, nk_i32_t *result) {
693
+ #if NK_TARGET_V128RELAXED
694
+ nk_dot_i8_v128relaxed(a, b, n, result);
695
+ #elif NK_TARGET_POWERVSX
696
+ nk_dot_i8_powervsx(a, b, n, result);
697
+ #elif NK_TARGET_LOONGSONASX
698
+ nk_dot_i8_loongsonasx(a, b, n, result);
699
+ #elif NK_TARGET_RVV
700
+ nk_dot_i8_rvv(a, b, n, result);
701
+ #elif NK_TARGET_SVESDOT
702
+ nk_dot_i8_svesdot(a, b, n, result);
703
+ #elif NK_TARGET_NEONSDOT
704
+ nk_dot_i8_neonsdot(a, b, n, result);
705
+ #elif NK_TARGET_ICELAKE
706
+ nk_dot_i8_icelake(a, b, n, result);
707
+ #elif NK_TARGET_SKYLAKE
708
+ nk_dot_i8_skylake(a, b, n, result);
709
+ #elif NK_TARGET_SIERRA
710
+ nk_dot_i8_sierra(a, b, n, result);
711
+ #elif NK_TARGET_ALDER
712
+ nk_dot_i8_alder(a, b, n, result);
713
+ #elif NK_TARGET_HASWELL
714
+ nk_dot_i8_haswell(a, b, n, result);
715
+ #else
716
+ nk_dot_i8_serial(a, b, n, result);
717
+ #endif
718
+ }
719
+
720
+ NK_PUBLIC void nk_dot_u8(nk_u8_t const *a, nk_u8_t const *b, nk_size_t n, nk_u32_t *result) {
721
+ #if NK_TARGET_V128RELAXED
722
+ nk_dot_u8_v128relaxed(a, b, n, result);
723
+ #elif NK_TARGET_POWERVSX
724
+ nk_dot_u8_powervsx(a, b, n, result);
725
+ #elif NK_TARGET_LOONGSONASX
726
+ nk_dot_u8_loongsonasx(a, b, n, result);
727
+ #elif NK_TARGET_RVV
728
+ nk_dot_u8_rvv(a, b, n, result);
729
+ #elif NK_TARGET_SVESDOT
730
+ nk_dot_u8_svesdot(a, b, n, result);
731
+ #elif NK_TARGET_NEONSDOT
732
+ nk_dot_u8_neonsdot(a, b, n, result);
733
+ #elif NK_TARGET_ICELAKE
734
+ nk_dot_u8_icelake(a, b, n, result);
735
+ #elif NK_TARGET_SKYLAKE
736
+ nk_dot_u8_skylake(a, b, n, result);
737
+ #elif NK_TARGET_SIERRA
738
+ nk_dot_u8_sierra(a, b, n, result);
739
+ #elif NK_TARGET_ALDER
740
+ nk_dot_u8_alder(a, b, n, result);
741
+ #elif NK_TARGET_HASWELL
742
+ nk_dot_u8_haswell(a, b, n, result);
743
+ #else
744
+ nk_dot_u8_serial(a, b, n, result);
745
+ #endif
746
+ }
747
+
748
+ NK_PUBLIC void nk_dot_i4(nk_i4x2_t const *a, nk_i4x2_t const *b, nk_size_t n, nk_i32_t *result) {
749
+ #if NK_TARGET_ICELAKE
750
+ nk_dot_i4_icelake(a, b, n, result);
751
+ #elif NK_TARGET_NEONSDOT
752
+ nk_dot_i4_neonsdot(a, b, n, result);
753
+ #elif NK_TARGET_RVV
754
+ nk_dot_i4_rvv(a, b, n, result);
755
+ #elif NK_TARGET_HASWELL
756
+ nk_dot_i4_haswell(a, b, n, result);
757
+ #elif NK_TARGET_V128RELAXED
758
+ nk_dot_i4_v128relaxed(a, b, n, result);
759
+ #else
760
+ nk_dot_i4_serial(a, b, n, result);
761
+ #endif
762
+ }
763
+
764
+ NK_PUBLIC void nk_dot_u4(nk_u4x2_t const *a, nk_u4x2_t const *b, nk_size_t n, nk_u32_t *result) {
765
+ #if NK_TARGET_ICELAKE
766
+ nk_dot_u4_icelake(a, b, n, result);
767
+ #elif NK_TARGET_NEONSDOT
768
+ nk_dot_u4_neonsdot(a, b, n, result);
769
+ #elif NK_TARGET_RVV
770
+ nk_dot_u4_rvv(a, b, n, result);
771
+ #elif NK_TARGET_HASWELL
772
+ nk_dot_u4_haswell(a, b, n, result);
773
+ #elif NK_TARGET_V128RELAXED
774
+ nk_dot_u4_v128relaxed(a, b, n, result);
775
+ #else
776
+ nk_dot_u4_serial(a, b, n, result);
777
+ #endif
778
+ }
779
+
780
+ NK_PUBLIC void nk_dot_u1(nk_u1x8_t const *a, nk_u1x8_t const *b, nk_size_t n_bits, nk_u32_t *result) {
781
+ #if NK_TARGET_ICELAKE
782
+ nk_dot_u1_icelake(a, b, n_bits, result);
783
+ #elif NK_TARGET_HASWELL
784
+ nk_dot_u1_haswell(a, b, n_bits, result);
785
+ #elif NK_TARGET_V128RELAXED
786
+ nk_dot_u1_v128relaxed(a, b, n_bits, result);
787
+ #elif NK_TARGET_POWERVSX
788
+ nk_dot_u1_powervsx(a, b, n_bits, result);
789
+ #elif NK_TARGET_RVVBB
790
+ nk_dot_u1_rvvbb(a, b, n_bits, result);
791
+ #elif NK_TARGET_RVV
792
+ nk_dot_u1_rvv(a, b, n_bits, result);
793
+ #elif NK_TARGET_NEON
794
+ nk_dot_u1_neon(a, b, n_bits, result);
795
+ #else
796
+ nk_dot_u1_serial(a, b, n_bits, result);
797
+ #endif
798
+ }
799
+
800
+ NK_PUBLIC void nk_dot_f16(nk_f16_t const *a, nk_f16_t const *b, nk_size_t n, nk_f32_t *result) {
801
+ #if NK_TARGET_V128RELAXED
802
+ nk_dot_f16_v128relaxed(a, b, n, result);
803
+ #elif NK_TARGET_POWERVSX
804
+ nk_dot_f16_powervsx(a, b, n, result);
805
+ #elif NK_TARGET_RVVHALF
806
+ nk_dot_f16_rvvhalf(a, b, n, result);
807
+ #elif NK_TARGET_RVV
808
+ nk_dot_f16_rvv(a, b, n, result);
809
+ #elif NK_TARGET_SVEHALF
810
+ nk_dot_f16_svehalf(a, b, n, result);
811
+ #elif NK_TARGET_NEONFHM
812
+ nk_dot_f16_neonfhm(a, b, n, result);
813
+ #elif NK_TARGET_NEON
814
+ nk_dot_f16_neon(a, b, n, result);
815
+ #elif NK_TARGET_DIAMOND
816
+ nk_dot_f16_diamond(a, b, n, result);
817
+ #elif NK_TARGET_SKYLAKE
818
+ nk_dot_f16_skylake(a, b, n, result);
819
+ #elif NK_TARGET_HASWELL
820
+ nk_dot_f16_haswell(a, b, n, result);
821
+ #else
822
+ nk_dot_f16_serial(a, b, n, result);
823
+ #endif
824
+ }
825
+
826
+ NK_PUBLIC void nk_dot_bf16(nk_bf16_t const *a, nk_bf16_t const *b, nk_size_t n, nk_f32_t *result) {
827
+ #if NK_TARGET_V128RELAXED
828
+ nk_dot_bf16_v128relaxed(a, b, n, result);
829
+ #elif NK_TARGET_POWERVSX
830
+ nk_dot_bf16_powervsx(a, b, n, result);
831
+ #elif NK_TARGET_LOONGSONASX
832
+ nk_dot_bf16_loongsonasx(a, b, n, result);
833
+ #elif NK_TARGET_GENOA
834
+ nk_dot_bf16_genoa(a, b, n, result);
835
+ #elif NK_TARGET_RVVBF16
836
+ nk_dot_bf16_rvvbf16(a, b, n, result);
837
+ #elif NK_TARGET_RVV
838
+ nk_dot_bf16_rvv(a, b, n, result);
839
+ #elif NK_TARGET_SKYLAKE
840
+ nk_dot_bf16_skylake(a, b, n, result);
841
+ #elif NK_TARGET_HASWELL
842
+ nk_dot_bf16_haswell(a, b, n, result);
843
+ #elif NK_TARGET_SVEBFDOT
844
+ nk_dot_bf16_svebfdot(a, b, n, result);
845
+ #elif NK_TARGET_NEONBFDOT
846
+ nk_dot_bf16_neonbfdot(a, b, n, result);
847
+ #elif NK_TARGET_NEON
848
+ nk_dot_bf16_neon(a, b, n, result);
849
+ #else
850
+ nk_dot_bf16_serial(a, b, n, result);
851
+ #endif
852
+ }
853
+
854
+ NK_PUBLIC void nk_dot_e4m3(nk_e4m3_t const *a, nk_e4m3_t const *b, nk_size_t n, nk_f32_t *result) {
855
+ #if NK_TARGET_DIAMOND
856
+ nk_dot_e4m3_diamond(a, b, n, result);
857
+ #elif NK_TARGET_ICELAKE
858
+ nk_dot_e4m3_icelake(a, b, n, result);
859
+ #elif NK_TARGET_NEONFP8
860
+ nk_dot_e4m3_neonfp8(a, b, n, result);
861
+ #elif NK_TARGET_NEONBFDOT
862
+ nk_dot_e4m3_neonbfdot(a, b, n, result);
863
+ #elif NK_TARGET_NEONFHM
864
+ nk_dot_e4m3_neonfhm(a, b, n, result);
865
+ #elif NK_TARGET_RVVHALF
866
+ nk_dot_e4m3_rvvhalf(a, b, n, result);
867
+ #elif NK_TARGET_RVVBF16
868
+ nk_dot_e4m3_rvvbf16(a, b, n, result);
869
+ #elif NK_TARGET_RVV
870
+ nk_dot_e4m3_rvv(a, b, n, result);
871
+ #elif NK_TARGET_V128RELAXED
872
+ nk_dot_e4m3_v128relaxed(a, b, n, result);
873
+ #elif NK_TARGET_SKYLAKE
874
+ nk_dot_e4m3_skylake(a, b, n, result);
875
+ #elif NK_TARGET_HASWELL
876
+ nk_dot_e4m3_haswell(a, b, n, result);
877
+ #elif NK_TARGET_NEON
878
+ nk_dot_e4m3_neon(a, b, n, result);
879
+ #else
880
+ nk_dot_e4m3_serial(a, b, n, result);
881
+ #endif
882
+ }
883
+
884
+ NK_PUBLIC void nk_dot_e5m2(nk_e5m2_t const *a, nk_e5m2_t const *b, nk_size_t n, nk_f32_t *result) {
885
+ #if NK_TARGET_DIAMOND
886
+ nk_dot_e5m2_diamond(a, b, n, result);
887
+ #elif NK_TARGET_GENOA
888
+ nk_dot_e5m2_genoa(a, b, n, result);
889
+ #elif NK_TARGET_NEONFP8
890
+ nk_dot_e5m2_neonfp8(a, b, n, result);
891
+ #elif NK_TARGET_NEONBFDOT
892
+ nk_dot_e5m2_neonbfdot(a, b, n, result);
893
+ #elif NK_TARGET_NEONFHM
894
+ nk_dot_e5m2_neonfhm(a, b, n, result);
895
+ #elif NK_TARGET_RVVHALF
896
+ nk_dot_e5m2_rvvhalf(a, b, n, result);
897
+ #elif NK_TARGET_RVVBF16
898
+ nk_dot_e5m2_rvvbf16(a, b, n, result);
899
+ #elif NK_TARGET_RVV
900
+ nk_dot_e5m2_rvv(a, b, n, result);
901
+ #elif NK_TARGET_V128RELAXED
902
+ nk_dot_e5m2_v128relaxed(a, b, n, result);
903
+ #elif NK_TARGET_SKYLAKE
904
+ nk_dot_e5m2_skylake(a, b, n, result);
905
+ #elif NK_TARGET_HASWELL
906
+ nk_dot_e5m2_haswell(a, b, n, result);
907
+ #elif NK_TARGET_NEON
908
+ nk_dot_e5m2_neon(a, b, n, result);
909
+ #else
910
+ nk_dot_e5m2_serial(a, b, n, result);
911
+ #endif
912
+ }
913
+
914
+ NK_PUBLIC void nk_dot_e2m3(nk_e2m3_t const *a, nk_e2m3_t const *b, nk_size_t n, nk_f32_t *result) {
915
+ #if NK_TARGET_NEONFP8
916
+ nk_dot_e2m3_neonfp8(a, b, n, result);
917
+ #elif NK_TARGET_ICELAKE
918
+ nk_dot_e2m3_icelake(a, b, n, result);
919
+ #elif NK_TARGET_SKYLAKE
920
+ nk_dot_e2m3_skylake(a, b, n, result);
921
+ #elif NK_TARGET_SIERRA
922
+ nk_dot_e2m3_sierra(a, b, n, result);
923
+ #elif NK_TARGET_ALDER
924
+ nk_dot_e2m3_alder(a, b, n, result);
925
+ #elif NK_TARGET_RVV
926
+ nk_dot_e2m3_rvv(a, b, n, result);
927
+ #elif NK_TARGET_HASWELL
928
+ nk_dot_e2m3_haswell(a, b, n, result);
929
+ #elif NK_TARGET_NEONSDOT
930
+ nk_dot_e2m3_neonsdot(a, b, n, result);
931
+ #elif NK_TARGET_NEON
932
+ nk_dot_e2m3_neon(a, b, n, result);
933
+ #elif NK_TARGET_V128RELAXED
934
+ nk_dot_e2m3_v128relaxed(a, b, n, result);
935
+ #else
936
+ nk_dot_e2m3_serial(a, b, n, result);
937
+ #endif
938
+ }
939
+
940
+ NK_PUBLIC void nk_dot_e3m2(nk_e3m2_t const *a, nk_e3m2_t const *b, nk_size_t n, nk_f32_t *result) {
941
+ #if NK_TARGET_NEONFP8
942
+ nk_dot_e3m2_neonfp8(a, b, n, result);
943
+ #elif NK_TARGET_ICELAKE
944
+ nk_dot_e3m2_icelake(a, b, n, result);
945
+ #elif NK_TARGET_NEONSDOT
946
+ nk_dot_e3m2_neonsdot(a, b, n, result);
947
+ #elif NK_TARGET_V128RELAXED
948
+ nk_dot_e3m2_v128relaxed(a, b, n, result);
949
+ #elif NK_TARGET_RVV
950
+ nk_dot_e3m2_rvv(a, b, n, result);
951
+ #elif NK_TARGET_SKYLAKE
952
+ nk_dot_e3m2_skylake(a, b, n, result);
953
+ #elif NK_TARGET_HASWELL
954
+ nk_dot_e3m2_haswell(a, b, n, result);
955
+ #elif NK_TARGET_NEON
956
+ nk_dot_e3m2_neon(a, b, n, result);
957
+ #else
958
+ nk_dot_e3m2_serial(a, b, n, result);
959
+ #endif
960
+ }
961
+
962
+ NK_PUBLIC void nk_dot_f32(nk_f32_t const *a, nk_f32_t const *b, nk_size_t n, nk_f64_t *result) {
963
+ #if NK_TARGET_V128RELAXED
964
+ nk_dot_f32_v128relaxed(a, b, n, result);
965
+ #elif NK_TARGET_POWERVSX
966
+ nk_dot_f32_powervsx(a, b, n, result);
967
+ #elif NK_TARGET_LOONGSONASX
968
+ nk_dot_f32_loongsonasx(a, b, n, result);
969
+ #elif NK_TARGET_RVV
970
+ nk_dot_f32_rvv(a, b, n, result);
971
+ #elif NK_TARGET_SVE
972
+ nk_dot_f32_sve(a, b, n, result);
973
+ #elif NK_TARGET_NEON
974
+ nk_dot_f32_neon(a, b, n, result);
975
+ #elif NK_TARGET_SKYLAKE
976
+ nk_dot_f32_skylake(a, b, n, result);
977
+ #elif NK_TARGET_HASWELL
978
+ nk_dot_f32_haswell(a, b, n, result);
979
+ #else
980
+ nk_dot_f32_serial(a, b, n, result);
981
+ #endif
982
+ }
983
+
984
+ NK_PUBLIC void nk_dot_f64(nk_f64_t const *a, nk_f64_t const *b, nk_size_t n, nk_f64_t *result) {
985
+ #if NK_TARGET_V128RELAXED
986
+ nk_dot_f64_v128relaxed(a, b, n, result);
987
+ #elif NK_TARGET_POWERVSX
988
+ nk_dot_f64_powervsx(a, b, n, result);
989
+ #elif NK_TARGET_LOONGSONASX
990
+ nk_dot_f64_loongsonasx(a, b, n, result);
991
+ #elif NK_TARGET_RVV
992
+ nk_dot_f64_rvv(a, b, n, result);
993
+ #elif NK_TARGET_SVE
994
+ nk_dot_f64_sve(a, b, n, result);
995
+ #elif NK_TARGET_NEON
996
+ nk_dot_f64_neon(a, b, n, result);
997
+ #elif NK_TARGET_SKYLAKE
998
+ nk_dot_f64_skylake(a, b, n, result);
999
+ #elif NK_TARGET_HASWELL
1000
+ nk_dot_f64_haswell(a, b, n, result);
1001
+ #else
1002
+ nk_dot_f64_serial(a, b, n, result);
1003
+ #endif
1004
+ }
1005
+
1006
+ NK_PUBLIC void nk_dot_f16c(nk_f16c_t const *a, nk_f16c_t const *b, nk_size_t n, nk_f32c_t *result) {
1007
+ #if NK_TARGET_SVEHALF
1008
+ nk_dot_f16c_svehalf(a, b, n, result);
1009
+ #elif NK_TARGET_NEONFHM
1010
+ nk_dot_f16c_neonfhm(a, b, n, result);
1011
+ #elif NK_TARGET_NEON
1012
+ nk_dot_f16c_neon(a, b, n, result);
1013
+ #elif NK_TARGET_HASWELL
1014
+ nk_dot_f16c_haswell(a, b, n, result);
1015
+ #else
1016
+ nk_dot_f16c_serial(a, b, n, result);
1017
+ #endif
1018
+ }
1019
+
1020
+ NK_PUBLIC void nk_dot_bf16c(nk_bf16c_t const *a, nk_bf16c_t const *b, nk_size_t n, nk_f32c_t *result) {
1021
+ #if NK_TARGET_GENOA
1022
+ nk_dot_bf16c_genoa(a, b, n, result);
1023
+ #elif NK_TARGET_NEONBFDOT
1024
+ nk_dot_bf16c_neonbfdot(a, b, n, result);
1025
+ #elif NK_TARGET_HASWELL
1026
+ nk_dot_bf16c_haswell(a, b, n, result);
1027
+ #else
1028
+ nk_dot_bf16c_serial(a, b, n, result);
1029
+ #endif
1030
+ }
1031
+
1032
+ NK_PUBLIC void nk_dot_f32c(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f64c_t *result) {
1033
+ #if NK_TARGET_SVE
1034
+ nk_dot_f32c_sve(a, b, n, result);
1035
+ #elif NK_TARGET_NEON
1036
+ nk_dot_f32c_neon(a, b, n, result);
1037
+ #elif NK_TARGET_RVV
1038
+ nk_dot_f32c_rvv(a, b, n, result);
1039
+ #elif NK_TARGET_SKYLAKE
1040
+ nk_dot_f32c_skylake(a, b, n, result);
1041
+ #elif NK_TARGET_HASWELL
1042
+ nk_dot_f32c_haswell(a, b, n, result);
1043
+ #elif NK_TARGET_V128RELAXED
1044
+ nk_dot_f32c_v128relaxed(a, b, n, result);
1045
+ #else
1046
+ nk_dot_f32c_serial(a, b, n, result);
1047
+ #endif
1048
+ }
1049
+
1050
+ NK_PUBLIC void nk_dot_f64c(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t *result) {
1051
+ #if NK_TARGET_SVE
1052
+ nk_dot_f64c_sve(a, b, n, result);
1053
+ #elif NK_TARGET_NEON
1054
+ nk_dot_f64c_neon(a, b, n, result);
1055
+ #elif NK_TARGET_RVV
1056
+ nk_dot_f64c_rvv(a, b, n, result);
1057
+ #elif NK_TARGET_SKYLAKE
1058
+ nk_dot_f64c_skylake(a, b, n, result);
1059
+ #elif NK_TARGET_HASWELL
1060
+ nk_dot_f64c_haswell(a, b, n, result);
1061
+ #elif NK_TARGET_V128RELAXED
1062
+ nk_dot_f64c_v128relaxed(a, b, n, result);
1063
+ #else
1064
+ nk_dot_f64c_serial(a, b, n, result);
1065
+ #endif
1066
+ }
1067
+
1068
+ NK_PUBLIC void nk_vdot_f16c(nk_f16c_t const *a, nk_f16c_t const *b, nk_size_t n, nk_f32c_t *result) {
1069
+ #if NK_TARGET_SVEHALF
1070
+ nk_vdot_f16c_svehalf(a, b, n, result);
1071
+ #elif NK_TARGET_NEONFHM
1072
+ nk_vdot_f16c_neonfhm(a, b, n, result);
1073
+ #elif NK_TARGET_NEON
1074
+ nk_vdot_f16c_neon(a, b, n, result);
1075
+ #elif NK_TARGET_HASWELL
1076
+ nk_vdot_f16c_haswell(a, b, n, result);
1077
+ #else
1078
+ nk_vdot_f16c_serial(a, b, n, result);
1079
+ #endif
1080
+ }
1081
+
1082
+ NK_PUBLIC void nk_vdot_bf16c(nk_bf16c_t const *a, nk_bf16c_t const *b, nk_size_t n, nk_f32c_t *result) {
1083
+ #if NK_TARGET_GENOA
1084
+ nk_vdot_bf16c_genoa(a, b, n, result);
1085
+ #elif NK_TARGET_NEONBFDOT
1086
+ nk_vdot_bf16c_neonbfdot(a, b, n, result);
1087
+ #elif NK_TARGET_HASWELL
1088
+ nk_vdot_bf16c_haswell(a, b, n, result);
1089
+ #else
1090
+ nk_vdot_bf16c_serial(a, b, n, result);
1091
+ #endif
1092
+ }
1093
+
1094
+ NK_PUBLIC void nk_vdot_f32c(nk_f32c_t const *a, nk_f32c_t const *b, nk_size_t n, nk_f64c_t *result) {
1095
+ #if NK_TARGET_SVE
1096
+ nk_vdot_f32c_sve(a, b, n, result);
1097
+ #elif NK_TARGET_NEON
1098
+ nk_vdot_f32c_neon(a, b, n, result);
1099
+ #elif NK_TARGET_RVV
1100
+ nk_vdot_f32c_rvv(a, b, n, result);
1101
+ #elif NK_TARGET_SKYLAKE
1102
+ nk_vdot_f32c_skylake(a, b, n, result);
1103
+ #elif NK_TARGET_HASWELL
1104
+ nk_vdot_f32c_haswell(a, b, n, result);
1105
+ #elif NK_TARGET_V128RELAXED
1106
+ nk_vdot_f32c_v128relaxed(a, b, n, result);
1107
+ #else
1108
+ nk_vdot_f32c_serial(a, b, n, result);
1109
+ #endif
1110
+ }
1111
+
1112
+ NK_PUBLIC void nk_vdot_f64c(nk_f64c_t const *a, nk_f64c_t const *b, nk_size_t n, nk_f64c_t *result) {
1113
+ #if NK_TARGET_SVE
1114
+ nk_vdot_f64c_sve(a, b, n, result);
1115
+ #elif NK_TARGET_NEON
1116
+ nk_vdot_f64c_neon(a, b, n, result);
1117
+ #elif NK_TARGET_RVV
1118
+ nk_vdot_f64c_rvv(a, b, n, result);
1119
+ #elif NK_TARGET_SKYLAKE
1120
+ nk_vdot_f64c_skylake(a, b, n, result);
1121
+ #elif NK_TARGET_HASWELL
1122
+ nk_vdot_f64c_haswell(a, b, n, result);
1123
+ #elif NK_TARGET_V128RELAXED
1124
+ nk_vdot_f64c_v128relaxed(a, b, n, result);
1125
+ #else
1126
+ nk_vdot_f64c_serial(a, b, n, result);
1127
+ #endif
1128
+ }
1129
+
1130
+ #endif // !NK_DYNAMIC_DISPATCH
1131
+
1132
+ #if defined(__cplusplus)
1133
+ } // extern "C"
1134
+ #endif
1135
+
1136
+ #endif