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,442 @@
1
+ # Vector-Vector Dot Products in NumKong
2
+
3
+ NumKong implements dot products for every numeric type supported by the library, as a core building block of higher-level functionality for vectors and higher rank tensors.
4
+
5
+ Dot product for real numbers and integers is defined as:
6
+
7
+ $$
8
+ \text{dot}(a, b) = \sum_{i=0}^{n-1} a_i \cdot b_i
9
+ $$
10
+
11
+ For complex numbers, the dot product expands via the distributive property of complex multiplication:
12
+
13
+ $$
14
+ \text{dot}(a, b) = \sum_{i=0}^{n-1} (a_{i,re} \cdot b_{i,re} - a_{i,im} \cdot b_{i,im}) + j \sum_{i=0}^{n-1} (a_{i,re} \cdot b_{i,im} + a_{i,im} \cdot b_{i,re})
15
+ $$
16
+
17
+ The conjugate dot product negates the imaginary part of $b$:
18
+
19
+ $$
20
+ \text{vdot}(a, b) = \sum_{i=0}^{n-1} a_i \cdot \bar{b_i} = \sum_{i=0}^{n-1} (a_{i,re} \cdot b_{i,re} + a_{i,im} \cdot b_{i,im}) + j \sum_{i=0}^{n-1} (a_{i,im} \cdot b_{i,re} - a_{i,re} \cdot b_{i,im})
21
+ $$
22
+
23
+ Where $\bar{b_i}$ is the complex conjugate of $b_i$.
24
+ Reformulating as Python pseudocode for interleaved real/imaginary scalar arrays:
25
+
26
+ ```python
27
+ def dot_real(a: List[number], b: List[number]) -> number:
28
+ return sum(ai * bi for ai, bi in zip(a, b))
29
+
30
+ def dot_complex(a: List[number], b: List[number]) -> Tuple[number, number]:
31
+ a_re, a_im = a[0::2], a[1::2]
32
+ b_re, b_im = b[0::2], b[1::2]
33
+ ab_re = sum(ar * br - ai * bi for ar, ai, br, bi in zip(a_re, a_im, b_re, b_im))
34
+ ab_im = sum(ar * bi + ai * br for ar, ai, br, bi in zip(a_re, a_im, b_re, b_im))
35
+ return ab_re, ab_im
36
+
37
+ def vdot_complex(a: List[number], b: List[number]) -> Tuple[number, number]:
38
+ a_re, a_im = a[0::2], a[1::2]
39
+ b_re, b_im = b[0::2], b[1::2]
40
+ ab_re = sum(ar * br + ai * bi for ar, ai, br, bi in zip(a_re, a_im, b_re, b_im))
41
+ ab_im = sum(ai * br - ar * bi for ar, ai, br, bi in zip(a_re, a_im, b_re, b_im))
42
+ return ab_re, ab_im
43
+ ```
44
+
45
+ ## Input & Output Types
46
+
47
+ Real and integer dot products:
48
+
49
+ | Input Type | Output Type | Description |
50
+ | ---------- | ----------- | ---------------------------------------------- |
51
+ | `f64` | `f64` | 64-bit IEEE 754 double precision |
52
+ | `f32` | `f32` | 32-bit IEEE 754 single precision |
53
+ | `f16` | `f32` | 16-bit IEEE 754 half precision, widened output |
54
+ | `bf16` | `f32` | 16-bit brain float, widened output |
55
+ | `e4m3` | `f32` | 8-bit Float8: 4 exponent, 3 mantissa bits |
56
+ | `e5m2` | `f32` | 8-bit Float8: 5 exponent, 2 mantissa bits |
57
+ | `e2m3` | `f32` | 8-bit MX format: 2 exponent, 3 mantissa bits |
58
+ | `e3m2` | `f32` | 8-bit MX format: 3 exponent, 2 mantissa bits |
59
+ | `i8` | `i32` | 8-bit signed integers |
60
+ | `u8` | `u32` | 8-bit unsigned integers |
61
+ | `i4` | `i32` | 4-bit signed integers, packed nibble pairs |
62
+ | `u4` | `u32` | 4-bit unsigned integers, packed nibble pairs |
63
+ | `u1` | `u32` | 1-bit binary packed octets, popcount of AND |
64
+
65
+ Complex dot products (both `dot` and `vdot`):
66
+
67
+ | Input Type | Output Type | Description |
68
+ | ---------- | ----------- | ------------------------------------------ |
69
+ | `f64c` | `f64c` | 64-bit complex pairs |
70
+ | `f32c` | `f32c` | 32-bit complex pairs |
71
+ | `f16c` | `f32c` | 16-bit complex pairs, widened output |
72
+ | `bf16c` | `f32c` | 16-bit brain complex pairs, widened output |
73
+
74
+ ## Optimizations
75
+
76
+ ### Compensated Arithmetic for Large Floats
77
+
78
+ `nk_dot_f64_serial` uses Neumaier compensated summation — tracking a correction term adjusted by magnitude comparison at each step.
79
+ `nk_dot_f64_haswell`, `nk_dot_f64_skylake`, `nk_dot_f64_sve` implement the Dot2 algorithm by Ogita, Rump, and Oishi: TwoProd via FMA captures the rounding error of each product exactly, and a TwoSum chain propagates it through the accumulator.
80
+ On SVE, the final horizontal reduction uses `svtbl` to extract upper halves at each tree level, applying TwoSum at every stage.
81
+ The serial path uses Neumaier because it processes one element at a time and can cheaply branch on magnitudes.
82
+ Dot2 avoids those branches entirely — TwoProd and TwoSum are pure arithmetic with no comparisons, mapping naturally to wide SIMD where branching per lane is impossible.
83
+
84
+ ### Lookup Tables for Mini-Floats
85
+
86
+ `nk_dot_e2m3_haswell`, `nk_dot_e3m2_haswell`, `nk_dot_e2m3_skylake`, `nk_dot_e3m2_skylake` encode 32 MX format values into scaled integers via dual 16-entry LUTs loaded into vector registers.
87
+ The low 4 magnitude bits index `VPSHUFB`, bit 4 selects between the lower and upper table via blending, and the results feed into `VPMADDUBSW` + `VPMADDWD` chains with a final $\div 256$ scaling.
88
+ The Sapphire-specific MX implementation in `sapphire.h` replaces this with a single 64-entry signed LUT via `VPERMUTEX2VAR`, where the sign bit naturally selects between positive and negative tables.
89
+ That path accumulates in native Float16 via `VFMADD_PH` and flushes to Float32 every 128 elements to avoid overflow.
90
+
91
+ ### Algebraic Domain Shifting
92
+
93
+ `nk_dot_i8_icelake`, `nk_dot_u8_icelake` work around `VPDPBUSD` requiring UInt8 × Int8 operands.
94
+ For Int8 × Int8, one operand is XORed with `0x80` to shift to unsigned, and the correction $128 \cdot \sum b_i$ is computed via `VPSADBW`, which runs on port 5 and avoids contention with `DPBUSD` on ports 0-1.
95
+ `nk_dot_i4_icelake` extends this to packed nibbles using the identity $(a'-8)(b'-8) = a' b' - 8(a'+b') + 64$ — two `VPDPBUSD` calls handle low and high nibbles separately, with SAD-based correction.
96
+ `nk_dot_i8_v128relaxed`, `nk_dot_u8_v128relaxed` face an even tighter constraint: WASM's `i32x4_relaxed_dot_i8x16_i7x16_add` computes Int8 × Int7, so the sign bit of one operand must be masked off entirely.
97
+ For Int8 × Int8, the sign bit of $b$ is cleared to produce a 7-bit value, and a windowed correction $-128 \cdot \sum_{b_i < 0} a_i$ is accumulated in Int16 and flushed every 127 iterations to prevent overflow.
98
+ For UInt8 × UInt8, $b$ is XORed with `0x80` to shift into signed range, same as Ice Lake, with the correction $128 \cdot \sum a_i$ computed via pairwise widening adds.
99
+
100
+ ### Octave Decomposition for E4M3 via VNNI
101
+
102
+ `nk_dot_e4m3_icelake` splits the 4-bit E4M3 exponent into 2 "octave" bits (top) and 2 "remainder" bits (bottom).
103
+ The bottom 5 bits (2 remainder + 3 mantissa) map via `VPERMB` to u8 integers in [0, 120] — identical structure to the E2M3 $\times 16$ LUT.
104
+ A subnormal fixup replaces LUT entries for magnitude < 8 with $2 \times \text{mantissa}$ via a second masked `VPERMB`, avoiding `VPADDB` on the VPDPBUSD execution ports.
105
+ Sign is computed via `VPTERNLOGD` with immediate 0x14, fusing `(a \oplus b) \wedge \lnot \text{0x7F}` in one instruction.
106
+ The 4 octave bins per operand produce $4 \times 4 = 16$ `VPDPBUSD` cross-products accumulated into 7 registers grouped by octave sum $k = o_a + o_b \in [0, 6]$.
107
+ Each accumulator is scaled by $2^{4k-20}$ — an exact power of two, introducing no rounding.
108
+ This processes 64 E4M3 bytes per iteration in u8, doubling the element density of the BF16 upcast path.
109
+
110
+ ### Widening Fusion Through BFloat16 on x86
111
+
112
+ `nk_dot_e5m2_genoa` converts FP8 values to BF16, then accumulates via `VDPBF16PS`, reusing Genoa's BF16 dot-product instruction for FP8 types.
113
+ Each `VDPBF16PS` fuses two BF16 multiply-adds per 32-bit lane at 6-cycle throughput.
114
+ `nk_dot_bf16c_genoa` uses the same instruction for complex BF16, preparing operands with `VPSHUFB` for lane swapping and `VPXORD` with `0x80000000` for sign flips before feeding into `VDPBF16PS`.
115
+
116
+ ### Deferred Sign-Flip in Complex Dot Products
117
+
118
+ The Haswell BFloat16Complex/Float16Complex/Float32Complex kernels compute $\sum (a_r b_r - a_i b_i)$ without per-pair subtraction.
119
+ Instead, two accumulators collect interleaved products $[a_r b_r, a_i b_i, \ldots]$ and $[a_r b_i, a_i b_r, \ldots]$, and a post-loop XOR flips the sign of every odd lane to produce the subtraction.
120
+ This gives one FMA per accumulator per iteration, but each lane grows $O(n)$ while the true result is $O(\sqrt{n})$.
121
+ The Float32Complex kernel absorbs this via Float64 accumulators; Genoa's `VDPBF16PS` and ARM's `FMLSL` pair terms naturally.
122
+ For BFloat16Complex/Float16Complex on Haswell the accumulator is Float32, so the $O(\log n)$ precision loss from lane separation is visible in max ULP at large $n$, though mean ULP remains low.
123
+
124
+ ### Widening Fusion Through Float16 on Arm
125
+
126
+ `nk_dot_f16_neonfhm`, `nk_dot_f16c_neonfhm` use the ARMv8.4-FHM instructions `FMLAL`/`FMLSL`, which fuse FP16-to-FP32 conversion with multiply-accumulate in a single operation.
127
+ `vfmlalq_low_f16` and `vfmlalq_high_f16` process the lower and upper 4 elements of an 8-wide FP16 vector respectively.
128
+ For complex dot products, `FMLSL` provides the subtraction path $a_{re} b_{im} - a_{im} b_{re}$ without a separate negate step.
129
+
130
+ ### Widening Chains on RISC-V
131
+
132
+ `nk_dot_i8_rvv`, `nk_dot_u8_rvv` use `vwmul` for Int8 × Int8 → Int16 widening multiply followed by `vwadd` to widen-accumulate into Int32 — a two-stage chain that naturally prevents overflow.
133
+ `nk_dot_bf16_rvvbf16` uses the Zvfbfwma extension's `vfwmaccbf16` for fused BFloat16 × BFloat16 → Float32 widening multiply-accumulate.
134
+ `nk_dot_e4m3_rvvbf16`, `nk_dot_e5m2_rvvbf16` convert Float8 to BFloat16 via 256-entry LUTs, then feed the same `vfwmaccbf16` path.
135
+
136
+ ## Performance
137
+
138
+ The following performance tables are produced by manually re-running `nk_test` and `nk_bench` included internal tools to measure both accuracy and throughput at different input shapes.
139
+ The input size is controlled by the `NK_DENSE_DIMENSIONS` environment variable and set to 256, 1024, and 4096 elements.
140
+ The throughput is measured in gb/s as the number of bytes read per second amortized for a large batch of vector pairs.
141
+ Accuracy is reported as mean ULP (units in last place) unless noted otherwise — the average number of representable floating-point values between the result and the exact answer.
142
+ Rows marked `🧩` use external BLAS baselines rather than NumKong kernels.
143
+ Each kernel runs for at least 20 seconds per configuration.
144
+ Benchmark threads are pinned to specific cores; on machines with heterogeneous core types (e.g., Apple P/E cores), only the fastest cores are used.
145
+ Workloads that significantly degrade CPU frequencies (Intel AMX, Apple SME) run in separate passes to avoid affecting throughput measurements of other kernels.
146
+
147
+ ### Intel Sapphire Rapids
148
+
149
+ #### Native
150
+
151
+ | Kernel | 256 | 1024 | 4096 |
152
+ | :---------------------- | -----------------------: | -----------------------: | -----------------------: |
153
+ | __f64c__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
154
+ | `dot_f64c_with_blas` 🧩 | 29.1 gb/s, 25 ulp | 27.6 gb/s, 97 ulp | 13.6 gb/s, 32 ulp |
155
+ | `vdot_f64c_with_blas` 🧩 | 29.1 gb/s, 18 ulp | 27.9 gb/s, 17 ulp | 15.3 gb/s, 25 ulp |
156
+ | `nk_dot_f64c_serial` | 5.45 gb/s, 3.9 ulp | 6.49 gb/s, 9.0 ulp | 6.84 gb/s, 2.9 ulp |
157
+ | `nk_vdot_f64c_serial` | 5.47 gb/s, 4.6 ulp | 6.41 gb/s, 1.6 ulp | 6.76 gb/s, 2.2 ulp |
158
+ | `nk_dot_f64c_skylake` | 23.8 gb/s, 0 ulp | 23.4 gb/s, 0 ulp | 11.8 gb/s, 0 ulp |
159
+ | `nk_vdot_f64c_skylake` | 23.6 gb/s, 0 ulp | 23.7 gb/s, 0 ulp | 11.6 gb/s, 0 ulp |
160
+ | __f32c__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
161
+ | `dot_f32c_with_blas` 🧩 | 28.7 gb/s, 8.6 ulp | 29.8 gb/s, 13 ulp | 15.8 gb/s, 19 ulp |
162
+ | `vdot_f32c_with_blas` 🧩 | 29.2 gb/s, 11 ulp | 30.2 gb/s, 14 ulp | 15.7 gb/s, 21 ulp |
163
+ | `nk_dot_f32c_serial` | 9.46 gb/s, 0 ulp | 9.82 gb/s, 0 ulp | 9.71 gb/s, 0 ulp |
164
+ | `nk_vdot_f32c_serial` | 9.64 gb/s, 0 ulp | 9.95 gb/s, 0 ulp | 10.1 gb/s, 0 ulp |
165
+ | `nk_dot_f32c_haswell` | 22.4 gb/s, 0 ulp | 22.2 gb/s, 0 ulp | 12.6 gb/s, 0 ulp |
166
+ | `nk_vdot_f32c_haswell` | 22.4 gb/s, 0 ulp | 21.8 gb/s, 0 ulp | 14.7 gb/s, 0 ulp |
167
+ | `nk_dot_f32c_skylake` | 25.6 gb/s, 0 ulp | 27.2 gb/s, 0 ulp | 17.0 gb/s, 0 ulp |
168
+ | `nk_vdot_f32c_skylake` | 27.8 gb/s, 0 ulp | 27.4 gb/s, 0 ulp | 18.8 gb/s, 0 ulp |
169
+ | __bf16c__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
170
+ | `nk_dot_bf16c_serial` | 0.628 gb/s, 0.1 ulp | 0.627 gb/s, 2.3 ulp | 0.626 gb/s, 7.9 ulp |
171
+ | `nk_vdot_bf16c_serial` | 0.622 gb/s, 0.2 ulp | 0.624 gb/s, 2.1 ulp | 0.627 gb/s, 11.2 ulp |
172
+ | `nk_dot_bf16c_haswell` | 21.5 gb/s, 0.1 ulp | 18.5 gb/s, 1.3 ulp | 18.4 gb/s, 3.4 ulp |
173
+ | `nk_vdot_bf16c_haswell` | 21.9 gb/s, 0.8 ulp | 19.0 gb/s, 2.0 ulp | 18.5 gb/s, 4.5 ulp |
174
+ | `nk_dot_bf16c_genoa` | 37.9 gb/s, 0 ulp | 30.3 gb/s, 1.1 ulp | 29.5 gb/s, 2.8 ulp |
175
+ | `nk_vdot_bf16c_genoa` | 36.1 gb/s, 0.7 ulp | 30.2 gb/s, 1.2 ulp | 30.2 gb/s, 3.3 ulp |
176
+ | __f16c__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
177
+ | `nk_dot_f16c_serial` | 2.02 gb/s, 14.4 ulp | 2.00 gb/s, 27.3 ulp | 2.02 gb/s, 34.0 ulp |
178
+ | `nk_vdot_f16c_serial` | 1.67 gb/s, 15.0 ulp | 1.64 gb/s, 26.3 ulp | 1.64 gb/s, 34.2 ulp |
179
+ | `nk_dot_f16c_haswell` | 23.9 gb/s, 12.7 ulp | 19.4 gb/s, 22.3 ulp | 19.3 gb/s, 40.1 ulp |
180
+ | `nk_vdot_f16c_haswell` | 24.0 gb/s, 11.1 ulp | 20.0 gb/s, 17.4 ulp | 17.1 gb/s, 29.2 ulp |
181
+ | __f64__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
182
+ | `dot_f64_with_blas` 🧩 | 27.8 gb/s, 6.9 ulp | 30.1 gb/s, 9.3 ulp | 15.7 gb/s, 20 ulp |
183
+ | `nk_dot_f64_serial` | 4.28 gb/s, 2.2 ulp | 4.39 gb/s, 2.0 ulp | 4.42 gb/s, 3.3 ulp |
184
+ | `nk_dot_f64_haswell` | 24.2 gb/s, 0 ulp | 25.7 gb/s, 0 ulp | 18.3 gb/s, 0 ulp |
185
+ | `nk_dot_f64_skylake` | 29.0 gb/s, 0 ulp | 28.6 gb/s, 0 ulp | 24.9 gb/s, 0 ulp |
186
+ | __f32__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
187
+ | `dot_f32_with_blas` 🧩 | 47.8 gb/s, 14 ulp | 30.7 gb/s, 14 ulp | 29.7 gb/s, 15 ulp |
188
+ | `nk_dot_f32_serial` | 11.0 gb/s, 0 ulp | 11.2 gb/s, 0 ulp | 11.5 gb/s, 0 ulp |
189
+ | `nk_dot_f32_haswell` | 30.5 gb/s, 0 ulp | 23.9 gb/s, 0 ulp | 24.4 gb/s, 0 ulp |
190
+ | `nk_dot_f32_skylake` | 44.2 gb/s, 0 ulp | 29.8 gb/s, 0 ulp | 30.0 gb/s, 0 ulp |
191
+ | __bf16__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
192
+ | `nk_dot_bf16_serial` | 0.633 gb/s, 0 ulp | 0.630 gb/s, 0.5 ulp | 0.638 gb/s, 5.4 ulp |
193
+ | `nk_dot_bf16_haswell` | 39.3 gb/s, 0 ulp | 25.5 gb/s, 0.2 ulp | 20.2 gb/s, 25.3 ulp |
194
+ | `nk_dot_bf16_skylake` | 62.7 gb/s, 0 ulp | 30.2 gb/s, 0.2 ulp | 29.5 gb/s, 2.3 ulp |
195
+ | `nk_dot_bf16_genoa` | 88.8 gb/s, 0 ulp | 29.7 gb/s, 0.2 ulp | 31.2 gb/s, 2.2 ulp |
196
+ | __f16__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
197
+ | `nk_dot_f16_serial` | 1.31 gb/s, 11.5 ulp | 1.32 gb/s, 33.7 ulp | 1.30 gb/s, 59.7 ulp |
198
+ | `nk_dot_f16_haswell` | 31.3 gb/s, 7.0 ulp | 22.8 gb/s, 14.0 ulp | 19.8 gb/s, 29.8 ulp |
199
+ | `nk_dot_f16_skylake` | 54.9 gb/s, 6.2 ulp | 31.7 gb/s, 8.6 ulp | 30.9 gb/s, 22.8 ulp |
200
+ | __e5m2__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
201
+ | `nk_dot_e5m2_serial` | 1.90 gb/s, 0 ulp | 1.07 gb/s, 0 ulp | 1.08 gb/s, 0 ulp |
202
+ | `nk_dot_e5m2_haswell` | 4.92 gb/s, 0 ulp | 4.95 gb/s, 0 ulp | 4.80 gb/s, 0 ulp |
203
+ | `nk_dot_e5m2_skylake` | 6.20 gb/s, 0 ulp | 6.36 gb/s, 0 ulp | 6.25 gb/s, 0 ulp |
204
+ | `nk_dot_e5m2_genoa` | 12.1 gb/s, 0 ulp | 12.6 gb/s, 0 ulp | 12.6 gb/s, 0 ulp |
205
+ | __e4m3__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
206
+ | `nk_dot_e4m3_serial` | 0.762 gb/s, 0 ulp | 0.424 gb/s, 0 ulp | 0.420 gb/s, 0 ulp |
207
+ | `nk_dot_e4m3_haswell` | 3.78 gb/s, 0 ulp | 3.77 gb/s, 0 ulp | 3.75 gb/s, 0 ulp |
208
+ | `nk_dot_e4m3_skylake` | 5.10 gb/s, 0 ulp | 5.16 gb/s, 0 ulp | 5.21 gb/s, 0 ulp |
209
+ | `nk_dot_e4m3_icelake` | 13.2 gb/s, 0 ulp | 14.9 gb/s, 0 ulp | 14.7 gb/s, 0 ulp |
210
+ | __e3m2__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
211
+ | `nk_dot_e3m2_serial` | 1.47 gb/s, 0 ulp | 1.05 gb/s, 0 ulp | 1.04 gb/s, 0 ulp |
212
+ | `nk_dot_e3m2_haswell` | 12.0 gb/s, 0 ulp | 12.2 gb/s, 0 ulp | 12.2 gb/s, 0 ulp |
213
+ | `nk_dot_e3m2_skylake` | 21.6 gb/s, 0 ulp | 23.1 gb/s, 0 ulp | 23.2 gb/s, 0 ulp |
214
+ | `nk_dot_e3m2_icelake` | 23.1 gb/s, 0 ulp | 24.3 gb/s, 0 ulp | 23.9 gb/s, 0 ulp |
215
+ | __e2m3__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
216
+ | `nk_dot_e2m3_serial` | 1.87 gb/s, 0 ulp | 1.25 gb/s, 0 ulp | 1.96 gb/s, 0 ulp |
217
+ | `nk_dot_e2m3_haswell` | 20.5 gb/s, 0 ulp | 20.4 gb/s, 0 ulp | 19.3 gb/s, 0 ulp |
218
+ | `nk_dot_e2m3_skylake` | 35.7 gb/s, 0 ulp | 33.2 gb/s, 0 ulp | 30.7 gb/s, 0 ulp |
219
+ | `nk_dot_e2m3_icelake` | 58.0 gb/s, 0 ulp | 46.0 gb/s, 0 ulp | 31.5 gb/s, 0 ulp |
220
+ | `nk_dot_e2m3_alder` | 29.9 gb/s, 0 ulp | 30.8 gb/s, 0 ulp | 29.1 gb/s, 0 ulp |
221
+ | __i8__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
222
+ | `nk_dot_i8_serial` | 16.9 gb/s | 16.8 gb/s | 15.6 gb/s |
223
+ | `nk_dot_i8_haswell` | 43.2 gb/s | 35.8 gb/s | 29.1 gb/s |
224
+ | `nk_dot_i8_skylake` | 52.9 gb/s | 36.5 gb/s | 28.5 gb/s |
225
+ | `nk_dot_i8_icelake` | 64.0 gb/s | 46.2 gb/s | 26.8 gb/s |
226
+ | `nk_dot_i8_alder` | 42.8 gb/s | 40.4 gb/s | 31.1 gb/s |
227
+ | __u8__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
228
+ | `nk_dot_u8_serial` | 16.9 gb/s | 16.5 gb/s | 15.8 gb/s |
229
+ | `nk_dot_u8_haswell` | 47.7 gb/s | 37.7 gb/s | 29.1 gb/s |
230
+ | `nk_dot_u8_skylake` | 48.7 gb/s | 32.6 gb/s | 27.5 gb/s |
231
+ | `nk_dot_u8_icelake` | 68.4 gb/s | 46.9 gb/s | 30.2 gb/s |
232
+ | `nk_dot_u8_alder` | 42.1 gb/s | 41.8 gb/s | 31.6 gb/s |
233
+ | __i4__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
234
+ | `nk_dot_i4_serial` | 9.37 gb/s | 11.8 gb/s | 11.8 gb/s |
235
+ | `nk_dot_i4_haswell` | 8.22 gb/s | 8.53 gb/s | 8.23 gb/s |
236
+ | `nk_dot_i4_icelake` | 24.3 gb/s | 36.3 gb/s | 25.5 gb/s |
237
+ | __u4__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
238
+ | `nk_dot_u4_serial` | 10.6 gb/s | 12.0 gb/s | 11.9 gb/s |
239
+ | `nk_dot_u4_haswell` | 15.0 gb/s | 16.4 gb/s | 14.3 gb/s |
240
+ | `nk_dot_u4_icelake` | 48.1 gb/s | 64.4 gb/s | 30.9 gb/s |
241
+ | __u1__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
242
+ | `nk_dot_u1_serial` | 3.92 gb/s | 5.04 gb/s | 4.97 gb/s |
243
+ | `nk_dot_u1_haswell` | 14.7 gb/s | 43.2 gb/s | 69.4 gb/s |
244
+ | `nk_dot_u1_icelake` | 17.9 gb/s | 68.8 gb/s | 110 gb/s |
245
+
246
+ #### WASM
247
+
248
+ Measured with Wasmtime v42 (Cranelift backend).
249
+
250
+ | Kernel | 256 | 1024 | 4096 |
251
+ | :------------------------- | -----------------------: | -----------------------: | -----------------------: |
252
+ | __f64c__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
253
+ | `nk_dot_f64c_serial` | 1.76 gb/s, 5.3 ulp | 2.43 gb/s, 3.3 ulp | 0.28 gb/s, 2.9 ulp |
254
+ | `nk_vdot_f64c_serial` | 1.02 gb/s, 3.5 ulp | 2.44 gb/s, 5.5 ulp | 0.15 gb/s, 2.2 ulp |
255
+ | `nk_dot_f64c_v128relaxed` | 2.80 gb/s, 37.8 ulp | 3.01 gb/s, 34.9 ulp | 0.21 gb/s, 167 ulp |
256
+ | `nk_vdot_f64c_v128relaxed` | 2.06 gb/s, 20.1 ulp | 2.87 gb/s, 51.4 ulp | 0.04 gb/s, 57.2 ulp |
257
+ | __f32c__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
258
+ | `nk_dot_f32c_serial` | 1.26 gb/s, 0 ulp | 1.74 gb/s, 0 ulp | 0.08 gb/s, 0 ulp |
259
+ | `nk_vdot_f32c_serial` | 1.13 gb/s, 0 ulp | 1.78 gb/s, 0 ulp | 0.21 gb/s, 0 ulp |
260
+ | `nk_dot_f32c_v128relaxed` | 1.62 gb/s, 0 ulp | 1.92 gb/s, 0 ulp | 0.20 gb/s, 0 ulp |
261
+ | `nk_vdot_f32c_v128relaxed` | 1.66 gb/s, 0 ulp | 1.69 gb/s, 0 ulp | 0.13 gb/s, 0 ulp |
262
+ | __bf16c__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
263
+ | `nk_dot_bf16c_serial` | 1.00 gb/s, 0.1 ulp | 2.29 gb/s, 1.7 ulp | 0.08 gb/s, 7.9 ulp |
264
+ | `nk_vdot_bf16c_serial` | 0.581 gb/s, 0.1 ulp | 0.919 gb/s, 2.9 ulp | 0.30 gb/s, 11.2 ulp |
265
+ | __f16c__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
266
+ | `nk_dot_f16c_serial` | 1.39 gb/s, 12.6 ulp | 0.759 gb/s, 22.2 ulp | 0.23 gb/s, 34 ulp |
267
+ | `nk_vdot_f16c_serial` | 1.11 gb/s, 14.4 ulp | 0.828 gb/s, 41.8 ulp | 0.02 gb/s, 34.2 ulp |
268
+ | __f64__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
269
+ | `nk_dot_f64_serial` | 1.53 gb/s, 3.1 ulp | 1.72 gb/s, 2.5 ulp | 0.20 gb/s, 3.3 ulp |
270
+ | `nk_dot_f64_v128relaxed` | 2.62 gb/s, 3.2 ulp | 2.11 gb/s, 3.6 ulp | 0.28 gb/s, 3.8 ulp |
271
+ | __f32__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
272
+ | `nk_dot_f32_serial` | 1.95 gb/s, 0 ulp | 1.89 gb/s, 0 ulp | 0.28 gb/s, 0 ulp |
273
+ | `nk_dot_f32_v128relaxed` | 0.083 gb/s, 0 ulp | 1.61 gb/s, 0 ulp | 1.37 gb/s, 0 ulp |
274
+ | __bf16__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
275
+ | `nk_dot_bf16_serial` | 2.90 gb/s, 0 ulp | 2.27 gb/s, 0.5 ulp | 0.22 gb/s, 5.2 ulp |
276
+ | `nk_dot_bf16_v128relaxed` | 0.521 gb/s, 0 ulp | 2.30 gb/s, 0.3 ulp | 0.30 gb/s, 2.4 ulp |
277
+ | __f16__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
278
+ | `nk_dot_f16_serial` | 0.648 gb/s, 13.5 ulp | 0.712 gb/s, 32 ulp | 0.08 gb/s, 59.7 ulp |
279
+ | `nk_dot_f16_v128relaxed` | 1.58 gb/s, 7.0 ulp | 1.05 gb/s, 30.8 ulp | 0.09 gb/s, 65.1 ulp |
280
+ | __e5m2__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
281
+ | `nk_dot_e5m2_serial` | 1.27 gb/s, 0 ulp | 0.679 gb/s, 0 ulp | 0.10 gb/s, 0 ulp |
282
+ | `nk_dot_e5m2_v128relaxed` | 0.970 gb/s, 0 ulp | 0.955 gb/s, 0 ulp | 0.17 gb/s, 0 ulp |
283
+ | __e4m3__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
284
+ | `nk_dot_e4m3_serial` | 0.312 gb/s, 0 ulp | 0.342 gb/s, 0 ulp | 0.12 gb/s, 0 ulp |
285
+ | `nk_dot_e4m3_v128relaxed` | 1.05 gb/s, 0 ulp | 0.721 gb/s, 0 ulp | 0.30 gb/s, 0 ulp |
286
+ | __e3m2__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
287
+ | `nk_dot_e3m2_serial` | 0.565 gb/s, 0 ulp | 0.552 gb/s, 0 ulp | 0.06 gb/s, 0 ulp |
288
+ | `nk_dot_e3m2_v128relaxed` | 0.670 gb/s, 0 ulp | 2.91 gb/s, 0 ulp | 0.24 gb/s, 0 ulp |
289
+ | __e2m3__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
290
+ | `nk_dot_e2m3_serial` | 0.584 gb/s, 0 ulp | 0.661 gb/s, 0 ulp | 0.07 gb/s, 0 ulp |
291
+ | `nk_dot_e2m3_v128relaxed` | 2.69 gb/s, 0 ulp | 0.131 gb/s, 0 ulp | 0.09 gb/s, 0 ulp |
292
+ | __i8__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
293
+ | `nk_dot_i8_serial` | 1.17 gb/s | 1.17 gb/s | 0.29 gb/s |
294
+ | `nk_dot_i8_v128relaxed` | 1.71 gb/s | 0.896 gb/s | 0.24 gb/s |
295
+ | __u8__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
296
+ | `nk_dot_u8_serial` | 1.16 gb/s | 0.658 gb/s | 0.30 gb/s |
297
+ | `nk_dot_u8_v128relaxed` | 0.873 gb/s | 0.997 gb/s | 0.15 gb/s |
298
+ | __i4__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
299
+ | `nk_dot_i4_serial` | 0.217 gb/s | 0.226 gb/s | 0.28 gb/s |
300
+ | `nk_dot_i4_v128relaxed` | 1.53 gb/s | 2.87 gb/s | 0.24 gb/s |
301
+ | __u4__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
302
+ | `nk_dot_u4_serial` | 0.303 gb/s | 0.250 gb/s | 0.003 gb/s |
303
+ | `nk_dot_u4_v128relaxed` | 0.126 gb/s | 2.70 gb/s | 0.08 gb/s |
304
+ | __u1__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
305
+ | `nk_dot_u1_serial` | 1.95 gb/s | 1.53 gb/s | 0.09 gb/s |
306
+ | `nk_dot_u1_v128relaxed` | 0.548 gb/s | 1.88 gb/s | 0.13 gb/s |
307
+
308
+ ### Apple M5
309
+
310
+ #### Native
311
+
312
+ | Kernel | 256 | 1024 | 4096 |
313
+ | :------------------------ | -----------------------: | -----------------------: | -----------------------: |
314
+ | __f64c__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
315
+ | `nk_dot_f64c_serial` | 8.02 gb/s, 5 ulp | 7.30 gb/s, 3 ulp | 7.25 gb/s, 9.7 ulp |
316
+ | `nk_vdot_f64c_serial` | 8.29 gb/s, 4.2 ulp | 7.53 gb/s, 3.3 ulp | 7.38 gb/s, 3.3 ulp |
317
+ | `nk_dot_f64c_neon` | 23.7 gb/s, 0 ulp | 21.6 gb/s, 0 ulp | 21.3 gb/s, 0 ulp |
318
+ | `nk_vdot_f64c_neon` | 23.6 gb/s, 0 ulp | 21.8 gb/s, 0 ulp | 20.9 gb/s, 0 ulp |
319
+ | __f32c__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
320
+ | `nk_dot_f32c_serial` | 27.8 gb/s, 0 ulp | 24.6 gb/s, 0 ulp | 23.2 gb/s, 0 ulp |
321
+ | `nk_vdot_f32c_serial` | 27.2 gb/s, 0 ulp | 24.0 gb/s, 0 ulp | 22.6 gb/s, 0 ulp |
322
+ | `nk_dot_f32c_neon` | 22.8 gb/s, 0 ulp | 18.2 gb/s, 0 ulp | 16.9 gb/s, 0 ulp |
323
+ | `nk_vdot_f32c_neon` | 22.7 gb/s, 0 ulp | 17.5 gb/s, 0 ulp | 16.7 gb/s, 0 ulp |
324
+ | __bf16c__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
325
+ | `nk_dot_bf16c_serial` | 15.6 gb/s, 0.2 ulp | 12.5 gb/s, 2.8 ulp | 12.5 gb/s, 15.8 ulp |
326
+ | `nk_vdot_bf16c_serial` | 15.9 gb/s, 0.2 ulp | 12.9 gb/s, 2.6 ulp | 11.7 gb/s, 11.4 ulp |
327
+ | `nk_dot_bf16c_neonbfdot` | 26.3 gb/s, 0.1 ulp | 18.5 gb/s, 2 ulp | 17.6 gb/s, 8.8 ulp |
328
+ | `nk_vdot_bf16c_neonbfdot` | 26.5 gb/s, 0.1 ulp | 18.2 gb/s, 1.8 ulp | 17.3 gb/s, 8.8 ulp |
329
+ | __f16c__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
330
+ | `nk_dot_f16c_serial` | 15.8 gb/s, 20.8 ulp | 13.0 gb/s, 64.1 ulp | 12.3 gb/s, 73.1 ulp |
331
+ | `nk_vdot_f16c_serial` | 15.8 gb/s, 24.8 ulp | 13.0 gb/s, 31.9 ulp | 12.3 gb/s, 137 ulp |
332
+ | `nk_dot_f16c_neonhalf` | 26.1 gb/s, 3.0 ulp | 18.4 gb/s, 6.5 ulp | 16.8 gb/s, 20.5 ulp |
333
+ | `nk_vdot_f16c_neonhalf` | 26.1 gb/s, 34.9 ulp | 18.5 gb/s, 40.7 ulp | 17.0 gb/s, 73.1 ulp |
334
+ | `nk_dot_f16c_neonfhm` | 25.3 gb/s, 3.0 ulp | 17.1 gb/s, 6.5 ulp | 15.9 gb/s, 20.5 ulp |
335
+ | `nk_vdot_f16c_neonfhm` | 25.0 gb/s, 31.4 ulp | 17.0 gb/s, 38.6 ulp | 15.8 gb/s, 67.6 ulp |
336
+ | __f64__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
337
+ | `nk_dot_f64_serial` | 8.11 gb/s, 2.4 ulp | 8.13 gb/s, 175 ulp | 8.09 gb/s, 2.7 ulp |
338
+ | `nk_dot_f64_neon` | 44.2 gb/s, 0 ulp | 42.3 gb/s, 0 ulp | 38.4 gb/s, 0 ulp |
339
+ | __f32__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
340
+ | `nk_dot_f32_serial` | 23.3 gb/s, 0 ulp | 15.8 gb/s, 0 ulp | 14.6 gb/s, 0 ulp |
341
+ | `nk_dot_f32_neon` | 46.4 gb/s, 0 ulp | 38.0 gb/s, 0 ulp | 34.8 gb/s, 0 ulp |
342
+ | __bf16__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
343
+ | `nk_dot_bf16_serial` | 12.4 gb/s, 0 ulp | 8.59 gb/s, 0.9 ulp | 7.36 gb/s, 6 ulp |
344
+ | `nk_dot_bf16_neon` | 39.0 gb/s, 3.7 ulp | 27.2 gb/s, 3.7 ulp | 19.9 gb/s, 3.7 ulp |
345
+ | `nk_dot_bf16_neonbfdot` | 70.8 gb/s, 0 ulp | 60.8 gb/s, 0.6 ulp | 47.8 gb/s, 4.5 ulp |
346
+ | __f16__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
347
+ | `nk_dot_f16_serial` | 12.0 gb/s, 19 ulp | 8.33 gb/s, 31.1 ulp | 7.11 gb/s, 57.8 ulp |
348
+ | `nk_dot_f16_neon` | 35.7 gb/s, 33.4 ulp | 25.8 gb/s, 37.4 ulp | 21.3 gb/s, 23.1 ulp |
349
+ | `nk_dot_f16_neonfhm` | 48.7 gb/s, 14.9 ulp | 27.5 gb/s, 26.7 ulp | 18.8 gb/s, 39.9 ulp |
350
+ | __e5m2__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
351
+ | `nk_dot_e5m2_serial` | 3.80 gb/s, 0 ulp | 3.41 gb/s, 0 ulp | 3.41 gb/s, 0 ulp |
352
+ | `nk_dot_e5m2_neon` | 19.0 gb/s, 0 ulp | 13.2 gb/s, 0 ulp | 10.5 gb/s, 0 ulp |
353
+ | `nk_dot_e5m2_neonfhm` | 25.6 gb/s, 0 ulp | 15.3 gb/s, 0 ulp | 9.55 gb/s, 0 ulp |
354
+ | `nk_dot_e5m2_neonbfdot` | 3.65 gb/s, 0 ulp | 3.82 gb/s, 0 ulp | 3.68 gb/s, 0 ulp |
355
+ | __e4m3__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
356
+ | `nk_dot_e4m3_serial` | 1.74 gb/s, 0 ulp | 1.72 gb/s, 0 ulp | 1.71 gb/s, 0 ulp |
357
+ | `nk_dot_e4m3_neon` | 4.44 gb/s, 0 ulp | 4.51 gb/s, 0 ulp | 4.57 gb/s, 0 ulp |
358
+ | `nk_dot_e4m3_neonfhm` | 10.1 gb/s, 0 ulp | 8.51 gb/s, 0 ulp | 7.96 gb/s, 0 ulp |
359
+ | `nk_dot_e4m3_neonbfdot` | 3.59 gb/s, 0 ulp | 3.68 gb/s, 0 ulp | 3.64 gb/s, 0 ulp |
360
+ | __e3m2__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
361
+ | `nk_dot_e3m2_serial` | 2.51 gb/s, 0 ulp | 2.33 gb/s, 0 ulp | 2.24 gb/s, 0 ulp |
362
+ | `nk_dot_e3m2_neonsdot` | 20.5 gb/s, 0 ulp | 20.7 gb/s, 0 ulp | 20.1 gb/s, 0 ulp |
363
+ | __e2m3__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
364
+ | `nk_dot_e2m3_serial` | 2.54 gb/s, 0 ulp | 2.27 gb/s, 0 ulp | 2.29 gb/s, 0 ulp |
365
+ | `nk_dot_e2m3_neonsdot` | 47.3 gb/s, 0 ulp | 47.5 gb/s, 0 ulp | 43.4 gb/s, 0 ulp |
366
+ | __i8__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
367
+ | `nk_dot_i8_serial` | 115 gb/s | 102 gb/s | 92.3 gb/s |
368
+ | `nk_dot_i8_neonsdot` | 92.8 gb/s | 87.4 gb/s | 59.9 gb/s |
369
+ | __u8__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
370
+ | `nk_dot_u8_serial` | 110 gb/s | 99.2 gb/s | 94.9 gb/s |
371
+ | `nk_dot_u8_neonsdot` | 92.5 gb/s | 86.6 gb/s | 59.5 gb/s |
372
+ | __i4__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
373
+ | `nk_dot_i4_serial` | 23.0 gb/s | 24.4 gb/s | 24.2 gb/s |
374
+ | `nk_dot_i4_neonsdot` | 58.2 gb/s | 44.7 gb/s | 30.4 gb/s |
375
+ | __u4__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
376
+ | `nk_dot_u4_serial` | 25.3 gb/s | 27.2 gb/s | 26.9 gb/s |
377
+ | `nk_dot_u4_neonsdot` | 67.3 gb/s | 47.4 gb/s | 29.4 gb/s |
378
+ | __u1__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
379
+ | `nk_dot_u1_serial` | 7.01 gb/s | 7.63 gb/s | 7.19 gb/s |
380
+ | `nk_dot_u1_neon` | 33.3 gb/s | 64.6 gb/s | 88.0 gb/s |
381
+
382
+ #### WASM
383
+
384
+ Measured with Wasmtime v43 (Cranelift backend).
385
+
386
+ | Kernel | 256 | 1024 | 4096 |
387
+ | :------------------------- | -----------------------: | -----------------------: | -----------------------: |
388
+ | __f64c__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
389
+ | `nk_dot_f64c_serial` | 4.17 gb/s, 3.8 ulp | 6.03 gb/s, 3.9 ulp | 6.37 gb/s, 3.2 ulp |
390
+ | `nk_vdot_f64c_serial` | 6.00 gb/s, 3.8 ulp | 6.55 gb/s, 3.4 ulp | 6.83 gb/s, 15.1 ulp |
391
+ | `nk_dot_f64c_v128relaxed` | 46.7 gb/s, 26 ulp | 38.2 gb/s, 42 ulp | 40.5 gb/s, 88 ulp |
392
+ | `nk_vdot_f64c_v128relaxed` | 46.1 gb/s, 22.8 ulp | 39.8 gb/s, 37.3 ulp | 39.9 gb/s, 43.6 ulp |
393
+ | __f32c__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
394
+ | `nk_dot_f32c_serial` | 20.9 gb/s, 0 ulp | 21.3 gb/s, 0 ulp | 22.5 gb/s, 0 ulp |
395
+ | `nk_vdot_f32c_serial` | 19.9 gb/s, 0 ulp | 21.5 gb/s, 0 ulp | 22.4 gb/s, 0 ulp |
396
+ | `nk_dot_f32c_v128relaxed` | 22.4 gb/s, 0 ulp | 20.3 gb/s, 0 ulp | 19.8 gb/s, 0 ulp |
397
+ | `nk_vdot_f32c_v128relaxed` | 21.9 gb/s, 0 ulp | 20.3 gb/s, 0 ulp | 19.9 gb/s, 0 ulp |
398
+ | __bf16c__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
399
+ | `nk_dot_bf16c_serial` | 10.3 gb/s, 0.1 ulp | 11.6 gb/s, 2.5 ulp | 11.6 gb/s, 10 ulp |
400
+ | `nk_vdot_bf16c_serial` | 10.7 gb/s, 0.2 ulp | 11.7 gb/s, 2.1 ulp | 11.6 gb/s, 11.4 ulp |
401
+ | __f16c__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
402
+ | `nk_dot_f16c_serial` | 3.76 gb/s, 13 ulp | 3.83 gb/s, 20 ulp | 3.86 gb/s, 90 ulp |
403
+ | `nk_vdot_f16c_serial` | 3.81 gb/s, 13.9 ulp | 3.89 gb/s, 35.5 ulp | 3.85 gb/s, 42.4 ulp |
404
+ | __f64__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
405
+ | `nk_dot_f64_serial` | 7.26 gb/s, 2.4 ulp | 7.45 gb/s, 2.6 ulp | 7.96 gb/s, 2.2 ulp |
406
+ | `nk_dot_f64_v128relaxed` | 38.7 gb/s, 2.6 ulp | 42.0 gb/s, 3.2 ulp | 43.9 gb/s, 2.6 ulp |
407
+ | __f32__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
408
+ | `nk_dot_f32_serial` | 19.0 gb/s, 16 ulp | 14.6 gb/s, 69 ulp | 14.0 gb/s, 104 ulp |
409
+ | `nk_dot_f32_v128relaxed` | 20.4 gb/s, 0 ulp | 18.9 gb/s, 0 ulp | 18.7 gb/s, 0 ulp |
410
+ | __bf16__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
411
+ | `nk_dot_bf16_serial` | 9.53 gb/s, 0 ulp | 7.42 gb/s, 0.6 ulp | 7.20 gb/s, 5.9 ulp |
412
+ | `nk_dot_bf16_v128relaxed` | 41.9 gb/s, 0 ulp | 28.3 gb/s, 0.4 ulp | 21.5 gb/s, 3.7 ulp |
413
+ | __f16__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
414
+ | `nk_dot_f16_serial` | 3.31 gb/s, 16 ulp | 3.63 gb/s, 26 ulp | 3.66 gb/s, 53 ulp |
415
+ | `nk_dot_f16_v128relaxed` | 11.4 gb/s, 9.0 ulp | 11.2 gb/s, 23 ulp | 12.0 gb/s, 39 ulp |
416
+ | __e5m2__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
417
+ | `nk_dot_e5m2_serial` | 3.02 gb/s, 0 ulp | 2.95 gb/s, 0 ulp | 3.16 gb/s, 0 ulp |
418
+ | `nk_dot_e5m2_v128relaxed` | 3.47 gb/s, 0 ulp | 3.45 gb/s, 0 ulp | 3.48 gb/s, 0 ulp |
419
+ | __e4m3__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
420
+ | `nk_dot_e4m3_serial` | 0.978 gb/s, 0 ulp | 0.893 gb/s, 0 ulp | 0.936 gb/s, 0 ulp |
421
+ | `nk_dot_e4m3_v128relaxed` | 2.78 gb/s, 0 ulp | 2.75 gb/s, 0 ulp | 2.78 gb/s, 0 ulp |
422
+ | __e3m2__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
423
+ | `nk_dot_e3m2_serial` | 3.13 gb/s, 0 ulp | 2.95 gb/s, 0 ulp | 3.16 gb/s, 0 ulp |
424
+ | `nk_dot_e3m2_v128relaxed` | 12.1 gb/s, 0 ulp | 11.9 gb/s, 0 ulp | 12.6 gb/s, 0 ulp |
425
+ | __e2m3__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
426
+ | `nk_dot_e2m3_serial` | 2.99 gb/s, 0 ulp | 3.00 gb/s, 0 ulp | 3.17 gb/s, 0 ulp |
427
+ | `nk_dot_e2m3_v128relaxed` | 20.4 gb/s, 0 ulp | 20.6 gb/s, 0 ulp | 21.7 gb/s, 0 ulp |
428
+ | __i8__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
429
+ | `nk_dot_i8_serial` | 22.2 gb/s | 19.6 gb/s | 17.8 gb/s |
430
+ | `nk_dot_i8_v128relaxed` | 42.0 gb/s | 49.0 gb/s | 49.7 gb/s |
431
+ | __u8__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
432
+ | `nk_dot_u8_serial` | 23.0 gb/s | 19.9 gb/s | 17.8 gb/s |
433
+ | `nk_dot_u8_v128relaxed` | 29.3 gb/s | 33.0 gb/s | 35.1 gb/s |
434
+ | __i4__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
435
+ | `nk_dot_i4_serial` | 0.990 gb/s | 0.923 gb/s | 0.985 gb/s |
436
+ | `nk_dot_i4_v128relaxed` | 15.2 gb/s | 17.9 gb/s | 19.2 gb/s |
437
+ | __u4__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
438
+ | `nk_dot_u4_serial` | 0.992 gb/s | 0.933 gb/s | 0.988 gb/s |
439
+ | `nk_dot_u4_v128relaxed` | 30.2 gb/s | 32.1 gb/s | 33.8 gb/s |
440
+ | __u1__ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ | ░░░░░░░░░░░░░░░░░░░░░░░░ |
441
+ | `nk_dot_u1_serial` | 5.26 gb/s | 5.80 gb/s | 6.48 gb/s |
442
+ | `nk_dot_u1_v128relaxed` | 21.2 gb/s | 47.4 gb/s | 67.3 gb/s |