usearch 2.21.4 → 2.25.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -69
- package/binding.gyp +15 -37
- package/c/CMakeLists.txt +4 -5
- package/c/README.md +8 -8
- package/c/lib.cpp +32 -14
- package/c/test.c +124 -1
- package/c/usearch.h +24 -3
- package/cpp/CMakeLists.txt +4 -0
- package/cpp/README.md +5 -5
- package/cpp/bench.cpp +97 -116
- package/cpp/test.cpp +117 -20
- package/include/usearch/index.hpp +224 -48
- package/include/usearch/index_dense.hpp +105 -40
- package/include/usearch/index_plugins.hpp +1387 -204
- package/javascript/README.md +1 -1
- package/javascript/dist/cjs/usearch.d.ts +8 -3
- package/javascript/dist/cjs/usearch.js +12 -4
- package/javascript/dist/esm/usearch.d.ts +8 -3
- package/javascript/dist/esm/usearch.js +12 -4
- package/javascript/lib.cpp +17 -0
- package/javascript/usearch.test.js +117 -94
- package/javascript/usearch.ts +14 -6
- package/numkong/.clang-tidy +30 -0
- package/{simsimd → numkong}/.cmake-format.py +18 -0
- package/numkong/.editorconfig +12 -0
- package/numkong/.git-blame-ignore-revs +123 -0
- package/numkong/.mailmap +15 -0
- package/numkong/.spi.yml +11 -0
- package/numkong/.swift-format +14 -0
- package/numkong/CITATION.cff +81 -0
- package/numkong/CONTRIBUTING.md +500 -0
- package/numkong/Cargo.toml +54 -0
- package/numkong/MANIFEST.in +8 -0
- package/numkong/Package.swift +84 -0
- package/numkong/README.md +569 -0
- package/numkong/bench/README.md +217 -0
- package/numkong/bench/bench-browser.html +323 -0
- package/numkong/bench/bench.cpp +344 -0
- package/numkong/bench/bench.hpp +816 -0
- package/numkong/bench/bench.js +148 -0
- package/numkong/bench/bench.mjs +616 -0
- package/numkong/bench/bench_attention.cpp +113 -0
- package/numkong/bench/bench_cast.cpp +264 -0
- package/numkong/bench/bench_cross_amx.cpp +62 -0
- package/numkong/bench/bench_cross_arm.cpp +245 -0
- package/numkong/bench/bench_cross_blas.cpp +309 -0
- package/numkong/bench/bench_cross_loongarch.cpp +106 -0
- package/numkong/bench/bench_cross_power.cpp +84 -0
- package/numkong/bench/bench_cross_rvv.cpp +121 -0
- package/numkong/bench/bench_cross_serial.cpp +151 -0
- package/numkong/bench/bench_cross_sme.cpp +163 -0
- package/numkong/bench/bench_cross_wasm.cpp +142 -0
- package/numkong/bench/bench_cross_x86.cpp +455 -0
- package/numkong/bench/bench_curved.cpp +210 -0
- package/numkong/bench/bench_dot.cpp +315 -0
- package/numkong/bench/bench_each.cpp +503 -0
- package/numkong/bench/bench_geospatial.cpp +112 -0
- package/numkong/bench/bench_maxsim.cpp +154 -0
- package/numkong/bench/bench_mesh.cpp +148 -0
- package/numkong/bench/bench_probability.cpp +60 -0
- package/numkong/bench/bench_reduce.cpp +371 -0
- package/numkong/bench/bench_set.cpp +73 -0
- package/numkong/bench/bench_sparse.cpp +198 -0
- package/numkong/bench/bench_spatial.cpp +347 -0
- package/numkong/bench/bench_trigonometry.cpp +137 -0
- package/numkong/bench/swift/Bench.swift +506 -0
- package/numkong/binding.gyp +169 -0
- package/numkong/build.rs +484 -0
- package/numkong/c/dispatch.h +512 -0
- package/numkong/c/dispatch_bf16.c +447 -0
- package/numkong/c/dispatch_bf16c.c +52 -0
- package/numkong/c/dispatch_e2m3.c +296 -0
- package/numkong/c/dispatch_e3m2.c +284 -0
- package/numkong/c/dispatch_e4m3.c +318 -0
- package/numkong/c/dispatch_e5m2.c +316 -0
- package/numkong/c/dispatch_f16.c +452 -0
- package/numkong/c/dispatch_f16c.c +58 -0
- package/numkong/c/dispatch_f32.c +434 -0
- package/numkong/c/dispatch_f32c.c +99 -0
- package/numkong/c/dispatch_f64.c +348 -0
- package/numkong/c/dispatch_f64c.c +98 -0
- package/numkong/c/dispatch_i16.c +96 -0
- package/numkong/c/dispatch_i32.c +89 -0
- package/numkong/c/dispatch_i4.c +153 -0
- package/numkong/c/dispatch_i64.c +86 -0
- package/numkong/c/dispatch_i8.c +348 -0
- package/numkong/c/dispatch_other.c +348 -0
- package/numkong/c/dispatch_u1.c +193 -0
- package/numkong/c/dispatch_u16.c +124 -0
- package/numkong/c/dispatch_u32.c +118 -0
- package/numkong/c/dispatch_u4.c +153 -0
- package/numkong/c/dispatch_u64.c +102 -0
- package/numkong/c/dispatch_u8.c +364 -0
- package/numkong/c/numkong.c +940 -0
- package/numkong/cmake/nk_arm_isa_probes.cmake +61 -0
- package/numkong/cmake/nk_isa_probe.cmake +90 -0
- package/numkong/cmake/nk_loongarch_isa_probes.cmake +15 -0
- package/numkong/cmake/nk_math_lib.cmake +46 -0
- package/numkong/cmake/nk_power_isa_probes.cmake +15 -0
- package/numkong/cmake/nk_riscv_isa_probes.cmake +19 -0
- package/numkong/cmake/nk_x86_isa_probes.cmake +35 -0
- package/numkong/cmake/toolchain-aarch64-gnu.cmake +86 -0
- package/numkong/cmake/toolchain-android-arm64.cmake +25 -0
- package/numkong/cmake/toolchain-android-armv7.cmake +25 -0
- package/numkong/cmake/toolchain-loongarch64-gnu.cmake +68 -0
- package/numkong/cmake/toolchain-ppc64le-gnu.cmake +74 -0
- package/numkong/cmake/toolchain-riscv64-gnu.cmake +107 -0
- package/numkong/cmake/toolchain-riscv64-llvm.cmake +114 -0
- package/numkong/cmake/toolchain-wasi.cmake +77 -0
- package/numkong/cmake/toolchain-wasm.cmake +70 -0
- package/numkong/cmake/toolchain-wasm64.cmake +62 -0
- package/numkong/cmake/toolchain-x86_64-llvm.cmake +47 -0
- package/numkong/include/README.md +643 -0
- package/numkong/include/module.modulemap +129 -0
- package/numkong/include/numkong/attention/sapphireamx.h +1363 -0
- package/numkong/include/numkong/attention/sme.h +2075 -0
- package/numkong/include/numkong/attention.h +49 -0
- package/numkong/include/numkong/capabilities.h +930 -0
- package/numkong/include/numkong/cast/README.md +262 -0
- package/numkong/include/numkong/cast/diamond.h +64 -0
- package/numkong/include/numkong/cast/haswell.h +823 -0
- package/numkong/include/numkong/cast/icelake.h +475 -0
- package/numkong/include/numkong/cast/loongsonasx.h +252 -0
- package/numkong/include/numkong/cast/neon.h +1174 -0
- package/numkong/include/numkong/cast/powervsx.h +449 -0
- package/numkong/include/numkong/cast/rvv.h +970 -0
- package/numkong/include/numkong/cast/sapphire.h +262 -0
- package/numkong/include/numkong/cast/serial.h +2336 -0
- package/numkong/include/numkong/cast/skylake.h +915 -0
- package/numkong/include/numkong/cast/v128relaxed.h +537 -0
- package/numkong/include/numkong/cast.h +254 -0
- package/numkong/include/numkong/cast.hpp +44 -0
- package/numkong/include/numkong/curved/README.md +223 -0
- package/numkong/include/numkong/curved/genoa.h +182 -0
- package/numkong/include/numkong/curved/haswell.h +276 -0
- package/numkong/include/numkong/curved/neon.h +329 -0
- package/numkong/include/numkong/curved/neonbfdot.h +211 -0
- package/numkong/include/numkong/curved/rvv.h +305 -0
- package/numkong/include/numkong/curved/serial.h +207 -0
- package/numkong/include/numkong/curved/skylake.h +457 -0
- package/numkong/include/numkong/curved/smef64.h +530 -0
- package/numkong/include/numkong/curved.h +513 -0
- package/numkong/include/numkong/curved.hpp +144 -0
- package/numkong/include/numkong/dot/README.md +442 -0
- package/numkong/include/numkong/dot/alder.h +563 -0
- package/numkong/include/numkong/dot/diamond.h +158 -0
- package/numkong/include/numkong/dot/genoa.h +289 -0
- package/numkong/include/numkong/dot/haswell.h +1723 -0
- package/numkong/include/numkong/dot/icelake.h +997 -0
- package/numkong/include/numkong/dot/loongsonasx.h +671 -0
- package/numkong/include/numkong/dot/neon.h +869 -0
- package/numkong/include/numkong/dot/neonbfdot.h +243 -0
- package/numkong/include/numkong/dot/neonfhm.h +358 -0
- package/numkong/include/numkong/dot/neonfp8.h +323 -0
- package/numkong/include/numkong/dot/neonsdot.h +622 -0
- package/numkong/include/numkong/dot/powervsx.h +752 -0
- package/numkong/include/numkong/dot/rvv.h +722 -0
- package/numkong/include/numkong/dot/rvvbb.h +72 -0
- package/numkong/include/numkong/dot/rvvbf16.h +123 -0
- package/numkong/include/numkong/dot/rvvhalf.h +129 -0
- package/numkong/include/numkong/dot/sapphire.h +141 -0
- package/numkong/include/numkong/dot/serial.h +874 -0
- package/numkong/include/numkong/dot/sierra.h +405 -0
- package/numkong/include/numkong/dot/skylake.h +1116 -0
- package/numkong/include/numkong/dot/sve.h +420 -0
- package/numkong/include/numkong/dot/svebfdot.h +75 -0
- package/numkong/include/numkong/dot/svehalf.h +168 -0
- package/numkong/include/numkong/dot/svesdot.h +90 -0
- package/numkong/include/numkong/dot/v128relaxed.h +1293 -0
- package/numkong/include/numkong/dot.h +1136 -0
- package/numkong/include/numkong/dot.hpp +94 -0
- package/numkong/include/numkong/dots/README.md +496 -0
- package/numkong/include/numkong/dots/alder.h +117 -0
- package/numkong/include/numkong/dots/diamond.h +86 -0
- package/numkong/include/numkong/dots/genoa.h +100 -0
- package/numkong/include/numkong/dots/graniteamx.h +733 -0
- package/numkong/include/numkong/dots/haswell.h +310 -0
- package/numkong/include/numkong/dots/icelake.h +180 -0
- package/numkong/include/numkong/dots/loongsonasx.h +176 -0
- package/numkong/include/numkong/dots/neon.h +123 -0
- package/numkong/include/numkong/dots/neonbfdot.h +59 -0
- package/numkong/include/numkong/dots/neonfhm.h +96 -0
- package/numkong/include/numkong/dots/neonfp8.h +99 -0
- package/numkong/include/numkong/dots/neonsdot.h +144 -0
- package/numkong/include/numkong/dots/powervsx.h +194 -0
- package/numkong/include/numkong/dots/rvv.h +2593 -0
- package/numkong/include/numkong/dots/sapphireamx.h +4017 -0
- package/numkong/include/numkong/dots/serial.h +2867 -0
- package/numkong/include/numkong/dots/sierra.h +100 -0
- package/numkong/include/numkong/dots/skylake.h +207 -0
- package/numkong/include/numkong/dots/sme.h +5041 -0
- package/numkong/include/numkong/dots/smebi32.h +477 -0
- package/numkong/include/numkong/dots/smef64.h +1328 -0
- package/numkong/include/numkong/dots/smehalf.h +47 -0
- package/numkong/include/numkong/dots/v128relaxed.h +317 -0
- package/numkong/include/numkong/dots.h +3110 -0
- package/numkong/include/numkong/dots.hpp +641 -0
- package/numkong/include/numkong/each/README.md +465 -0
- package/numkong/include/numkong/each/haswell.h +1658 -0
- package/numkong/include/numkong/each/icelake.h +272 -0
- package/numkong/include/numkong/each/neon.h +1138 -0
- package/numkong/include/numkong/each/neonbfdot.h +211 -0
- package/numkong/include/numkong/each/neonhalf.h +318 -0
- package/numkong/include/numkong/each/rvv.h +1121 -0
- package/numkong/include/numkong/each/sapphire.h +343 -0
- package/numkong/include/numkong/each/serial.h +282 -0
- package/numkong/include/numkong/each/skylake.h +1562 -0
- package/numkong/include/numkong/each/v128relaxed.h +562 -0
- package/numkong/include/numkong/each.h +2232 -0
- package/numkong/include/numkong/each.hpp +434 -0
- package/numkong/include/numkong/geospatial/README.md +147 -0
- package/numkong/include/numkong/geospatial/haswell.h +633 -0
- package/numkong/include/numkong/geospatial/neon.h +615 -0
- package/numkong/include/numkong/geospatial/rvv.h +701 -0
- package/numkong/include/numkong/geospatial/serial.h +309 -0
- package/numkong/include/numkong/geospatial/skylake.h +613 -0
- package/numkong/include/numkong/geospatial/v128relaxed.h +652 -0
- package/numkong/include/numkong/geospatial.h +453 -0
- package/numkong/include/numkong/geospatial.hpp +235 -0
- package/numkong/include/numkong/matrix.hpp +336 -0
- package/numkong/include/numkong/maxsim/README.md +187 -0
- package/numkong/include/numkong/maxsim/alder.h +511 -0
- package/numkong/include/numkong/maxsim/genoa.h +115 -0
- package/numkong/include/numkong/maxsim/haswell.h +553 -0
- package/numkong/include/numkong/maxsim/icelake.h +480 -0
- package/numkong/include/numkong/maxsim/neonsdot.h +394 -0
- package/numkong/include/numkong/maxsim/sapphireamx.h +877 -0
- package/numkong/include/numkong/maxsim/serial.h +490 -0
- package/numkong/include/numkong/maxsim/sme.h +993 -0
- package/numkong/include/numkong/maxsim/v128relaxed.h +280 -0
- package/numkong/include/numkong/maxsim.h +571 -0
- package/numkong/include/numkong/maxsim.hpp +133 -0
- package/numkong/include/numkong/mesh/README.md +219 -0
- package/numkong/include/numkong/mesh/haswell.h +2013 -0
- package/numkong/include/numkong/mesh/neon.h +1821 -0
- package/numkong/include/numkong/mesh/neonbfdot.h +771 -0
- package/numkong/include/numkong/mesh/rvv.h +936 -0
- package/numkong/include/numkong/mesh/serial.h +721 -0
- package/numkong/include/numkong/mesh/skylake.h +2344 -0
- package/numkong/include/numkong/mesh/v128relaxed.h +1081 -0
- package/numkong/include/numkong/mesh.h +666 -0
- package/numkong/include/numkong/mesh.hpp +701 -0
- package/numkong/include/numkong/numkong.h +78 -0
- package/numkong/include/numkong/numkong.hpp +58 -0
- package/numkong/include/numkong/probability/README.md +177 -0
- package/numkong/include/numkong/probability/haswell.h +267 -0
- package/numkong/include/numkong/probability/neon.h +255 -0
- package/numkong/include/numkong/probability/rvv.h +414 -0
- package/numkong/include/numkong/probability/serial.h +181 -0
- package/numkong/include/numkong/probability/skylake.h +324 -0
- package/numkong/include/numkong/probability.h +380 -0
- package/numkong/include/numkong/probability.hpp +120 -0
- package/numkong/include/numkong/random.h +50 -0
- package/numkong/include/numkong/random.hpp +285 -0
- package/numkong/include/numkong/reduce/README.md +552 -0
- package/numkong/include/numkong/reduce/alder.h +636 -0
- package/numkong/include/numkong/reduce/genoa.h +201 -0
- package/numkong/include/numkong/reduce/haswell.h +3785 -0
- package/numkong/include/numkong/reduce/icelake.h +549 -0
- package/numkong/include/numkong/reduce/neon.h +3980 -0
- package/numkong/include/numkong/reduce/neonbfdot.h +142 -0
- package/numkong/include/numkong/reduce/neonfhm.h +293 -0
- package/numkong/include/numkong/reduce/neonsdot.h +357 -0
- package/numkong/include/numkong/reduce/rvv.h +3533 -0
- package/numkong/include/numkong/reduce/serial.h +753 -0
- package/numkong/include/numkong/reduce/sierra.h +338 -0
- package/numkong/include/numkong/reduce/skylake.h +3794 -0
- package/numkong/include/numkong/reduce/sve.h +52 -0
- package/numkong/include/numkong/reduce/v128relaxed.h +2302 -0
- package/numkong/include/numkong/reduce.h +1582 -0
- package/numkong/include/numkong/reduce.hpp +778 -0
- package/numkong/include/numkong/scalar/README.md +89 -0
- package/numkong/include/numkong/scalar/haswell.h +122 -0
- package/numkong/include/numkong/scalar/loongsonasx.h +74 -0
- package/numkong/include/numkong/scalar/neon.h +122 -0
- package/numkong/include/numkong/scalar/neonhalf.h +70 -0
- package/numkong/include/numkong/scalar/powervsx.h +96 -0
- package/numkong/include/numkong/scalar/rvv.h +211 -0
- package/numkong/include/numkong/scalar/sapphire.h +74 -0
- package/numkong/include/numkong/scalar/serial.h +332 -0
- package/numkong/include/numkong/scalar/v128relaxed.h +56 -0
- package/numkong/include/numkong/scalar.h +696 -0
- package/numkong/include/numkong/set/README.md +179 -0
- package/numkong/include/numkong/set/haswell.h +334 -0
- package/numkong/include/numkong/set/icelake.h +485 -0
- package/numkong/include/numkong/set/loongsonasx.h +181 -0
- package/numkong/include/numkong/set/neon.h +363 -0
- package/numkong/include/numkong/set/powervsx.h +326 -0
- package/numkong/include/numkong/set/rvv.h +226 -0
- package/numkong/include/numkong/set/rvvbb.h +117 -0
- package/numkong/include/numkong/set/serial.h +174 -0
- package/numkong/include/numkong/set/sve.h +187 -0
- package/numkong/include/numkong/set/v128relaxed.h +240 -0
- package/numkong/include/numkong/set.h +471 -0
- package/numkong/include/numkong/set.hpp +114 -0
- package/numkong/include/numkong/sets/README.md +149 -0
- package/numkong/include/numkong/sets/haswell.h +63 -0
- package/numkong/include/numkong/sets/icelake.h +66 -0
- package/numkong/include/numkong/sets/loongsonasx.h +52 -0
- package/numkong/include/numkong/sets/neon.h +61 -0
- package/numkong/include/numkong/sets/powervsx.h +65 -0
- package/numkong/include/numkong/sets/serial.h +43 -0
- package/numkong/include/numkong/sets/smebi32.h +1135 -0
- package/numkong/include/numkong/sets/v128relaxed.h +58 -0
- package/numkong/include/numkong/sets.h +382 -0
- package/numkong/include/numkong/sparse/README.md +156 -0
- package/numkong/include/numkong/sparse/icelake.h +463 -0
- package/numkong/include/numkong/sparse/neon.h +288 -0
- package/numkong/include/numkong/sparse/serial.h +117 -0
- package/numkong/include/numkong/sparse/sve2.h +504 -0
- package/numkong/include/numkong/sparse/turin.h +322 -0
- package/numkong/include/numkong/sparse.h +363 -0
- package/numkong/include/numkong/sparse.hpp +113 -0
- package/numkong/include/numkong/spatial/README.md +439 -0
- package/numkong/include/numkong/spatial/alder.h +604 -0
- package/numkong/include/numkong/spatial/diamond.h +240 -0
- package/numkong/include/numkong/spatial/genoa.h +222 -0
- package/numkong/include/numkong/spatial/haswell.h +979 -0
- package/numkong/include/numkong/spatial/icelake.h +1067 -0
- package/numkong/include/numkong/spatial/loongsonasx.h +483 -0
- package/numkong/include/numkong/spatial/neon.h +846 -0
- package/numkong/include/numkong/spatial/neonbfdot.h +164 -0
- package/numkong/include/numkong/spatial/neonfp8.h +258 -0
- package/numkong/include/numkong/spatial/neonsdot.h +429 -0
- package/numkong/include/numkong/spatial/powervsx.h +738 -0
- package/numkong/include/numkong/spatial/rvv.h +991 -0
- package/numkong/include/numkong/spatial/rvvbf16.h +128 -0
- package/numkong/include/numkong/spatial/rvvhalf.h +120 -0
- package/numkong/include/numkong/spatial/serial.h +347 -0
- package/numkong/include/numkong/spatial/sierra.h +516 -0
- package/numkong/include/numkong/spatial/skylake.h +605 -0
- package/numkong/include/numkong/spatial/sve.h +246 -0
- package/numkong/include/numkong/spatial/svebfdot.h +125 -0
- package/numkong/include/numkong/spatial/svehalf.h +136 -0
- package/numkong/include/numkong/spatial/svesdot.h +143 -0
- package/numkong/include/numkong/spatial/v128relaxed.h +969 -0
- package/numkong/include/numkong/spatial.h +1681 -0
- package/numkong/include/numkong/spatial.hpp +183 -0
- package/numkong/include/numkong/spatials/README.md +580 -0
- package/numkong/include/numkong/spatials/alder.h +94 -0
- package/numkong/include/numkong/spatials/diamond.h +82 -0
- package/numkong/include/numkong/spatials/genoa.h +94 -0
- package/numkong/include/numkong/spatials/graniteamx.h +173 -0
- package/numkong/include/numkong/spatials/haswell.h +219 -0
- package/numkong/include/numkong/spatials/icelake.h +113 -0
- package/numkong/include/numkong/spatials/loongsonasx.h +153 -0
- package/numkong/include/numkong/spatials/neon.h +109 -0
- package/numkong/include/numkong/spatials/neonbfdot.h +60 -0
- package/numkong/include/numkong/spatials/neonfhm.h +92 -0
- package/numkong/include/numkong/spatials/neonfp8.h +111 -0
- package/numkong/include/numkong/spatials/neonsdot.h +143 -0
- package/numkong/include/numkong/spatials/powervsx.h +153 -0
- package/numkong/include/numkong/spatials/rvv.h +1976 -0
- package/numkong/include/numkong/spatials/sapphireamx.h +1149 -0
- package/numkong/include/numkong/spatials/serial.h +248 -0
- package/numkong/include/numkong/spatials/sierra.h +96 -0
- package/numkong/include/numkong/spatials/skylake.h +184 -0
- package/numkong/include/numkong/spatials/sme.h +1927 -0
- package/numkong/include/numkong/spatials/smef64.h +483 -0
- package/numkong/include/numkong/spatials/v128relaxed.h +240 -0
- package/numkong/include/numkong/spatials.h +3374 -0
- package/numkong/include/numkong/spatials.hpp +509 -0
- package/numkong/include/numkong/tensor.hpp +1981 -0
- package/numkong/include/numkong/trigonometry/README.md +184 -0
- package/numkong/include/numkong/trigonometry/haswell.h +653 -0
- package/numkong/include/numkong/trigonometry/neon.h +638 -0
- package/numkong/include/numkong/trigonometry/rvv.h +700 -0
- package/numkong/include/numkong/trigonometry/serial.h +703 -0
- package/numkong/include/numkong/trigonometry/skylake.h +725 -0
- package/numkong/include/numkong/trigonometry/v128relaxed.h +667 -0
- package/numkong/include/numkong/trigonometry.h +467 -0
- package/numkong/include/numkong/trigonometry.hpp +166 -0
- package/numkong/include/numkong/types.h +1695 -0
- package/numkong/include/numkong/types.hpp +6027 -0
- package/numkong/include/numkong/vector.hpp +766 -0
- package/numkong/javascript/@numkong-darwin-arm64/package.json +26 -0
- package/numkong/javascript/@numkong-darwin-x64/package.json +26 -0
- package/numkong/javascript/@numkong-linux-arm64/package.json +25 -0
- package/numkong/javascript/@numkong-linux-x64/package.json +25 -0
- package/numkong/javascript/@numkong-win32-arm64/package.json +25 -0
- package/numkong/javascript/@numkong-win32-x64/package.json +25 -0
- package/numkong/javascript/README.md +254 -0
- package/numkong/javascript/node-gyp-build.d.ts +4 -0
- package/numkong/javascript/numkong-browser.ts +40 -0
- package/numkong/javascript/numkong-wasm.ts +750 -0
- package/numkong/javascript/numkong.c +712 -0
- package/numkong/javascript/numkong.ts +613 -0
- package/{simsimd → numkong}/javascript/tsconfig-base.json +6 -3
- package/numkong/javascript/tsconfig-cjs.json +13 -0
- package/{simsimd → numkong}/javascript/tsconfig-esm.json +1 -1
- package/numkong/javascript/types.ts +784 -0
- package/numkong/numkong.gypi +104 -0
- package/numkong/package.json +108 -0
- package/numkong/probes/arm_neon.c +8 -0
- package/numkong/probes/arm_neon_bfdot.c +9 -0
- package/numkong/probes/arm_neon_fhm.c +9 -0
- package/numkong/probes/arm_neon_half.c +8 -0
- package/numkong/probes/arm_neon_sdot.c +9 -0
- package/numkong/probes/arm_neonfp8.c +9 -0
- package/numkong/probes/arm_sme.c +16 -0
- package/numkong/probes/arm_sme2.c +16 -0
- package/numkong/probes/arm_sme2p1.c +16 -0
- package/numkong/probes/arm_sme_bf16.c +16 -0
- package/numkong/probes/arm_sme_bi32.c +16 -0
- package/numkong/probes/arm_sme_f64.c +16 -0
- package/numkong/probes/arm_sme_fa64.c +14 -0
- package/numkong/probes/arm_sme_half.c +16 -0
- package/numkong/probes/arm_sme_lut2.c +15 -0
- package/numkong/probes/arm_sve.c +18 -0
- package/numkong/probes/arm_sve2.c +20 -0
- package/numkong/probes/arm_sve2p1.c +18 -0
- package/numkong/probes/arm_sve_bfdot.c +20 -0
- package/numkong/probes/arm_sve_half.c +18 -0
- package/numkong/probes/arm_sve_sdot.c +21 -0
- package/numkong/probes/loongarch_lasx.c +12 -0
- package/numkong/probes/power_vsx.c +12 -0
- package/numkong/probes/probe.js +127 -0
- package/numkong/probes/riscv_rvv.c +14 -0
- package/numkong/probes/riscv_rvv_bb.c +15 -0
- package/numkong/probes/riscv_rvv_bf16.c +17 -0
- package/numkong/probes/riscv_rvv_half.c +14 -0
- package/numkong/probes/wasm_v128relaxed.c +11 -0
- package/numkong/probes/x86_alder.c +17 -0
- package/numkong/probes/x86_diamond.c +17 -0
- package/numkong/probes/x86_genoa.c +17 -0
- package/numkong/probes/x86_graniteamx.c +19 -0
- package/numkong/probes/x86_haswell.c +11 -0
- package/numkong/probes/x86_icelake.c +17 -0
- package/numkong/probes/x86_sapphire.c +16 -0
- package/numkong/probes/x86_sapphireamx.c +18 -0
- package/numkong/probes/x86_sierra.c +17 -0
- package/numkong/probes/x86_skylake.c +15 -0
- package/numkong/probes/x86_turin.c +17 -0
- package/numkong/rust/README.md +698 -0
- package/numkong/rust/capabilities.rs +96 -0
- package/numkong/rust/cast.rs +314 -0
- package/numkong/rust/curved.rs +391 -0
- package/numkong/rust/each.rs +2721 -0
- package/numkong/rust/geospatial.rs +343 -0
- package/numkong/rust/matrix.rs +5424 -0
- package/numkong/rust/maxsim.rs +540 -0
- package/numkong/rust/mesh.rs +837 -0
- package/numkong/rust/numkong.rs +409 -0
- package/numkong/rust/probability.rs +272 -0
- package/numkong/rust/reduce.rs +1249 -0
- package/numkong/rust/set.rs +194 -0
- package/numkong/rust/sparse.rs +513 -0
- package/numkong/rust/spatial.rs +1815 -0
- package/numkong/rust/tensor.rs +7565 -0
- package/numkong/rust/types.rs +3666 -0
- package/numkong/rust/vector.rs +1899 -0
- package/numkong/rustfmt.toml +2 -0
- package/numkong/swift/Matrix.swift +1388 -0
- package/numkong/swift/MaxSim.swift +151 -0
- package/numkong/swift/NumKong.swift +283 -0
- package/numkong/swift/Numerics.swift +329 -0
- package/numkong/swift/README.md +433 -0
- package/numkong/swift/Scalar.swift +741 -0
- package/numkong/swift/Tensor.swift +209 -0
- package/numkong/test/README.md +315 -0
- package/numkong/test/playwright.config.ts +16 -0
- package/numkong/test/swift/Test.swift +534 -0
- package/numkong/test/test-browser-bundle-runner.mjs +36 -0
- package/numkong/test/test-browser-bundle.html +188 -0
- package/numkong/test/test-browser-runner.mjs +43 -0
- package/numkong/test/test-browser.html +305 -0
- package/numkong/test/test-dtypes.mjs +453 -0
- package/numkong/test/test-wasm.mjs +267 -0
- package/numkong/test/test.cpp +442 -0
- package/numkong/test/test.hpp +580 -0
- package/numkong/test/test.mjs +363 -0
- package/numkong/test/test_base.py +1041 -0
- package/numkong/test/test_cast.cpp +242 -0
- package/numkong/test/test_cross.hpp +551 -0
- package/numkong/test/test_cross.py +467 -0
- package/numkong/test/test_cross_amx.cpp +50 -0
- package/numkong/test/test_cross_arm.cpp +225 -0
- package/numkong/test/test_cross_blas.cpp +354 -0
- package/numkong/test/test_cross_loongarch.cpp +90 -0
- package/numkong/test/test_cross_power.cpp +73 -0
- package/numkong/test/test_cross_rvv.cpp +109 -0
- package/numkong/test/test_cross_serial.cpp +181 -0
- package/numkong/test/test_cross_sme.cpp +148 -0
- package/numkong/test/test_cross_wasm.cpp +141 -0
- package/numkong/test/test_cross_x86.cpp +442 -0
- package/numkong/test/test_curved.cpp +182 -0
- package/numkong/test/test_curved.py +207 -0
- package/numkong/test/test_dot.cpp +353 -0
- package/numkong/test/test_dot.py +296 -0
- package/numkong/test/test_each.cpp +437 -0
- package/numkong/test/test_each.py +756 -0
- package/numkong/test/test_geospatial.cpp +155 -0
- package/numkong/test/test_geospatial.py +241 -0
- package/numkong/test/test_maxsim.cpp +138 -0
- package/numkong/test/test_maxsim.py +209 -0
- package/numkong/test/test_mesh.cpp +203 -0
- package/numkong/test/test_mesh.py +394 -0
- package/numkong/test/test_probability.cpp +136 -0
- package/numkong/test/test_probability.py +166 -0
- package/numkong/test/test_reduce.cpp +563 -0
- package/numkong/test/test_reduce.py +781 -0
- package/numkong/test/test_set.cpp +151 -0
- package/numkong/test/test_set.py +120 -0
- package/numkong/test/test_similarities.py +579 -0
- package/numkong/test/test_sparse.cpp +121 -0
- package/numkong/test/test_sparse.py +118 -0
- package/numkong/test/test_spatial.cpp +518 -0
- package/numkong/test/test_spatial.py +269 -0
- package/numkong/test/test_tensor.cpp +884 -0
- package/numkong/test/test_tensor.py +1417 -0
- package/numkong/test/test_trigonometry.cpp +156 -0
- package/numkong/test/test_trigonometry.py +180 -0
- package/package.json +7 -8
- package/prebuilds/darwin-arm64+x64/usearch.node +0 -0
- package/prebuilds/linux-arm64/usearch.node +0 -0
- package/prebuilds/linux-x64/usearch.node +0 -0
- package/fp16/CMakeLists.txt +0 -176
- package/fp16/LICENSE +0 -11
- package/fp16/README.md +0 -20
- package/fp16/bench/alt-element.cc +0 -89
- package/fp16/bench/from-alt-array.cc +0 -175
- package/fp16/bench/from-ieee-array.cc +0 -399
- package/fp16/bench/ieee-element.cc +0 -272
- package/fp16/bench/to-alt-array.cc +0 -91
- package/fp16/bench/to-ieee-array.cc +0 -303
- package/fp16/cmake/DownloadGoogleBenchmark.cmake +0 -15
- package/fp16/cmake/DownloadGoogleTest.cmake +0 -15
- package/fp16/cmake/DownloadPSimd.cmake +0 -15
- package/fp16/configure.py +0 -65
- package/fp16/confu.yaml +0 -8
- package/fp16/include/fp16/__init__.py +0 -0
- package/fp16/include/fp16/avx.py +0 -50
- package/fp16/include/fp16/avx2.py +0 -53
- package/fp16/include/fp16/bitcasts.h +0 -92
- package/fp16/include/fp16/fp16.h +0 -451
- package/fp16/include/fp16/psimd.h +0 -131
- package/fp16/include/fp16.h +0 -11
- package/fp16/jni/Android.mk +0 -6
- package/fp16/jni/Application.mk +0 -4
- package/fp16/test/alt-from-fp32-value.cc +0 -498
- package/fp16/test/alt-to-fp32-bits.cc +0 -263
- package/fp16/test/alt-to-fp32-psimd.cc +0 -145
- package/fp16/test/alt-to-fp32-value.cc +0 -348
- package/fp16/test/alt-to-fp32x2-psimd.cc +0 -245
- package/fp16/test/bitcasts.cc +0 -56
- package/fp16/test/ieee-from-fp32-value.cc +0 -523
- package/fp16/test/ieee-to-fp32-bits.cc +0 -333
- package/fp16/test/ieee-to-fp32-psimd.cc +0 -312
- package/fp16/test/ieee-to-fp32-value.cc +0 -420
- package/fp16/test/ieee-to-fp32x2-psimd.cc +0 -541
- package/fp16/test/peachpy/alt-xmm-to-fp32-xmm-avx.cc +0 -96
- package/fp16/test/peachpy/alt-xmm-to-fp32-ymm-avx2.cc +0 -96
- package/fp16/test/peachpy/stubs.py +0 -38
- package/fp16/test/tables.cc +0 -530
- package/fp16/test/tables.h +0 -13
- package/fp16/third-party/THHalf.h +0 -92
- package/fp16/third-party/eigen-half.h +0 -170
- package/fp16/third-party/float16-compressor.h +0 -80
- package/fp16/third-party/half.hpp +0 -2916
- package/fp16/third-party/npy-halffloat.h +0 -328
- package/simsimd/.git-blame-ignore-revs +0 -2
- package/simsimd/CONTRIBUTING.md +0 -321
- package/simsimd/Cargo.toml +0 -49
- package/simsimd/MANIFEST.in +0 -4
- package/simsimd/Package.swift +0 -28
- package/simsimd/README.md +0 -1493
- package/simsimd/binding.gyp +0 -35
- package/simsimd/build.rs +0 -70
- package/simsimd/c/lib.c +0 -374
- package/simsimd/include/module.modulemap +0 -4
- package/simsimd/include/simsimd/binary.h +0 -486
- package/simsimd/include/simsimd/curved.h +0 -1541
- package/simsimd/include/simsimd/dot.h +0 -1853
- package/simsimd/include/simsimd/elementwise.h +0 -2465
- package/simsimd/include/simsimd/geospatial.h +0 -43
- package/simsimd/include/simsimd/mesh.h +0 -69
- package/simsimd/include/simsimd/probability.h +0 -606
- package/simsimd/include/simsimd/simsimd.h +0 -2567
- package/simsimd/include/simsimd/sparse.h +0 -1384
- package/simsimd/include/simsimd/spatial.h +0 -2335
- package/simsimd/include/simsimd/types.h +0 -666
- package/simsimd/javascript/fallback.ts +0 -233
- package/simsimd/javascript/lib.c +0 -125
- package/simsimd/javascript/node-gyp-build.d.ts +0 -1
- package/simsimd/javascript/simsimd.ts +0 -179
- package/simsimd/javascript/tsconfig-cjs.json +0 -8
- package/simsimd/package-lock.json +0 -1761
- package/simsimd/package.json +0 -61
- package/simsimd/rust/lib.rs +0 -1821
- package/simsimd/scripts/bench.cxx +0 -1170
- package/simsimd/scripts/bench.ipynb +0 -187
- package/simsimd/scripts/bench.js +0 -127
- package/simsimd/scripts/bench.rs +0 -876
- package/simsimd/scripts/bench_vectors.py +0 -734
- package/simsimd/scripts/bench_vectors_live.py +0 -213
- package/simsimd/scripts/test.c +0 -187
- package/simsimd/scripts/test.mjs +0 -220
- package/simsimd/scripts/test.py +0 -1505
- package/simsimd/swift/SimSIMD.swift +0 -149
- package/simsimd/swift/Test.swift +0 -128
- /package/{simsimd → numkong}/CODE_OF_CONDUCT.md +0 -0
- /package/{simsimd → numkong}/LICENSE +0 -0
- /package/{simsimd → numkong}/javascript/dist-package-cjs.json +0 -0
- /package/{simsimd → numkong}/javascript/dist-package-esm.json +0 -0
|
@@ -0,0 +1,483 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @brief Batched Spatial Distances for ARM SME-F64.
|
|
3
|
+
* @file include/numkong/spatials/smef64.h
|
|
4
|
+
* @author Ash Vardanian
|
|
5
|
+
* @date February 23, 2026
|
|
6
|
+
*
|
|
7
|
+
* @sa include/numkong/spatials.h
|
|
8
|
+
*/
|
|
9
|
+
#ifndef NK_SPATIALS_SMEF64_H
|
|
10
|
+
#define NK_SPATIALS_SMEF64_H
|
|
11
|
+
|
|
12
|
+
#if NK_TARGET_ARM64_
|
|
13
|
+
#if NK_TARGET_SME
|
|
14
|
+
|
|
15
|
+
#include "numkong/dots/serial.h"
|
|
16
|
+
#include "numkong/reduce/sve.h" // `nk_svaddv_f64_`
|
|
17
|
+
#include "numkong/dots/smef64.h"
|
|
18
|
+
|
|
19
|
+
#if defined(__cplusplus)
|
|
20
|
+
extern "C" {
|
|
21
|
+
#endif
|
|
22
|
+
|
|
23
|
+
#if defined(__clang__)
|
|
24
|
+
#pragma clang attribute push(__attribute__((target("sme,sme-f64f64"))), apply_to = function)
|
|
25
|
+
#elif defined(__GNUC__)
|
|
26
|
+
#pragma GCC push_options
|
|
27
|
+
#pragma GCC target("+sme+sme-f64f64")
|
|
28
|
+
#endif
|
|
29
|
+
|
|
30
|
+
NK_PUBLIC nk_f64_t nk_dots_reduce_sumsq_f32_ssve_(nk_f32_t const *data, nk_size_t count) NK_STREAMING_ {
|
|
31
|
+
svfloat64_t accumulator_even_f64x = svdup_f64(0.0);
|
|
32
|
+
svfloat64_t accumulator_odd_f64x = svdup_f64(0.0);
|
|
33
|
+
nk_size_t const vector_length = svcntw();
|
|
34
|
+
nk_size_t const half_vector_length = svcntd();
|
|
35
|
+
for (nk_size_t i = 0; i < count; i += vector_length) {
|
|
36
|
+
svbool_t predicate_b32x = svwhilelt_b32_u64(i, count);
|
|
37
|
+
svfloat32_t values_f32x = svld1_f32(predicate_b32x, data + i);
|
|
38
|
+
|
|
39
|
+
svbool_t predicate_even_b64x = svwhilelt_b64_u64(i, count);
|
|
40
|
+
svfloat64_t values_even_f64x = svcvt_f64_f32_x(predicate_even_b64x, values_f32x);
|
|
41
|
+
accumulator_even_f64x = svmla_f64_m(predicate_even_b64x, accumulator_even_f64x, values_even_f64x,
|
|
42
|
+
values_even_f64x);
|
|
43
|
+
|
|
44
|
+
svbool_t predicate_odd_b64x = svwhilelt_b64_u64(i + half_vector_length, count);
|
|
45
|
+
svfloat64_t values_odd_f64x = svcvtlt_f64_f32_x(predicate_odd_b64x, values_f32x);
|
|
46
|
+
accumulator_odd_f64x = svmla_f64_m(predicate_odd_b64x, accumulator_odd_f64x, values_odd_f64x, values_odd_f64x);
|
|
47
|
+
}
|
|
48
|
+
return nk_svaddv_f64_(svptrue_b64(), accumulator_even_f64x) + nk_svaddv_f64_(svptrue_b64(), accumulator_odd_f64x);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
NK_PUBLIC nk_f64_t nk_dots_reduce_sumsq_f64_ssve_(nk_f64_t const *data, nk_size_t count) NK_STREAMING_ {
|
|
52
|
+
svfloat64_t accumulator_f64x = svdup_f64(0.0);
|
|
53
|
+
nk_size_t const vector_length = svcntd();
|
|
54
|
+
for (nk_size_t i = 0; i < count; i += vector_length) {
|
|
55
|
+
svbool_t predicate_b64x = svwhilelt_b64_u64(i, count);
|
|
56
|
+
svfloat64_t values_f64x = svld1_f64(predicate_b64x, data + i);
|
|
57
|
+
accumulator_f64x = svmla_f64_m(predicate_b64x, accumulator_f64x, values_f64x, values_f64x);
|
|
58
|
+
}
|
|
59
|
+
return nk_svaddv_f64_(svptrue_b64(), accumulator_f64x);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
NK_PUBLIC svfloat64_t nk_angulars_from_dot_f64x_ssvef64_(svbool_t predicate_b64x, svfloat64_t dots_f64x,
|
|
63
|
+
svfloat64_t query_norm_sq_f64x,
|
|
64
|
+
svfloat64_t target_norms_sq_f64x) NK_STREAMING_ {
|
|
65
|
+
svfloat64_t norms_product_f64x = svmul_f64_x(predicate_b64x, query_norm_sq_f64x, target_norms_sq_f64x);
|
|
66
|
+
svbool_t positive_norms_b64x = svcmpgt_n_f64(predicate_b64x, norms_product_f64x, 0.0);
|
|
67
|
+
svfloat64_t denom_f64x = svsqrt_f64_x(positive_norms_b64x, norms_product_f64x);
|
|
68
|
+
svfloat64_t safe_denom_f64x = svsel_f64(positive_norms_b64x, denom_f64x, svdup_n_f64(1.0));
|
|
69
|
+
svfloat64_t normalized_f64x = svdiv_f64_x(predicate_b64x, dots_f64x, safe_denom_f64x);
|
|
70
|
+
svfloat64_t angular_f64x = svsub_f64_x(predicate_b64x, svdup_n_f64(1.0), normalized_f64x);
|
|
71
|
+
angular_f64x = svsel_f64(
|
|
72
|
+
positive_norms_b64x, angular_f64x,
|
|
73
|
+
svsel_f64(svcmpeq_n_f64(predicate_b64x, dots_f64x, 0.0), svdup_n_f64(0.0), svdup_n_f64(1.0)));
|
|
74
|
+
return svmax_f64_x(predicate_b64x, angular_f64x, svdup_n_f64(0.0));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
NK_PUBLIC svfloat64_t nk_euclideans_from_dot_f64x_ssvef64_(svbool_t predicate_b64x, svfloat64_t dots_f64x,
|
|
78
|
+
svfloat64_t query_norm_sq_f64x,
|
|
79
|
+
svfloat64_t target_norms_sq_f64x) NK_STREAMING_ {
|
|
80
|
+
svfloat64_t sum_sq_f64x = svadd_f64_x(predicate_b64x, query_norm_sq_f64x, target_norms_sq_f64x);
|
|
81
|
+
svfloat64_t dist_sq_f64x = svsub_f64_x(predicate_b64x, sum_sq_f64x,
|
|
82
|
+
svmul_f64_x(predicate_b64x, svdup_n_f64(2.0), dots_f64x));
|
|
83
|
+
dist_sq_f64x = svmax_f64_x(predicate_b64x, dist_sq_f64x, svdup_n_f64(0.0));
|
|
84
|
+
return svsqrt_f64_x(predicate_b64x, dist_sq_f64x);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
#pragma region F32 Packed Angular
|
|
88
|
+
|
|
89
|
+
static void nk_angulars_packed_f32_smef64_finalize_ssve_( //
|
|
90
|
+
nk_f32_t const *a, void const *b_packed, nk_f64_t *c, nk_size_t rows, nk_size_t columns, nk_size_t depth,
|
|
91
|
+
nk_size_t a_stride_elements, nk_size_t c_stride_elements) NK_STREAMING_ {
|
|
92
|
+
|
|
93
|
+
nk_dots_sme_packed_header_t const *header = (nk_dots_sme_packed_header_t const *)b_packed;
|
|
94
|
+
nk_f64_t const *b_norms = (nk_f64_t const *)((char const *)b_packed + header->norms_offset);
|
|
95
|
+
|
|
96
|
+
for (nk_size_t row_index = 0; row_index < rows; row_index++) {
|
|
97
|
+
nk_f32_t const *a_row = a + row_index * a_stride_elements;
|
|
98
|
+
nk_f64_t *c_row = c + row_index * c_stride_elements;
|
|
99
|
+
nk_f64_t query_norm_sq_f64 = nk_dots_reduce_sumsq_f32_ssve_(a_row, depth);
|
|
100
|
+
svfloat64_t query_norm_sq_f64x = svdup_n_f64(query_norm_sq_f64);
|
|
101
|
+
|
|
102
|
+
for (nk_size_t col_index = 0; col_index < columns; col_index += svcntd()) {
|
|
103
|
+
svbool_t predicate_b64x = svwhilelt_b64_u64(col_index, columns);
|
|
104
|
+
svfloat64_t dots_f64x = svld1_f64(predicate_b64x, c_row + col_index);
|
|
105
|
+
svfloat64_t target_norms_sq_f64x = svld1_f64(predicate_b64x, b_norms + col_index);
|
|
106
|
+
svst1_f64(predicate_b64x, c_row + col_index,
|
|
107
|
+
nk_angulars_from_dot_f64x_ssvef64_(predicate_b64x, dots_f64x, query_norm_sq_f64x,
|
|
108
|
+
target_norms_sq_f64x));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
NK_PUBLIC void nk_angulars_packed_f32_smef64( //
|
|
114
|
+
nk_f32_t const *a, void const *b_packed, nk_f64_t *c, nk_size_t rows, nk_size_t columns, nk_size_t depth,
|
|
115
|
+
nk_size_t a_stride_in_bytes, nk_size_t c_stride_in_bytes) {
|
|
116
|
+
|
|
117
|
+
nk_size_t const a_stride_elements = a_stride_in_bytes / sizeof(nk_f32_t);
|
|
118
|
+
nk_size_t const c_stride_elements = c_stride_in_bytes / sizeof(nk_f64_t);
|
|
119
|
+
|
|
120
|
+
nk_sme_start_streaming_();
|
|
121
|
+
nk_dots_packed_f32_smef64_streaming_(a, b_packed, c, rows, columns, depth, a_stride_elements, c_stride_elements);
|
|
122
|
+
nk_angulars_packed_f32_smef64_finalize_ssve_(a, b_packed, c, rows, columns, depth, a_stride_elements,
|
|
123
|
+
c_stride_elements);
|
|
124
|
+
nk_sme_stop_streaming_();
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
#pragma endregion F32 Packed Angular
|
|
128
|
+
#pragma region F32 Packed Euclidean
|
|
129
|
+
|
|
130
|
+
static void nk_euclideans_packed_f32_smef64_finalize_ssve_( //
|
|
131
|
+
nk_f32_t const *a, void const *b_packed, nk_f64_t *c, nk_size_t rows, nk_size_t columns, nk_size_t depth,
|
|
132
|
+
nk_size_t a_stride_elements, nk_size_t c_stride_elements) NK_STREAMING_ {
|
|
133
|
+
|
|
134
|
+
nk_dots_sme_packed_header_t const *header = (nk_dots_sme_packed_header_t const *)b_packed;
|
|
135
|
+
nk_f64_t const *b_norms = (nk_f64_t const *)((char const *)b_packed + header->norms_offset);
|
|
136
|
+
|
|
137
|
+
for (nk_size_t row_index = 0; row_index < rows; row_index++) {
|
|
138
|
+
nk_f32_t const *a_row = a + row_index * a_stride_elements;
|
|
139
|
+
nk_f64_t *c_row = c + row_index * c_stride_elements;
|
|
140
|
+
nk_f64_t query_norm_sq_f64 = nk_dots_reduce_sumsq_f32_ssve_(a_row, depth);
|
|
141
|
+
svfloat64_t query_norm_sq_f64x = svdup_n_f64(query_norm_sq_f64);
|
|
142
|
+
|
|
143
|
+
for (nk_size_t col_index = 0; col_index < columns; col_index += svcntd()) {
|
|
144
|
+
svbool_t predicate_b64x = svwhilelt_b64_u64(col_index, columns);
|
|
145
|
+
svfloat64_t dots_f64x = svld1_f64(predicate_b64x, c_row + col_index);
|
|
146
|
+
svfloat64_t target_norms_sq_f64x = svld1_f64(predicate_b64x, b_norms + col_index);
|
|
147
|
+
svst1_f64(predicate_b64x, c_row + col_index,
|
|
148
|
+
nk_euclideans_from_dot_f64x_ssvef64_(predicate_b64x, dots_f64x, query_norm_sq_f64x,
|
|
149
|
+
target_norms_sq_f64x));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
NK_PUBLIC void nk_euclideans_packed_f32_smef64( //
|
|
155
|
+
nk_f32_t const *a, void const *b_packed, nk_f64_t *c, nk_size_t rows, nk_size_t columns, nk_size_t depth,
|
|
156
|
+
nk_size_t a_stride_in_bytes, nk_size_t c_stride_in_bytes) {
|
|
157
|
+
|
|
158
|
+
nk_size_t const a_stride_elements = a_stride_in_bytes / sizeof(nk_f32_t);
|
|
159
|
+
nk_size_t const c_stride_elements = c_stride_in_bytes / sizeof(nk_f64_t);
|
|
160
|
+
|
|
161
|
+
nk_sme_start_streaming_();
|
|
162
|
+
nk_dots_packed_f32_smef64_streaming_(a, b_packed, c, rows, columns, depth, a_stride_elements, c_stride_elements);
|
|
163
|
+
nk_euclideans_packed_f32_smef64_finalize_ssve_(a, b_packed, c, rows, columns, depth, a_stride_elements,
|
|
164
|
+
c_stride_elements);
|
|
165
|
+
nk_sme_stop_streaming_();
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
#pragma endregion F32 Packed Euclidean
|
|
169
|
+
#pragma region F32 Symmetric Angular
|
|
170
|
+
|
|
171
|
+
static void nk_angulars_symmetric_f32_smef64_finalize_ssve_( //
|
|
172
|
+
nk_f32_t const *vectors, nk_size_t vectors_count, nk_size_t depth, nk_size_t stride_elements, nk_f64_t *result,
|
|
173
|
+
nk_size_t result_stride_elements, nk_size_t row_start, nk_size_t row_count) NK_STREAMING_ {
|
|
174
|
+
// Phase 1: cache row norms on diagonal
|
|
175
|
+
for (nk_size_t row_index = row_start; row_index < row_start + row_count; ++row_index) {
|
|
176
|
+
nk_f32_t const *row_vector = vectors + row_index * stride_elements;
|
|
177
|
+
nk_f64_t *result_row = result + row_index * result_stride_elements;
|
|
178
|
+
result_row[row_index] = nk_dots_reduce_sumsq_f32_ssve_(row_vector, depth);
|
|
179
|
+
}
|
|
180
|
+
// Phase 2: column-chunked post-processing
|
|
181
|
+
nk_f64_t column_norms[256];
|
|
182
|
+
for (nk_size_t chunk_start = 0; chunk_start < vectors_count; chunk_start += 256) {
|
|
183
|
+
nk_size_t chunk_end = chunk_start + 256 < vectors_count ? chunk_start + 256 : vectors_count;
|
|
184
|
+
for (nk_size_t col = chunk_start; col < chunk_end; ++col) {
|
|
185
|
+
nk_f32_t const *col_vector = vectors + col * stride_elements;
|
|
186
|
+
column_norms[col - chunk_start] = nk_dots_reduce_sumsq_f32_ssve_(col_vector, depth);
|
|
187
|
+
}
|
|
188
|
+
for (nk_size_t row_index = row_start; row_index < row_start + row_count; ++row_index) {
|
|
189
|
+
nk_size_t col_start = row_index + 1 > chunk_start ? row_index + 1 : chunk_start;
|
|
190
|
+
if (col_start >= chunk_end) continue;
|
|
191
|
+
nk_f64_t *result_row = result + row_index * result_stride_elements;
|
|
192
|
+
svfloat64_t query_norm_sq_f64x = svdup_n_f64(result_row[row_index]);
|
|
193
|
+
for (nk_size_t col_index = col_start; col_index < chunk_end; col_index += svcntd()) {
|
|
194
|
+
svbool_t predicate_b64x = svwhilelt_b64_u64(col_index, chunk_end);
|
|
195
|
+
svfloat64_t dots_f64x = svld1_f64(predicate_b64x, result_row + col_index);
|
|
196
|
+
svfloat64_t target_norms_sq_f64x = svld1_f64(predicate_b64x, column_norms + (col_index - chunk_start));
|
|
197
|
+
svst1_f64(predicate_b64x, result_row + col_index,
|
|
198
|
+
nk_angulars_from_dot_f64x_ssvef64_(predicate_b64x, dots_f64x, query_norm_sq_f64x,
|
|
199
|
+
target_norms_sq_f64x));
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Phase 3: zero diagonals
|
|
204
|
+
for (nk_size_t row_index = row_start; row_index < row_start + row_count; ++row_index)
|
|
205
|
+
result[row_index * result_stride_elements + row_index] = 0;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
NK_PUBLIC void nk_angulars_symmetric_f32_smef64( //
|
|
209
|
+
nk_f32_t const *vectors, nk_size_t vectors_count, nk_size_t depth, nk_size_t stride_in_bytes, nk_f64_t *result,
|
|
210
|
+
nk_size_t result_stride_in_bytes, nk_size_t row_start, nk_size_t row_count) {
|
|
211
|
+
|
|
212
|
+
nk_size_t const stride_elements = stride_in_bytes / sizeof(nk_f32_t);
|
|
213
|
+
nk_size_t const result_stride_elements = result_stride_in_bytes / sizeof(nk_f64_t);
|
|
214
|
+
|
|
215
|
+
nk_sme_start_streaming_();
|
|
216
|
+
nk_dots_symmetric_f32_smef64_streaming_(vectors, vectors_count, depth, stride_elements, result,
|
|
217
|
+
result_stride_elements, row_start, row_count);
|
|
218
|
+
nk_angulars_symmetric_f32_smef64_finalize_ssve_(vectors, vectors_count, depth, stride_elements, result,
|
|
219
|
+
result_stride_elements, row_start, row_count);
|
|
220
|
+
nk_sme_stop_streaming_();
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
#pragma endregion F32 Symmetric Angular
|
|
224
|
+
#pragma region F32 Symmetric Euclidean
|
|
225
|
+
|
|
226
|
+
static void nk_euclideans_symmetric_f32_smef64_finalize_ssve_( //
|
|
227
|
+
nk_f32_t const *vectors, nk_size_t vectors_count, nk_size_t depth, nk_size_t stride_elements, nk_f64_t *result,
|
|
228
|
+
nk_size_t result_stride_elements, nk_size_t row_start, nk_size_t row_count) NK_STREAMING_ {
|
|
229
|
+
// Phase 1: cache row norms on diagonal
|
|
230
|
+
for (nk_size_t row_index = row_start; row_index < row_start + row_count; ++row_index) {
|
|
231
|
+
nk_f32_t const *row_vector = vectors + row_index * stride_elements;
|
|
232
|
+
nk_f64_t *result_row = result + row_index * result_stride_elements;
|
|
233
|
+
result_row[row_index] = nk_dots_reduce_sumsq_f32_ssve_(row_vector, depth);
|
|
234
|
+
}
|
|
235
|
+
// Phase 2: column-chunked post-processing
|
|
236
|
+
nk_f64_t column_norms[256];
|
|
237
|
+
for (nk_size_t chunk_start = 0; chunk_start < vectors_count; chunk_start += 256) {
|
|
238
|
+
nk_size_t chunk_end = chunk_start + 256 < vectors_count ? chunk_start + 256 : vectors_count;
|
|
239
|
+
for (nk_size_t col = chunk_start; col < chunk_end; ++col) {
|
|
240
|
+
nk_f32_t const *col_vector = vectors + col * stride_elements;
|
|
241
|
+
column_norms[col - chunk_start] = nk_dots_reduce_sumsq_f32_ssve_(col_vector, depth);
|
|
242
|
+
}
|
|
243
|
+
for (nk_size_t row_index = row_start; row_index < row_start + row_count; ++row_index) {
|
|
244
|
+
nk_size_t col_start = row_index + 1 > chunk_start ? row_index + 1 : chunk_start;
|
|
245
|
+
if (col_start >= chunk_end) continue;
|
|
246
|
+
nk_f64_t *result_row = result + row_index * result_stride_elements;
|
|
247
|
+
svfloat64_t query_norm_sq_f64x = svdup_n_f64(result_row[row_index]);
|
|
248
|
+
for (nk_size_t col_index = col_start; col_index < chunk_end; col_index += svcntd()) {
|
|
249
|
+
svbool_t predicate_b64x = svwhilelt_b64_u64(col_index, chunk_end);
|
|
250
|
+
svfloat64_t dots_f64x = svld1_f64(predicate_b64x, result_row + col_index);
|
|
251
|
+
svfloat64_t target_norms_sq_f64x = svld1_f64(predicate_b64x, column_norms + (col_index - chunk_start));
|
|
252
|
+
svst1_f64(predicate_b64x, result_row + col_index,
|
|
253
|
+
nk_euclideans_from_dot_f64x_ssvef64_(predicate_b64x, dots_f64x, query_norm_sq_f64x,
|
|
254
|
+
target_norms_sq_f64x));
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// Phase 3: zero diagonals
|
|
259
|
+
for (nk_size_t row_index = row_start; row_index < row_start + row_count; ++row_index)
|
|
260
|
+
result[row_index * result_stride_elements + row_index] = 0;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
NK_PUBLIC void nk_euclideans_symmetric_f32_smef64( //
|
|
264
|
+
nk_f32_t const *vectors, nk_size_t vectors_count, nk_size_t depth, nk_size_t stride_in_bytes, nk_f64_t *result,
|
|
265
|
+
nk_size_t result_stride_in_bytes, nk_size_t row_start, nk_size_t row_count) {
|
|
266
|
+
|
|
267
|
+
nk_size_t const stride_elements = stride_in_bytes / sizeof(nk_f32_t);
|
|
268
|
+
nk_size_t const result_stride_elements = result_stride_in_bytes / sizeof(nk_f64_t);
|
|
269
|
+
|
|
270
|
+
nk_sme_start_streaming_();
|
|
271
|
+
nk_dots_symmetric_f32_smef64_streaming_(vectors, vectors_count, depth, stride_elements, result,
|
|
272
|
+
result_stride_elements, row_start, row_count);
|
|
273
|
+
nk_euclideans_symmetric_f32_smef64_finalize_ssve_(vectors, vectors_count, depth, stride_elements, result,
|
|
274
|
+
result_stride_elements, row_start, row_count);
|
|
275
|
+
nk_sme_stop_streaming_();
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
#pragma endregion F32 Symmetric Euclidean
|
|
279
|
+
#pragma region F64 Packed Angular
|
|
280
|
+
|
|
281
|
+
static void nk_angulars_packed_f64_smef64_finalize_ssve_( //
|
|
282
|
+
nk_f64_t const *a, void const *b_packed, nk_f64_t *c, nk_size_t rows, nk_size_t columns, nk_size_t depth,
|
|
283
|
+
nk_size_t a_stride_elements, nk_size_t c_stride_elements) NK_STREAMING_ {
|
|
284
|
+
|
|
285
|
+
nk_dots_sme_packed_header_t const *header = (nk_dots_sme_packed_header_t const *)b_packed;
|
|
286
|
+
nk_f64_t const *b_norms = (nk_f64_t const *)((char const *)b_packed + header->norms_offset);
|
|
287
|
+
|
|
288
|
+
for (nk_size_t row_index = 0; row_index < rows; row_index++) {
|
|
289
|
+
nk_f64_t const *a_row = a + row_index * a_stride_elements;
|
|
290
|
+
nk_f64_t *c_row = c + row_index * c_stride_elements;
|
|
291
|
+
nk_f64_t query_norm_sq_f64 = nk_dots_reduce_sumsq_f64_ssve_(a_row, depth);
|
|
292
|
+
svfloat64_t query_norm_sq_f64x = svdup_n_f64(query_norm_sq_f64);
|
|
293
|
+
|
|
294
|
+
for (nk_size_t col_index = 0; col_index < columns; col_index += svcntd()) {
|
|
295
|
+
svbool_t predicate_b64x = svwhilelt_b64_u64(col_index, columns);
|
|
296
|
+
svfloat64_t dots_f64x = svld1_f64(predicate_b64x, c_row + col_index);
|
|
297
|
+
svfloat64_t target_norms_sq_f64x = svld1_f64(predicate_b64x, b_norms + col_index);
|
|
298
|
+
svst1_f64(predicate_b64x, c_row + col_index,
|
|
299
|
+
nk_angulars_from_dot_f64x_ssvef64_(predicate_b64x, dots_f64x, query_norm_sq_f64x,
|
|
300
|
+
target_norms_sq_f64x));
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
NK_PUBLIC void nk_angulars_packed_f64_smef64( //
|
|
306
|
+
nk_f64_t const *a, void const *b_packed, nk_f64_t *c, nk_size_t rows, nk_size_t columns, nk_size_t depth,
|
|
307
|
+
nk_size_t a_stride_in_bytes, nk_size_t c_stride_in_bytes) {
|
|
308
|
+
|
|
309
|
+
nk_size_t const a_stride_elements = a_stride_in_bytes / sizeof(nk_f64_t);
|
|
310
|
+
nk_size_t const c_stride_elements = c_stride_in_bytes / sizeof(nk_f64_t);
|
|
311
|
+
|
|
312
|
+
nk_sme_start_streaming_();
|
|
313
|
+
nk_dots_packed_f64_smef64_streaming_(a, b_packed, c, rows, columns, depth, a_stride_elements, c_stride_elements);
|
|
314
|
+
nk_angulars_packed_f64_smef64_finalize_ssve_(a, b_packed, c, rows, columns, depth, a_stride_elements,
|
|
315
|
+
c_stride_elements);
|
|
316
|
+
nk_sme_stop_streaming_();
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
#pragma endregion F64 Packed Angular
|
|
320
|
+
#pragma region F64 Packed Euclidean
|
|
321
|
+
|
|
322
|
+
static void nk_euclideans_packed_f64_smef64_finalize_ssve_( //
|
|
323
|
+
nk_f64_t const *a, void const *b_packed, nk_f64_t *c, nk_size_t rows, nk_size_t columns, nk_size_t depth,
|
|
324
|
+
nk_size_t a_stride_elements, nk_size_t c_stride_elements) NK_STREAMING_ {
|
|
325
|
+
|
|
326
|
+
nk_dots_sme_packed_header_t const *header = (nk_dots_sme_packed_header_t const *)b_packed;
|
|
327
|
+
nk_f64_t const *b_norms = (nk_f64_t const *)((char const *)b_packed + header->norms_offset);
|
|
328
|
+
|
|
329
|
+
for (nk_size_t row_index = 0; row_index < rows; row_index++) {
|
|
330
|
+
nk_f64_t const *a_row = a + row_index * a_stride_elements;
|
|
331
|
+
nk_f64_t *c_row = c + row_index * c_stride_elements;
|
|
332
|
+
nk_f64_t query_norm_sq_f64 = nk_dots_reduce_sumsq_f64_ssve_(a_row, depth);
|
|
333
|
+
svfloat64_t query_norm_sq_f64x = svdup_n_f64(query_norm_sq_f64);
|
|
334
|
+
|
|
335
|
+
for (nk_size_t col_index = 0; col_index < columns; col_index += svcntd()) {
|
|
336
|
+
svbool_t predicate_b64x = svwhilelt_b64_u64(col_index, columns);
|
|
337
|
+
svfloat64_t dots_f64x = svld1_f64(predicate_b64x, c_row + col_index);
|
|
338
|
+
svfloat64_t target_norms_sq_f64x = svld1_f64(predicate_b64x, b_norms + col_index);
|
|
339
|
+
svst1_f64(predicate_b64x, c_row + col_index,
|
|
340
|
+
nk_euclideans_from_dot_f64x_ssvef64_(predicate_b64x, dots_f64x, query_norm_sq_f64x,
|
|
341
|
+
target_norms_sq_f64x));
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
NK_PUBLIC void nk_euclideans_packed_f64_smef64( //
|
|
347
|
+
nk_f64_t const *a, void const *b_packed, nk_f64_t *c, nk_size_t rows, nk_size_t columns, nk_size_t depth,
|
|
348
|
+
nk_size_t a_stride_in_bytes, nk_size_t c_stride_in_bytes) {
|
|
349
|
+
|
|
350
|
+
nk_size_t const a_stride_elements = a_stride_in_bytes / sizeof(nk_f64_t);
|
|
351
|
+
nk_size_t const c_stride_elements = c_stride_in_bytes / sizeof(nk_f64_t);
|
|
352
|
+
|
|
353
|
+
nk_sme_start_streaming_();
|
|
354
|
+
nk_dots_packed_f64_smef64_streaming_(a, b_packed, c, rows, columns, depth, a_stride_elements, c_stride_elements);
|
|
355
|
+
nk_euclideans_packed_f64_smef64_finalize_ssve_(a, b_packed, c, rows, columns, depth, a_stride_elements,
|
|
356
|
+
c_stride_elements);
|
|
357
|
+
nk_sme_stop_streaming_();
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
#pragma endregion F64 Packed Euclidean
|
|
361
|
+
#pragma region F64 Symmetric Angular
|
|
362
|
+
|
|
363
|
+
static void nk_angulars_symmetric_f64_smef64_finalize_ssve_( //
|
|
364
|
+
nk_f64_t const *vectors, nk_size_t vectors_count, nk_size_t depth, nk_size_t stride_elements, nk_f64_t *result,
|
|
365
|
+
nk_size_t result_stride_elements, nk_size_t row_start, nk_size_t row_count) NK_STREAMING_ {
|
|
366
|
+
// Phase 1: cache row norms on diagonal
|
|
367
|
+
for (nk_size_t row_index = row_start; row_index < row_start + row_count; ++row_index) {
|
|
368
|
+
nk_f64_t const *row_vector = vectors + row_index * stride_elements;
|
|
369
|
+
nk_f64_t *result_row = result + row_index * result_stride_elements;
|
|
370
|
+
result_row[row_index] = nk_dots_reduce_sumsq_f64_ssve_(row_vector, depth);
|
|
371
|
+
}
|
|
372
|
+
// Phase 2: column-chunked post-processing
|
|
373
|
+
nk_f64_t column_norms[256];
|
|
374
|
+
for (nk_size_t chunk_start = 0; chunk_start < vectors_count; chunk_start += 256) {
|
|
375
|
+
nk_size_t chunk_end = chunk_start + 256 < vectors_count ? chunk_start + 256 : vectors_count;
|
|
376
|
+
for (nk_size_t col = chunk_start; col < chunk_end; ++col) {
|
|
377
|
+
nk_f64_t const *col_vector = vectors + col * stride_elements;
|
|
378
|
+
column_norms[col - chunk_start] = nk_dots_reduce_sumsq_f64_ssve_(col_vector, depth);
|
|
379
|
+
}
|
|
380
|
+
for (nk_size_t row_index = row_start; row_index < row_start + row_count; ++row_index) {
|
|
381
|
+
nk_size_t col_start = row_index + 1 > chunk_start ? row_index + 1 : chunk_start;
|
|
382
|
+
if (col_start >= chunk_end) continue;
|
|
383
|
+
nk_f64_t *result_row = result + row_index * result_stride_elements;
|
|
384
|
+
svfloat64_t query_norm_sq_f64x = svdup_n_f64(result_row[row_index]);
|
|
385
|
+
for (nk_size_t col_index = col_start; col_index < chunk_end; col_index += svcntd()) {
|
|
386
|
+
svbool_t predicate_b64x = svwhilelt_b64_u64(col_index, chunk_end);
|
|
387
|
+
svfloat64_t dots_f64x = svld1_f64(predicate_b64x, result_row + col_index);
|
|
388
|
+
svfloat64_t target_norms_sq_f64x = svld1_f64(predicate_b64x, column_norms + (col_index - chunk_start));
|
|
389
|
+
svst1_f64(predicate_b64x, result_row + col_index,
|
|
390
|
+
nk_angulars_from_dot_f64x_ssvef64_(predicate_b64x, dots_f64x, query_norm_sq_f64x,
|
|
391
|
+
target_norms_sq_f64x));
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
// Phase 3: zero diagonals
|
|
396
|
+
for (nk_size_t row_index = row_start; row_index < row_start + row_count; ++row_index)
|
|
397
|
+
result[row_index * result_stride_elements + row_index] = 0;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
NK_PUBLIC void nk_angulars_symmetric_f64_smef64( //
|
|
401
|
+
nk_f64_t const *vectors, nk_size_t vectors_count, nk_size_t depth, nk_size_t stride_in_bytes, nk_f64_t *result,
|
|
402
|
+
nk_size_t result_stride_in_bytes, nk_size_t row_start, nk_size_t row_count) {
|
|
403
|
+
|
|
404
|
+
nk_size_t const stride_elements = stride_in_bytes / sizeof(nk_f64_t);
|
|
405
|
+
nk_size_t const result_stride_elements = result_stride_in_bytes / sizeof(nk_f64_t);
|
|
406
|
+
|
|
407
|
+
nk_sme_start_streaming_();
|
|
408
|
+
nk_dots_symmetric_f64_smef64_streaming_(vectors, vectors_count, depth, stride_elements, result,
|
|
409
|
+
result_stride_elements, row_start, row_count);
|
|
410
|
+
nk_angulars_symmetric_f64_smef64_finalize_ssve_(vectors, vectors_count, depth, stride_elements, result,
|
|
411
|
+
result_stride_elements, row_start, row_count);
|
|
412
|
+
nk_sme_stop_streaming_();
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
#pragma endregion F64 Symmetric Angular
|
|
416
|
+
#pragma region F64 Symmetric Euclidean
|
|
417
|
+
|
|
418
|
+
static void nk_euclideans_symmetric_f64_smef64_finalize_ssve_( //
|
|
419
|
+
nk_f64_t const *vectors, nk_size_t vectors_count, nk_size_t depth, nk_size_t stride_elements, nk_f64_t *result,
|
|
420
|
+
nk_size_t result_stride_elements, nk_size_t row_start, nk_size_t row_count) NK_STREAMING_ {
|
|
421
|
+
// Phase 1: cache row norms on diagonal
|
|
422
|
+
for (nk_size_t row_index = row_start; row_index < row_start + row_count; ++row_index) {
|
|
423
|
+
nk_f64_t const *row_vector = vectors + row_index * stride_elements;
|
|
424
|
+
nk_f64_t *result_row = result + row_index * result_stride_elements;
|
|
425
|
+
result_row[row_index] = nk_dots_reduce_sumsq_f64_ssve_(row_vector, depth);
|
|
426
|
+
}
|
|
427
|
+
// Phase 2: column-chunked post-processing
|
|
428
|
+
nk_f64_t column_norms[256];
|
|
429
|
+
for (nk_size_t chunk_start = 0; chunk_start < vectors_count; chunk_start += 256) {
|
|
430
|
+
nk_size_t chunk_end = chunk_start + 256 < vectors_count ? chunk_start + 256 : vectors_count;
|
|
431
|
+
for (nk_size_t col = chunk_start; col < chunk_end; ++col) {
|
|
432
|
+
nk_f64_t const *col_vector = vectors + col * stride_elements;
|
|
433
|
+
column_norms[col - chunk_start] = nk_dots_reduce_sumsq_f64_ssve_(col_vector, depth);
|
|
434
|
+
}
|
|
435
|
+
for (nk_size_t row_index = row_start; row_index < row_start + row_count; ++row_index) {
|
|
436
|
+
nk_size_t col_start = row_index + 1 > chunk_start ? row_index + 1 : chunk_start;
|
|
437
|
+
if (col_start >= chunk_end) continue;
|
|
438
|
+
nk_f64_t *result_row = result + row_index * result_stride_elements;
|
|
439
|
+
svfloat64_t query_norm_sq_f64x = svdup_n_f64(result_row[row_index]);
|
|
440
|
+
for (nk_size_t col_index = col_start; col_index < chunk_end; col_index += svcntd()) {
|
|
441
|
+
svbool_t predicate_b64x = svwhilelt_b64_u64(col_index, chunk_end);
|
|
442
|
+
svfloat64_t dots_f64x = svld1_f64(predicate_b64x, result_row + col_index);
|
|
443
|
+
svfloat64_t target_norms_sq_f64x = svld1_f64(predicate_b64x, column_norms + (col_index - chunk_start));
|
|
444
|
+
svst1_f64(predicate_b64x, result_row + col_index,
|
|
445
|
+
nk_euclideans_from_dot_f64x_ssvef64_(predicate_b64x, dots_f64x, query_norm_sq_f64x,
|
|
446
|
+
target_norms_sq_f64x));
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
// Phase 3: zero diagonals
|
|
451
|
+
for (nk_size_t row_index = row_start; row_index < row_start + row_count; ++row_index)
|
|
452
|
+
result[row_index * result_stride_elements + row_index] = 0;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
NK_PUBLIC void nk_euclideans_symmetric_f64_smef64( //
|
|
456
|
+
nk_f64_t const *vectors, nk_size_t vectors_count, nk_size_t depth, nk_size_t stride_in_bytes, nk_f64_t *result,
|
|
457
|
+
nk_size_t result_stride_in_bytes, nk_size_t row_start, nk_size_t row_count) {
|
|
458
|
+
|
|
459
|
+
nk_size_t const stride_elements = stride_in_bytes / sizeof(nk_f64_t);
|
|
460
|
+
nk_size_t const result_stride_elements = result_stride_in_bytes / sizeof(nk_f64_t);
|
|
461
|
+
|
|
462
|
+
nk_sme_start_streaming_();
|
|
463
|
+
nk_dots_symmetric_f64_smef64_streaming_(vectors, vectors_count, depth, stride_elements, result,
|
|
464
|
+
result_stride_elements, row_start, row_count);
|
|
465
|
+
nk_euclideans_symmetric_f64_smef64_finalize_ssve_(vectors, vectors_count, depth, stride_elements, result,
|
|
466
|
+
result_stride_elements, row_start, row_count);
|
|
467
|
+
nk_sme_stop_streaming_();
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
#pragma endregion F64 Symmetric Euclidean
|
|
471
|
+
#if defined(__clang__)
|
|
472
|
+
#pragma clang attribute pop
|
|
473
|
+
#elif defined(__GNUC__)
|
|
474
|
+
#pragma GCC pop_options
|
|
475
|
+
#endif
|
|
476
|
+
|
|
477
|
+
#if defined(__cplusplus)
|
|
478
|
+
} // extern "C"
|
|
479
|
+
#endif
|
|
480
|
+
|
|
481
|
+
#endif // NK_TARGET_SME
|
|
482
|
+
#endif // NK_TARGET_ARM64_
|
|
483
|
+
#endif // NK_SPATIALS_SMEF64_H
|