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,506 @@
|
|
|
1
|
+
// Bench.swift
|
|
2
|
+
// NumKong
|
|
3
|
+
//
|
|
4
|
+
// XCTest performance benchmarks for NumKong.
|
|
5
|
+
// Run on-device (iPad, iPhone, Mac) via:
|
|
6
|
+
// xcodebuild test -scheme NumKong -destination 'platform=iOS,name=...' -only-testing Bench
|
|
7
|
+
// Or locally:
|
|
8
|
+
// swift test --filter Bench
|
|
9
|
+
//
|
|
10
|
+
// Environment variables (matching C++ nk_bench):
|
|
11
|
+
// NK_DENSE_DIMENSIONS — pairwise vector length (default 1536)
|
|
12
|
+
// NK_MATRIX_HEIGHT — GEMM M / dataset rows (default 1024)
|
|
13
|
+
// NK_MATRIX_WIDTH — GEMM N / query rows (default 128)
|
|
14
|
+
// NK_MATRIX_DEPTH — GEMM K / vector dims (default 1536)
|
|
15
|
+
|
|
16
|
+
#if canImport(Darwin)
|
|
17
|
+
|
|
18
|
+
import CNumKong
|
|
19
|
+
import NumKong
|
|
20
|
+
import XCTest
|
|
21
|
+
|
|
22
|
+
// MARK: - Configuration
|
|
23
|
+
|
|
24
|
+
private func env(_ key: String, default d: Int) -> Int {
|
|
25
|
+
if let v = ProcessInfo.processInfo.environment[key], let i = Int(v) { return i }
|
|
26
|
+
return d
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
private let denseDims = env("NK_DENSE_DIMENSIONS", default: 1536)
|
|
30
|
+
private let matrixHeight = env("NK_MATRIX_HEIGHT", default: 1024)
|
|
31
|
+
private let matrixWidth = env("NK_MATRIX_WIDTH", default: 128)
|
|
32
|
+
private let matrixDepth = env("NK_MATRIX_DEPTH", default: 1536)
|
|
33
|
+
private let pairwiseReps = 10_000
|
|
34
|
+
|
|
35
|
+
// MARK: - Random Generators
|
|
36
|
+
|
|
37
|
+
private func randomFloat64(_ n: Int) -> [Float64] {
|
|
38
|
+
(0..<n).map { _ in Float64.random(in: -1...1) }
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
private func randomFloat32(_ n: Int) -> [Float32] {
|
|
42
|
+
(0..<n).map { _ in Float32.random(in: -1...1) }
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
#if !arch(x86_64)
|
|
46
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
47
|
+
private func randomFloat16(_ n: Int) -> [Float16] {
|
|
48
|
+
(0..<n).map { _ in Float16.random(in: -1...1) }
|
|
49
|
+
}
|
|
50
|
+
#endif // !arch(x86_64)
|
|
51
|
+
|
|
52
|
+
private func randomInt8(_ n: Int) -> [Int8] {
|
|
53
|
+
(0..<n).map { _ in Int8.random(in: .min ... .max) }
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
private func randomUInt8(_ n: Int) -> [UInt8] {
|
|
57
|
+
(0..<n).map { _ in UInt8.random(in: .min ... .max) }
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
private func randomBFloat16(_ n: Int) -> [BFloat16] {
|
|
61
|
+
(0..<n).map { _ in BFloat16(float: Float32.random(in: -1...1)) }
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
private func randomE4M3(_ n: Int) -> [E4M3] {
|
|
65
|
+
(0..<n).map { _ in E4M3(float: Float32.random(in: -1...1)) }
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
private func randomE5M2(_ n: Int) -> [E5M2] {
|
|
69
|
+
(0..<n).map { _ in E5M2(float: Float32.random(in: -1...1)) }
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
private func randomE2M3(_ n: Int) -> [E2M3] {
|
|
73
|
+
(0..<n).map { _ in E2M3(float: Float32.random(in: -1...1)) }
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
private func randomE3M2(_ n: Int) -> [E3M2] {
|
|
77
|
+
(0..<n).map { _ in E3M2(float: Float32.random(in: -1...1)) }
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
private func randomU1x8(_ n: Int) -> [U1x8] {
|
|
81
|
+
(0..<n).map { _ in U1x8(UInt8.random(in: .min ... .max)) }
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// MARK: - Capability Detection
|
|
85
|
+
|
|
86
|
+
private func capabilityNames(_ caps: nk_capability_t) -> String {
|
|
87
|
+
var names: [String] = []
|
|
88
|
+
if caps & 1 != 0 { names.append("serial") }
|
|
89
|
+
if caps & (1 << 1) != 0 { names.append("neon") }
|
|
90
|
+
if caps & (1 << 2) != 0 { names.append("haswell") }
|
|
91
|
+
if caps & (1 << 3) != 0 { names.append("skylake") }
|
|
92
|
+
if caps & (1 << 4) != 0 { names.append("neon_fp16") }
|
|
93
|
+
if caps & (1 << 5) != 0 { names.append("neon_sdot") }
|
|
94
|
+
if caps & (1 << 6) != 0 { names.append("neon_fhm") }
|
|
95
|
+
if caps & (1 << 7) != 0 { names.append("icelake") }
|
|
96
|
+
if caps & (1 << 8) != 0 { names.append("genoa") }
|
|
97
|
+
if caps & (1 << 9) != 0 { names.append("neon_bf16") }
|
|
98
|
+
if caps & (1 << 10) != 0 { names.append("sve") }
|
|
99
|
+
if caps & (1 << 11) != 0 { names.append("sve_fp16") }
|
|
100
|
+
if caps & (1 << 12) != 0 { names.append("sve_sdot") }
|
|
101
|
+
if caps & (1 << 17) != 0 { names.append("sapphire") }
|
|
102
|
+
if caps & (1 << 24) != 0 { names.append("sme") }
|
|
103
|
+
if caps & (1 << 25) != 0 { names.append("sme2") }
|
|
104
|
+
return names.joined(separator: ", ")
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// MARK: - Serial Dispatch Helper
|
|
108
|
+
|
|
109
|
+
private func withSerialDispatch(_ body: () -> Void) {
|
|
110
|
+
nk_dispatch_table_update(1) // nk_cap_serial_k
|
|
111
|
+
defer { nk_dispatch_table_update(nk_capabilities()) }
|
|
112
|
+
body()
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// MARK: - Pairwise Benchmark Helpers
|
|
116
|
+
|
|
117
|
+
extension XCTestCase {
|
|
118
|
+
/// Benchmarks a pairwise operation over `pairwiseReps` iterations, with optional serial-only dispatch.
|
|
119
|
+
func benchPairwise<T>(_ make: (Int) -> [T], _ op: @escaping ([T], [T]) -> Any?, serial: Bool = false) {
|
|
120
|
+
let dims = T.self == U1x8.self ? denseDims / 8 : denseDims
|
|
121
|
+
let a = make(dims)
|
|
122
|
+
let b = make(dims)
|
|
123
|
+
let body = { self.measure(metrics: [XCTClockMetric()]) { for _ in 0..<pairwiseReps { _ = op(a, b) } } }
|
|
124
|
+
if serial { withSerialDispatch(body) } else { body() }
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/// Benchmarks a packed matrix operation, with optional serial-only dispatch.
|
|
128
|
+
func benchPacked<T: NumKongDotsMatrixElement>(
|
|
129
|
+
_ make: (Int) -> [T], serial: Bool = false, _ op: @escaping (Tensor<T>, PackedMatrix<T>) throws -> Any
|
|
130
|
+
) throws {
|
|
131
|
+
let depth = T.self == U1x8.self ? matrixDepth / 8 : matrixDepth
|
|
132
|
+
let a = try Tensor<T>.fromArray(make(matrixHeight * depth), rows: matrixHeight, cols: depth)
|
|
133
|
+
let b = try Tensor<T>.fromArray(make(matrixWidth * depth), rows: matrixWidth, cols: depth)
|
|
134
|
+
let packed = try b.packForDots()
|
|
135
|
+
let body = { self.measure(metrics: [XCTClockMetric()]) { _ = try! op(a, packed) } }
|
|
136
|
+
if serial { withSerialDispatch(body) } else { body() }
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/// Benchmarks a symmetric matrix operation, with optional serial-only dispatch.
|
|
140
|
+
func benchSymmetric<T>(_ make: (Int) -> [T], serial: Bool = false, _ op: @escaping (Tensor<T>) throws -> Any) throws
|
|
141
|
+
{
|
|
142
|
+
let depth = T.self == U1x8.self ? matrixDepth / 8 : matrixDepth
|
|
143
|
+
let a = try Tensor<T>.fromArray(make(matrixHeight * depth), rows: matrixHeight, cols: depth)
|
|
144
|
+
let body = { self.measure(metrics: [XCTClockMetric()]) { _ = try! op(a) } }
|
|
145
|
+
if serial { withSerialDispatch(body) } else { body() }
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// MARK: - Info
|
|
150
|
+
|
|
151
|
+
final class BenchInfo: XCTestCase {
|
|
152
|
+
func testCapabilities() {
|
|
153
|
+
let caps = nk_capabilities()
|
|
154
|
+
let dynamic = nk_uses_dynamic_dispatch()
|
|
155
|
+
print("Capabilities: \(caps) [\(capabilityNames(caps))]")
|
|
156
|
+
print("Dynamic dispatch: \(dynamic != 0 ? "YES" : "NO")")
|
|
157
|
+
print("Dense dimensions: \(denseDims)")
|
|
158
|
+
print("Matrix: \(matrixHeight)×\(matrixDepth) × \(matrixWidth)×\(matrixDepth)")
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// MARK: - Pairwise: Dot
|
|
163
|
+
|
|
164
|
+
final class BenchDot: XCTestCase {
|
|
165
|
+
func testFloat64() { benchPairwise(randomFloat64) { $0.dot($1) } }
|
|
166
|
+
func testFloat64Serial() { benchPairwise(randomFloat64, { $0.dot($1) }, serial: true) }
|
|
167
|
+
func testFloat32() { benchPairwise(randomFloat32) { $0.dot($1) } }
|
|
168
|
+
func testFloat32Serial() { benchPairwise(randomFloat32, { $0.dot($1) }, serial: true) }
|
|
169
|
+
#if !arch(x86_64)
|
|
170
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
171
|
+
func testFloat16() { benchPairwise(randomFloat16) { $0.dot($1) } }
|
|
172
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
173
|
+
func testFloat16Serial() { benchPairwise(randomFloat16, { $0.dot($1) }, serial: true) }
|
|
174
|
+
#endif // !arch(x86_64)
|
|
175
|
+
func testBFloat16() { benchPairwise(randomBFloat16) { $0.dot($1) } }
|
|
176
|
+
func testBFloat16Serial() { benchPairwise(randomBFloat16, { $0.dot($1) }, serial: true) }
|
|
177
|
+
func testInt8() { benchPairwise(randomInt8) { $0.dot($1) } }
|
|
178
|
+
func testInt8Serial() { benchPairwise(randomInt8, { $0.dot($1) }, serial: true) }
|
|
179
|
+
func testUInt8() { benchPairwise(randomUInt8) { $0.dot($1) } }
|
|
180
|
+
func testUInt8Serial() { benchPairwise(randomUInt8, { $0.dot($1) }, serial: true) }
|
|
181
|
+
func testE4M3() { benchPairwise(randomE4M3) { $0.dot($1) } }
|
|
182
|
+
func testE4M3Serial() { benchPairwise(randomE4M3, { $0.dot($1) }, serial: true) }
|
|
183
|
+
func testE5M2() { benchPairwise(randomE5M2) { $0.dot($1) } }
|
|
184
|
+
func testE5M2Serial() { benchPairwise(randomE5M2, { $0.dot($1) }, serial: true) }
|
|
185
|
+
func testE2M3() { benchPairwise(randomE2M3) { $0.dot($1) } }
|
|
186
|
+
func testE2M3Serial() { benchPairwise(randomE2M3, { $0.dot($1) }, serial: true) }
|
|
187
|
+
func testE3M2() { benchPairwise(randomE3M2) { $0.dot($1) } }
|
|
188
|
+
func testE3M2Serial() { benchPairwise(randomE3M2, { $0.dot($1) }, serial: true) }
|
|
189
|
+
func testU1x8() { benchPairwise(randomU1x8) { $0.dot($1) } }
|
|
190
|
+
func testU1x8Serial() { benchPairwise(randomU1x8, { $0.dot($1) }, serial: true) }
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// MARK: - Pairwise: Angular
|
|
194
|
+
|
|
195
|
+
final class BenchAngular: XCTestCase {
|
|
196
|
+
func testFloat64() { benchPairwise(randomFloat64) { $0.angular($1) } }
|
|
197
|
+
func testFloat64Serial() { benchPairwise(randomFloat64, { $0.angular($1) }, serial: true) }
|
|
198
|
+
func testFloat32() { benchPairwise(randomFloat32) { $0.angular($1) } }
|
|
199
|
+
func testFloat32Serial() { benchPairwise(randomFloat32, { $0.angular($1) }, serial: true) }
|
|
200
|
+
#if !arch(x86_64)
|
|
201
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
202
|
+
func testFloat16() { benchPairwise(randomFloat16) { $0.angular($1) } }
|
|
203
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
204
|
+
func testFloat16Serial() { benchPairwise(randomFloat16, { $0.angular($1) }, serial: true) }
|
|
205
|
+
#endif // !arch(x86_64)
|
|
206
|
+
func testBFloat16() { benchPairwise(randomBFloat16) { $0.angular($1) } }
|
|
207
|
+
func testBFloat16Serial() { benchPairwise(randomBFloat16, { $0.angular($1) }, serial: true) }
|
|
208
|
+
func testInt8() { benchPairwise(randomInt8) { $0.angular($1) } }
|
|
209
|
+
func testInt8Serial() { benchPairwise(randomInt8, { $0.angular($1) }, serial: true) }
|
|
210
|
+
func testUInt8() { benchPairwise(randomUInt8) { $0.angular($1) } }
|
|
211
|
+
func testUInt8Serial() { benchPairwise(randomUInt8, { $0.angular($1) }, serial: true) }
|
|
212
|
+
func testE4M3() { benchPairwise(randomE4M3) { $0.angular($1) } }
|
|
213
|
+
func testE4M3Serial() { benchPairwise(randomE4M3, { $0.angular($1) }, serial: true) }
|
|
214
|
+
func testE5M2() { benchPairwise(randomE5M2) { $0.angular($1) } }
|
|
215
|
+
func testE5M2Serial() { benchPairwise(randomE5M2, { $0.angular($1) }, serial: true) }
|
|
216
|
+
func testE2M3() { benchPairwise(randomE2M3) { $0.angular($1) } }
|
|
217
|
+
func testE2M3Serial() { benchPairwise(randomE2M3, { $0.angular($1) }, serial: true) }
|
|
218
|
+
func testE3M2() { benchPairwise(randomE3M2) { $0.angular($1) } }
|
|
219
|
+
func testE3M2Serial() { benchPairwise(randomE3M2, { $0.angular($1) }, serial: true) }
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// MARK: - Pairwise: Euclidean
|
|
223
|
+
|
|
224
|
+
final class BenchEuclidean: XCTestCase {
|
|
225
|
+
func testFloat64() { benchPairwise(randomFloat64) { $0.euclidean($1) } }
|
|
226
|
+
func testFloat64Serial() { benchPairwise(randomFloat64, { $0.euclidean($1) }, serial: true) }
|
|
227
|
+
func testFloat32() { benchPairwise(randomFloat32) { $0.euclidean($1) } }
|
|
228
|
+
func testFloat32Serial() { benchPairwise(randomFloat32, { $0.euclidean($1) }, serial: true) }
|
|
229
|
+
#if !arch(x86_64)
|
|
230
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
231
|
+
func testFloat16() { benchPairwise(randomFloat16) { $0.euclidean($1) } }
|
|
232
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
233
|
+
func testFloat16Serial() { benchPairwise(randomFloat16, { $0.euclidean($1) }, serial: true) }
|
|
234
|
+
#endif // !arch(x86_64)
|
|
235
|
+
func testBFloat16() { benchPairwise(randomBFloat16) { $0.euclidean($1) } }
|
|
236
|
+
func testBFloat16Serial() { benchPairwise(randomBFloat16, { $0.euclidean($1) }, serial: true) }
|
|
237
|
+
func testInt8() { benchPairwise(randomInt8) { $0.euclidean($1) } }
|
|
238
|
+
func testInt8Serial() { benchPairwise(randomInt8, { $0.euclidean($1) }, serial: true) }
|
|
239
|
+
func testUInt8() { benchPairwise(randomUInt8) { $0.euclidean($1) } }
|
|
240
|
+
func testUInt8Serial() { benchPairwise(randomUInt8, { $0.euclidean($1) }, serial: true) }
|
|
241
|
+
func testE4M3() { benchPairwise(randomE4M3) { $0.euclidean($1) } }
|
|
242
|
+
func testE4M3Serial() { benchPairwise(randomE4M3, { $0.euclidean($1) }, serial: true) }
|
|
243
|
+
func testE5M2() { benchPairwise(randomE5M2) { $0.euclidean($1) } }
|
|
244
|
+
func testE5M2Serial() { benchPairwise(randomE5M2, { $0.euclidean($1) }, serial: true) }
|
|
245
|
+
func testE2M3() { benchPairwise(randomE2M3) { $0.euclidean($1) } }
|
|
246
|
+
func testE2M3Serial() { benchPairwise(randomE2M3, { $0.euclidean($1) }, serial: true) }
|
|
247
|
+
func testE3M2() { benchPairwise(randomE3M2) { $0.euclidean($1) } }
|
|
248
|
+
func testE3M2Serial() { benchPairwise(randomE3M2, { $0.euclidean($1) }, serial: true) }
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// MARK: - Pairwise: Squared Euclidean
|
|
252
|
+
|
|
253
|
+
final class BenchSqEuclidean: XCTestCase {
|
|
254
|
+
func testFloat64() { benchPairwise(randomFloat64) { $0.sqeuclidean($1) } }
|
|
255
|
+
func testFloat64Serial() { benchPairwise(randomFloat64, { $0.sqeuclidean($1) }, serial: true) }
|
|
256
|
+
func testFloat32() { benchPairwise(randomFloat32) { $0.sqeuclidean($1) } }
|
|
257
|
+
func testFloat32Serial() { benchPairwise(randomFloat32, { $0.sqeuclidean($1) }, serial: true) }
|
|
258
|
+
#if !arch(x86_64)
|
|
259
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
260
|
+
func testFloat16() { benchPairwise(randomFloat16) { $0.sqeuclidean($1) } }
|
|
261
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
262
|
+
func testFloat16Serial() { benchPairwise(randomFloat16, { $0.sqeuclidean($1) }, serial: true) }
|
|
263
|
+
#endif // !arch(x86_64)
|
|
264
|
+
func testBFloat16() { benchPairwise(randomBFloat16) { $0.sqeuclidean($1) } }
|
|
265
|
+
func testBFloat16Serial() { benchPairwise(randomBFloat16, { $0.sqeuclidean($1) }, serial: true) }
|
|
266
|
+
func testInt8() { benchPairwise(randomInt8) { $0.sqeuclidean($1) } }
|
|
267
|
+
func testInt8Serial() { benchPairwise(randomInt8, { $0.sqeuclidean($1) }, serial: true) }
|
|
268
|
+
func testUInt8() { benchPairwise(randomUInt8) { $0.sqeuclidean($1) } }
|
|
269
|
+
func testUInt8Serial() { benchPairwise(randomUInt8, { $0.sqeuclidean($1) }, serial: true) }
|
|
270
|
+
func testE4M3() { benchPairwise(randomE4M3) { $0.sqeuclidean($1) } }
|
|
271
|
+
func testE4M3Serial() { benchPairwise(randomE4M3, { $0.sqeuclidean($1) }, serial: true) }
|
|
272
|
+
func testE5M2() { benchPairwise(randomE5M2) { $0.sqeuclidean($1) } }
|
|
273
|
+
func testE5M2Serial() { benchPairwise(randomE5M2, { $0.sqeuclidean($1) }, serial: true) }
|
|
274
|
+
func testE2M3() { benchPairwise(randomE2M3) { $0.sqeuclidean($1) } }
|
|
275
|
+
func testE2M3Serial() { benchPairwise(randomE2M3, { $0.sqeuclidean($1) }, serial: true) }
|
|
276
|
+
func testE3M2() { benchPairwise(randomE3M2) { $0.sqeuclidean($1) } }
|
|
277
|
+
func testE3M2Serial() { benchPairwise(randomE3M2, { $0.sqeuclidean($1) }, serial: true) }
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// MARK: - Pairwise: Hamming (binary)
|
|
281
|
+
|
|
282
|
+
final class BenchHamming: XCTestCase {
|
|
283
|
+
func testU1x8() { benchPairwise(randomU1x8) { $0.hamming($1) } }
|
|
284
|
+
func testU1x8Serial() { benchPairwise(randomU1x8, { $0.hamming($1) }, serial: true) }
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// MARK: - Pairwise: Jaccard (binary)
|
|
288
|
+
|
|
289
|
+
final class BenchJaccard: XCTestCase {
|
|
290
|
+
func testU1x8() { benchPairwise(randomU1x8) { $0.jaccard($1) } }
|
|
291
|
+
func testU1x8Serial() { benchPairwise(randomU1x8, { $0.jaccard($1) }, serial: true) }
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// MARK: - Packed: Dots
|
|
295
|
+
|
|
296
|
+
final class BenchDotsPacked: XCTestCase {
|
|
297
|
+
func testFloat64() throws { try benchPacked(randomFloat64) { try $0.dotsPacked($1) } }
|
|
298
|
+
func testFloat64Serial() throws { try benchPacked(randomFloat64, serial: true) { try $0.dotsPacked($1) } }
|
|
299
|
+
func testFloat32() throws { try benchPacked(randomFloat32) { try $0.dotsPacked($1) } }
|
|
300
|
+
func testFloat32Serial() throws { try benchPacked(randomFloat32, serial: true) { try $0.dotsPacked($1) } }
|
|
301
|
+
#if !arch(x86_64)
|
|
302
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
303
|
+
func testFloat16() throws { try benchPacked(randomFloat16) { try $0.dotsPacked($1) } }
|
|
304
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
305
|
+
func testFloat16Serial() throws { try benchPacked(randomFloat16, serial: true) { try $0.dotsPacked($1) } }
|
|
306
|
+
#endif // !arch(x86_64)
|
|
307
|
+
func testBFloat16() throws { try benchPacked(randomBFloat16) { try $0.dotsPacked($1) } }
|
|
308
|
+
func testBFloat16Serial() throws { try benchPacked(randomBFloat16, serial: true) { try $0.dotsPacked($1) } }
|
|
309
|
+
func testInt8() throws { try benchPacked(randomInt8) { try $0.dotsPacked($1) } }
|
|
310
|
+
func testInt8Serial() throws { try benchPacked(randomInt8, serial: true) { try $0.dotsPacked($1) } }
|
|
311
|
+
func testUInt8() throws { try benchPacked(randomUInt8) { try $0.dotsPacked($1) } }
|
|
312
|
+
func testUInt8Serial() throws { try benchPacked(randomUInt8, serial: true) { try $0.dotsPacked($1) } }
|
|
313
|
+
func testE4M3() throws { try benchPacked(randomE4M3) { try $0.dotsPacked($1) } }
|
|
314
|
+
func testE4M3Serial() throws { try benchPacked(randomE4M3, serial: true) { try $0.dotsPacked($1) } }
|
|
315
|
+
func testE5M2() throws { try benchPacked(randomE5M2) { try $0.dotsPacked($1) } }
|
|
316
|
+
func testE5M2Serial() throws { try benchPacked(randomE5M2, serial: true) { try $0.dotsPacked($1) } }
|
|
317
|
+
func testE2M3() throws { try benchPacked(randomE2M3) { try $0.dotsPacked($1) } }
|
|
318
|
+
func testE2M3Serial() throws { try benchPacked(randomE2M3, serial: true) { try $0.dotsPacked($1) } }
|
|
319
|
+
func testE3M2() throws { try benchPacked(randomE3M2) { try $0.dotsPacked($1) } }
|
|
320
|
+
func testE3M2Serial() throws { try benchPacked(randomE3M2, serial: true) { try $0.dotsPacked($1) } }
|
|
321
|
+
func testU1x8() throws { try benchPacked(randomU1x8) { try $0.dotsPacked($1) } }
|
|
322
|
+
func testU1x8Serial() throws { try benchPacked(randomU1x8, serial: true) { try $0.dotsPacked($1) } }
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// MARK: - Packed: Angulars
|
|
326
|
+
|
|
327
|
+
final class BenchAngularsPacked: XCTestCase {
|
|
328
|
+
func testFloat64() throws { try benchPacked(randomFloat64) { try $0.angularsPacked($1) } }
|
|
329
|
+
func testFloat64Serial() throws { try benchPacked(randomFloat64, serial: true) { try $0.angularsPacked($1) } }
|
|
330
|
+
func testFloat32() throws { try benchPacked(randomFloat32) { try $0.angularsPacked($1) } }
|
|
331
|
+
func testFloat32Serial() throws { try benchPacked(randomFloat32, serial: true) { try $0.angularsPacked($1) } }
|
|
332
|
+
#if !arch(x86_64)
|
|
333
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
334
|
+
func testFloat16() throws { try benchPacked(randomFloat16) { try $0.angularsPacked($1) } }
|
|
335
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
336
|
+
func testFloat16Serial() throws { try benchPacked(randomFloat16, serial: true) { try $0.angularsPacked($1) } }
|
|
337
|
+
#endif // !arch(x86_64)
|
|
338
|
+
func testBFloat16() throws { try benchPacked(randomBFloat16) { try $0.angularsPacked($1) } }
|
|
339
|
+
func testBFloat16Serial() throws { try benchPacked(randomBFloat16, serial: true) { try $0.angularsPacked($1) } }
|
|
340
|
+
func testInt8() throws { try benchPacked(randomInt8) { try $0.angularsPacked($1) } }
|
|
341
|
+
func testInt8Serial() throws { try benchPacked(randomInt8, serial: true) { try $0.angularsPacked($1) } }
|
|
342
|
+
func testUInt8() throws { try benchPacked(randomUInt8) { try $0.angularsPacked($1) } }
|
|
343
|
+
func testUInt8Serial() throws { try benchPacked(randomUInt8, serial: true) { try $0.angularsPacked($1) } }
|
|
344
|
+
func testE4M3() throws { try benchPacked(randomE4M3) { try $0.angularsPacked($1) } }
|
|
345
|
+
func testE4M3Serial() throws { try benchPacked(randomE4M3, serial: true) { try $0.angularsPacked($1) } }
|
|
346
|
+
func testE5M2() throws { try benchPacked(randomE5M2) { try $0.angularsPacked($1) } }
|
|
347
|
+
func testE5M2Serial() throws { try benchPacked(randomE5M2, serial: true) { try $0.angularsPacked($1) } }
|
|
348
|
+
func testE2M3() throws { try benchPacked(randomE2M3) { try $0.angularsPacked($1) } }
|
|
349
|
+
func testE2M3Serial() throws { try benchPacked(randomE2M3, serial: true) { try $0.angularsPacked($1) } }
|
|
350
|
+
func testE3M2() throws { try benchPacked(randomE3M2) { try $0.angularsPacked($1) } }
|
|
351
|
+
func testE3M2Serial() throws { try benchPacked(randomE3M2, serial: true) { try $0.angularsPacked($1) } }
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// MARK: - Packed: Euclideans
|
|
355
|
+
|
|
356
|
+
final class BenchEuclideansPacked: XCTestCase {
|
|
357
|
+
func testFloat64() throws { try benchPacked(randomFloat64) { try $0.euclideansPacked($1) } }
|
|
358
|
+
func testFloat64Serial() throws { try benchPacked(randomFloat64, serial: true) { try $0.euclideansPacked($1) } }
|
|
359
|
+
func testFloat32() throws { try benchPacked(randomFloat32) { try $0.euclideansPacked($1) } }
|
|
360
|
+
func testFloat32Serial() throws { try benchPacked(randomFloat32, serial: true) { try $0.euclideansPacked($1) } }
|
|
361
|
+
#if !arch(x86_64)
|
|
362
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
363
|
+
func testFloat16() throws { try benchPacked(randomFloat16) { try $0.euclideansPacked($1) } }
|
|
364
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
365
|
+
func testFloat16Serial() throws { try benchPacked(randomFloat16, serial: true) { try $0.euclideansPacked($1) } }
|
|
366
|
+
#endif // !arch(x86_64)
|
|
367
|
+
func testBFloat16() throws { try benchPacked(randomBFloat16) { try $0.euclideansPacked($1) } }
|
|
368
|
+
func testBFloat16Serial() throws { try benchPacked(randomBFloat16, serial: true) { try $0.euclideansPacked($1) } }
|
|
369
|
+
func testInt8() throws { try benchPacked(randomInt8) { try $0.euclideansPacked($1) } }
|
|
370
|
+
func testInt8Serial() throws { try benchPacked(randomInt8, serial: true) { try $0.euclideansPacked($1) } }
|
|
371
|
+
func testUInt8() throws { try benchPacked(randomUInt8) { try $0.euclideansPacked($1) } }
|
|
372
|
+
func testUInt8Serial() throws { try benchPacked(randomUInt8, serial: true) { try $0.euclideansPacked($1) } }
|
|
373
|
+
func testE4M3() throws { try benchPacked(randomE4M3) { try $0.euclideansPacked($1) } }
|
|
374
|
+
func testE4M3Serial() throws { try benchPacked(randomE4M3, serial: true) { try $0.euclideansPacked($1) } }
|
|
375
|
+
func testE5M2() throws { try benchPacked(randomE5M2) { try $0.euclideansPacked($1) } }
|
|
376
|
+
func testE5M2Serial() throws { try benchPacked(randomE5M2, serial: true) { try $0.euclideansPacked($1) } }
|
|
377
|
+
func testE2M3() throws { try benchPacked(randomE2M3) { try $0.euclideansPacked($1) } }
|
|
378
|
+
func testE2M3Serial() throws { try benchPacked(randomE2M3, serial: true) { try $0.euclideansPacked($1) } }
|
|
379
|
+
func testE3M2() throws { try benchPacked(randomE3M2) { try $0.euclideansPacked($1) } }
|
|
380
|
+
func testE3M2Serial() throws { try benchPacked(randomE3M2, serial: true) { try $0.euclideansPacked($1) } }
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// MARK: - Packed: Hammings (binary)
|
|
384
|
+
|
|
385
|
+
final class BenchHammingsPacked: XCTestCase {
|
|
386
|
+
func testU1x8() throws { try benchPacked(randomU1x8) { try $0.hammingsPacked($1) } }
|
|
387
|
+
func testU1x8Serial() throws { try benchPacked(randomU1x8, serial: true) { try $0.hammingsPacked($1) } }
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// MARK: - Packed: Jaccards (binary)
|
|
391
|
+
|
|
392
|
+
final class BenchJaccardsPacked: XCTestCase {
|
|
393
|
+
func testU1x8() throws { try benchPacked(randomU1x8) { try $0.jaccardsPacked($1) } }
|
|
394
|
+
func testU1x8Serial() throws { try benchPacked(randomU1x8, serial: true) { try $0.jaccardsPacked($1) } }
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// MARK: - Symmetric: Dots
|
|
398
|
+
|
|
399
|
+
final class BenchDotsSymmetric: XCTestCase {
|
|
400
|
+
func testFloat64() throws { try benchSymmetric(randomFloat64) { try $0.dotsSymmetric() } }
|
|
401
|
+
func testFloat64Serial() throws { try benchSymmetric(randomFloat64, serial: true) { try $0.dotsSymmetric() } }
|
|
402
|
+
func testFloat32() throws { try benchSymmetric(randomFloat32) { try $0.dotsSymmetric() } }
|
|
403
|
+
func testFloat32Serial() throws { try benchSymmetric(randomFloat32, serial: true) { try $0.dotsSymmetric() } }
|
|
404
|
+
#if !arch(x86_64)
|
|
405
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
406
|
+
func testFloat16() throws { try benchSymmetric(randomFloat16) { try $0.dotsSymmetric() } }
|
|
407
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
408
|
+
func testFloat16Serial() throws { try benchSymmetric(randomFloat16, serial: true) { try $0.dotsSymmetric() } }
|
|
409
|
+
#endif // !arch(x86_64)
|
|
410
|
+
func testBFloat16() throws { try benchSymmetric(randomBFloat16) { try $0.dotsSymmetric() } }
|
|
411
|
+
func testBFloat16Serial() throws { try benchSymmetric(randomBFloat16, serial: true) { try $0.dotsSymmetric() } }
|
|
412
|
+
func testInt8() throws { try benchSymmetric(randomInt8) { try $0.dotsSymmetric() } }
|
|
413
|
+
func testInt8Serial() throws { try benchSymmetric(randomInt8, serial: true) { try $0.dotsSymmetric() } }
|
|
414
|
+
func testUInt8() throws { try benchSymmetric(randomUInt8) { try $0.dotsSymmetric() } }
|
|
415
|
+
func testUInt8Serial() throws { try benchSymmetric(randomUInt8, serial: true) { try $0.dotsSymmetric() } }
|
|
416
|
+
func testE4M3() throws { try benchSymmetric(randomE4M3) { try $0.dotsSymmetric() } }
|
|
417
|
+
func testE4M3Serial() throws { try benchSymmetric(randomE4M3, serial: true) { try $0.dotsSymmetric() } }
|
|
418
|
+
func testE5M2() throws { try benchSymmetric(randomE5M2) { try $0.dotsSymmetric() } }
|
|
419
|
+
func testE5M2Serial() throws { try benchSymmetric(randomE5M2, serial: true) { try $0.dotsSymmetric() } }
|
|
420
|
+
func testE2M3() throws { try benchSymmetric(randomE2M3) { try $0.dotsSymmetric() } }
|
|
421
|
+
func testE2M3Serial() throws { try benchSymmetric(randomE2M3, serial: true) { try $0.dotsSymmetric() } }
|
|
422
|
+
func testE3M2() throws { try benchSymmetric(randomE3M2) { try $0.dotsSymmetric() } }
|
|
423
|
+
func testE3M2Serial() throws { try benchSymmetric(randomE3M2, serial: true) { try $0.dotsSymmetric() } }
|
|
424
|
+
func testU1x8() throws { try benchSymmetric(randomU1x8) { try $0.dotsSymmetric() } }
|
|
425
|
+
func testU1x8Serial() throws { try benchSymmetric(randomU1x8, serial: true) { try $0.dotsSymmetric() } }
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
// MARK: - Symmetric: Angulars
|
|
429
|
+
|
|
430
|
+
final class BenchAngularsSymmetric: XCTestCase {
|
|
431
|
+
func testFloat64() throws { try benchSymmetric(randomFloat64) { try $0.angularsSymmetric() } }
|
|
432
|
+
func testFloat64Serial() throws { try benchSymmetric(randomFloat64, serial: true) { try $0.angularsSymmetric() } }
|
|
433
|
+
func testFloat32() throws { try benchSymmetric(randomFloat32) { try $0.angularsSymmetric() } }
|
|
434
|
+
func testFloat32Serial() throws { try benchSymmetric(randomFloat32, serial: true) { try $0.angularsSymmetric() } }
|
|
435
|
+
#if !arch(x86_64)
|
|
436
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
437
|
+
func testFloat16() throws { try benchSymmetric(randomFloat16) { try $0.angularsSymmetric() } }
|
|
438
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
439
|
+
func testFloat16Serial() throws {
|
|
440
|
+
try benchSymmetric(randomFloat16, serial: true) { try $0.angularsSymmetric() }
|
|
441
|
+
}
|
|
442
|
+
#endif // !arch(x86_64)
|
|
443
|
+
func testBFloat16() throws { try benchSymmetric(randomBFloat16) { try $0.angularsSymmetric() } }
|
|
444
|
+
func testBFloat16Serial() throws { try benchSymmetric(randomBFloat16, serial: true) { try $0.angularsSymmetric() } }
|
|
445
|
+
func testInt8() throws { try benchSymmetric(randomInt8) { try $0.angularsSymmetric() } }
|
|
446
|
+
func testInt8Serial() throws { try benchSymmetric(randomInt8, serial: true) { try $0.angularsSymmetric() } }
|
|
447
|
+
func testUInt8() throws { try benchSymmetric(randomUInt8) { try $0.angularsSymmetric() } }
|
|
448
|
+
func testUInt8Serial() throws { try benchSymmetric(randomUInt8, serial: true) { try $0.angularsSymmetric() } }
|
|
449
|
+
func testE4M3() throws { try benchSymmetric(randomE4M3) { try $0.angularsSymmetric() } }
|
|
450
|
+
func testE4M3Serial() throws { try benchSymmetric(randomE4M3, serial: true) { try $0.angularsSymmetric() } }
|
|
451
|
+
func testE5M2() throws { try benchSymmetric(randomE5M2) { try $0.angularsSymmetric() } }
|
|
452
|
+
func testE5M2Serial() throws { try benchSymmetric(randomE5M2, serial: true) { try $0.angularsSymmetric() } }
|
|
453
|
+
func testE2M3() throws { try benchSymmetric(randomE2M3) { try $0.angularsSymmetric() } }
|
|
454
|
+
func testE2M3Serial() throws { try benchSymmetric(randomE2M3, serial: true) { try $0.angularsSymmetric() } }
|
|
455
|
+
func testE3M2() throws { try benchSymmetric(randomE3M2) { try $0.angularsSymmetric() } }
|
|
456
|
+
func testE3M2Serial() throws { try benchSymmetric(randomE3M2, serial: true) { try $0.angularsSymmetric() } }
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
// MARK: - Symmetric: Euclideans
|
|
460
|
+
|
|
461
|
+
final class BenchEuclideansSymmetric: XCTestCase {
|
|
462
|
+
func testFloat64() throws { try benchSymmetric(randomFloat64) { try $0.euclideansSymmetric() } }
|
|
463
|
+
func testFloat64Serial() throws { try benchSymmetric(randomFloat64, serial: true) { try $0.euclideansSymmetric() } }
|
|
464
|
+
func testFloat32() throws { try benchSymmetric(randomFloat32) { try $0.euclideansSymmetric() } }
|
|
465
|
+
func testFloat32Serial() throws { try benchSymmetric(randomFloat32, serial: true) { try $0.euclideansSymmetric() } }
|
|
466
|
+
#if !arch(x86_64)
|
|
467
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
468
|
+
func testFloat16() throws { try benchSymmetric(randomFloat16) { try $0.euclideansSymmetric() } }
|
|
469
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
470
|
+
func testFloat16Serial() throws {
|
|
471
|
+
try benchSymmetric(randomFloat16, serial: true) { try $0.euclideansSymmetric() }
|
|
472
|
+
}
|
|
473
|
+
#endif // !arch(x86_64)
|
|
474
|
+
func testBFloat16() throws { try benchSymmetric(randomBFloat16) { try $0.euclideansSymmetric() } }
|
|
475
|
+
func testBFloat16Serial() throws {
|
|
476
|
+
try benchSymmetric(randomBFloat16, serial: true) { try $0.euclideansSymmetric() }
|
|
477
|
+
}
|
|
478
|
+
func testInt8() throws { try benchSymmetric(randomInt8) { try $0.euclideansSymmetric() } }
|
|
479
|
+
func testInt8Serial() throws { try benchSymmetric(randomInt8, serial: true) { try $0.euclideansSymmetric() } }
|
|
480
|
+
func testUInt8() throws { try benchSymmetric(randomUInt8) { try $0.euclideansSymmetric() } }
|
|
481
|
+
func testUInt8Serial() throws { try benchSymmetric(randomUInt8, serial: true) { try $0.euclideansSymmetric() } }
|
|
482
|
+
func testE4M3() throws { try benchSymmetric(randomE4M3) { try $0.euclideansSymmetric() } }
|
|
483
|
+
func testE4M3Serial() throws { try benchSymmetric(randomE4M3, serial: true) { try $0.euclideansSymmetric() } }
|
|
484
|
+
func testE5M2() throws { try benchSymmetric(randomE5M2) { try $0.euclideansSymmetric() } }
|
|
485
|
+
func testE5M2Serial() throws { try benchSymmetric(randomE5M2, serial: true) { try $0.euclideansSymmetric() } }
|
|
486
|
+
func testE2M3() throws { try benchSymmetric(randomE2M3) { try $0.euclideansSymmetric() } }
|
|
487
|
+
func testE2M3Serial() throws { try benchSymmetric(randomE2M3, serial: true) { try $0.euclideansSymmetric() } }
|
|
488
|
+
func testE3M2() throws { try benchSymmetric(randomE3M2) { try $0.euclideansSymmetric() } }
|
|
489
|
+
func testE3M2Serial() throws { try benchSymmetric(randomE3M2, serial: true) { try $0.euclideansSymmetric() } }
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
// MARK: - Symmetric: Hammings (binary)
|
|
493
|
+
|
|
494
|
+
final class BenchHammingsSymmetric: XCTestCase {
|
|
495
|
+
func testU1x8() throws { try benchSymmetric(randomU1x8) { try $0.hammingsSymmetric() } }
|
|
496
|
+
func testU1x8Serial() throws { try benchSymmetric(randomU1x8, serial: true) { try $0.hammingsSymmetric() } }
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
// MARK: - Symmetric: Jaccards (binary)
|
|
500
|
+
|
|
501
|
+
final class BenchJaccardsSymmetric: XCTestCase {
|
|
502
|
+
func testU1x8() throws { try benchSymmetric(randomU1x8) { try $0.jaccardsSymmetric() } }
|
|
503
|
+
func testU1x8Serial() throws { try benchSymmetric(randomU1x8, serial: true) { try $0.jaccardsSymmetric() } }
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
#endif // canImport(Darwin)
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
{
|
|
2
|
+
"variables": {
|
|
3
|
+
"openssl_fips": ""
|
|
4
|
+
},
|
|
5
|
+
"targets": [
|
|
6
|
+
{
|
|
7
|
+
"target_name": "numkong",
|
|
8
|
+
"sources": [
|
|
9
|
+
"javascript/numkong.c",
|
|
10
|
+
"c/numkong.c",
|
|
11
|
+
"c/dispatch_f64.c",
|
|
12
|
+
"c/dispatch_f32.c",
|
|
13
|
+
"c/dispatch_f16.c",
|
|
14
|
+
"c/dispatch_bf16.c",
|
|
15
|
+
"c/dispatch_i8.c",
|
|
16
|
+
"c/dispatch_u8.c",
|
|
17
|
+
"c/dispatch_u1.c",
|
|
18
|
+
"c/dispatch_e4m3.c",
|
|
19
|
+
"c/dispatch_e5m2.c",
|
|
20
|
+
"c/dispatch_other.c",
|
|
21
|
+
"c/dispatch_f64c.c",
|
|
22
|
+
"c/dispatch_f32c.c",
|
|
23
|
+
"c/dispatch_f16c.c",
|
|
24
|
+
"c/dispatch_bf16c.c",
|
|
25
|
+
"c/dispatch_i16.c",
|
|
26
|
+
"c/dispatch_i32.c",
|
|
27
|
+
"c/dispatch_i64.c",
|
|
28
|
+
"c/dispatch_u16.c",
|
|
29
|
+
"c/dispatch_u32.c",
|
|
30
|
+
"c/dispatch_u64.c",
|
|
31
|
+
"c/dispatch_i4.c",
|
|
32
|
+
"c/dispatch_u4.c",
|
|
33
|
+
"c/dispatch_e2m3.c",
|
|
34
|
+
"c/dispatch_e3m2.c",
|
|
35
|
+
],
|
|
36
|
+
"include_dirs": [
|
|
37
|
+
"include"
|
|
38
|
+
],
|
|
39
|
+
"defines": [
|
|
40
|
+
"NK_NATIVE_F16=0",
|
|
41
|
+
"NK_NATIVE_BF16=0",
|
|
42
|
+
"NK_DYNAMIC_DISPATCH=1",
|
|
43
|
+
"NK_USE_OPENMP=1"
|
|
44
|
+
],
|
|
45
|
+
"cflags": [
|
|
46
|
+
"-std=c11",
|
|
47
|
+
"-O3",
|
|
48
|
+
"-fopenmp",
|
|
49
|
+
"-Wno-unknown-pragmas",
|
|
50
|
+
"-Wno-maybe-uninitialized",
|
|
51
|
+
"-Wno-cast-function-type",
|
|
52
|
+
"-Wno-switch",
|
|
53
|
+
"-Wno-psabi",
|
|
54
|
+
"-include",
|
|
55
|
+
"<(module_root_dir)/nk_probes.h",
|
|
56
|
+
],
|
|
57
|
+
"ldflags": [
|
|
58
|
+
"-fopenmp"
|
|
59
|
+
],
|
|
60
|
+
"msvs_settings": {
|
|
61
|
+
"VCCLCompilerTool": {
|
|
62
|
+
"ForcedIncludeFiles": [
|
|
63
|
+
"<(module_root_dir)/nk_probes.h"
|
|
64
|
+
],
|
|
65
|
+
"AdditionalOptions": [
|
|
66
|
+
"/Zc:preprocessor",
|
|
67
|
+
"/openmp:llvm"
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
"conditions": [
|
|
72
|
+
# Pin TU baseline to each arch's ABI floor; SIMD kernels use per-function pragmas.
|
|
73
|
+
[
|
|
74
|
+
"OS!='win' and target_arch=='arm64'",
|
|
75
|
+
{
|
|
76
|
+
"cflags": [
|
|
77
|
+
"-march=armv8-a"
|
|
78
|
+
]
|
|
79
|
+
}
|
|
80
|
+
],
|
|
81
|
+
[
|
|
82
|
+
"OS!='win' and target_arch=='x64'",
|
|
83
|
+
{
|
|
84
|
+
"cflags": [
|
|
85
|
+
"-march=x86-64"
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
],
|
|
89
|
+
[
|
|
90
|
+
"OS!='win' and target_arch=='riscv64'",
|
|
91
|
+
{
|
|
92
|
+
"cflags": [
|
|
93
|
+
"-march=rv64gc"
|
|
94
|
+
]
|
|
95
|
+
}
|
|
96
|
+
],
|
|
97
|
+
# Forbid auto-vectorization so serial fallbacks don't get silently
|
|
98
|
+
# promoted to NEON/SSE2/VSX. SIMD kernels use explicit intrinsics
|
|
99
|
+
# and per-function `target` pragmas; unaffected. MSVC has no
|
|
100
|
+
# command-line vectorizer toggle.
|
|
101
|
+
[
|
|
102
|
+
"OS!='win'",
|
|
103
|
+
{
|
|
104
|
+
"cflags": [
|
|
105
|
+
"-fno-tree-vectorize",
|
|
106
|
+
"-fno-tree-slp-vectorize"
|
|
107
|
+
]
|
|
108
|
+
}
|
|
109
|
+
],
|
|
110
|
+
[
|
|
111
|
+
"OS=='mac'",
|
|
112
|
+
{
|
|
113
|
+
"xcode_settings": {
|
|
114
|
+
"MACOSX_DEPLOYMENT_TARGET": "11.0",
|
|
115
|
+
# Apple Clang ships no `omp.h`; the CI step
|
|
116
|
+
# `brew install libomp` makes it keg-only under
|
|
117
|
+
# `/opt/homebrew/opt/libomp` (arm64) or
|
|
118
|
+
# `/usr/local/opt/libomp` (x86_64). Clang silently
|
|
119
|
+
# ignores `-I` / `-L` dirs that don't exist, so
|
|
120
|
+
# listing both keeps the file arch-agnostic.
|
|
121
|
+
"OTHER_CFLAGS": [
|
|
122
|
+
"-Xpreprocessor",
|
|
123
|
+
"-fopenmp",
|
|
124
|
+
"-I/opt/homebrew/opt/libomp/include",
|
|
125
|
+
"-I/usr/local/opt/libomp/include"
|
|
126
|
+
],
|
|
127
|
+
"OTHER_LDFLAGS": [
|
|
128
|
+
"-lomp",
|
|
129
|
+
"-L/opt/homebrew/opt/libomp/lib",
|
|
130
|
+
"-L/usr/local/opt/libomp/lib"
|
|
131
|
+
]
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
],
|
|
135
|
+
# MSVC: no per-function target pragma; these match defaults.
|
|
136
|
+
[
|
|
137
|
+
"OS=='win' and target_arch=='arm64'",
|
|
138
|
+
{
|
|
139
|
+
"defines": [
|
|
140
|
+
"_ARM64_"
|
|
141
|
+
],
|
|
142
|
+
"msvs_settings": {
|
|
143
|
+
"VCCLCompilerTool": {
|
|
144
|
+
"AdditionalOptions": [
|
|
145
|
+
"/arch:armv8.0"
|
|
146
|
+
]
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
],
|
|
151
|
+
[
|
|
152
|
+
"OS=='win' and target_arch=='x64'",
|
|
153
|
+
{
|
|
154
|
+
"defines": [
|
|
155
|
+
"_AMD64_"
|
|
156
|
+
],
|
|
157
|
+
"msvs_settings": {
|
|
158
|
+
"VCCLCompilerTool": {
|
|
159
|
+
"AdditionalOptions": [
|
|
160
|
+
"/arch:SSE2"
|
|
161
|
+
]
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
],
|
|
166
|
+
],
|
|
167
|
+
}
|
|
168
|
+
],
|
|
169
|
+
}
|