usearch 2.21.4 → 2.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -24
- package/binding.gyp +15 -37
- package/c/CMakeLists.txt +4 -5
- package/c/README.md +7 -7
- package/c/lib.cpp +32 -14
- package/c/test.c +83 -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/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.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,61 @@
|
|
|
1
|
+
# cmake/nk_arm_isa_probes.cmake — Arm ISA compiler-capability probes
|
|
2
|
+
#
|
|
3
|
+
# Detect which ISA extensions the compiler can emit.
|
|
4
|
+
# Probe source lives in probes/arm_*.c — shared with setup.py and build.rs.
|
|
5
|
+
|
|
6
|
+
# Apple Clang 21+ recognises M-series CPUs under -mcpu=native and advertises
|
|
7
|
+
# SME/SME2/BF16 feature macros correctly. Older Apple Clang didn't, which is
|
|
8
|
+
# why earlier code hardcoded -mcpu=apple-m4 — but on a pre-M4 runner that
|
|
9
|
+
# hardcode over-reports capabilities and compiles in bfdot/SME kernels that
|
|
10
|
+
# SIGILL at runtime on hardware lacking those features.
|
|
11
|
+
if (APPLE)
|
|
12
|
+
set(nk_native_flags_ "-mcpu=native")
|
|
13
|
+
else ()
|
|
14
|
+
set(nk_native_flags_ "-march=native")
|
|
15
|
+
endif ()
|
|
16
|
+
include(cmake/nk_isa_probe.cmake)
|
|
17
|
+
|
|
18
|
+
nk_isa_probes_begin_()
|
|
19
|
+
|
|
20
|
+
# NEON base probes — MSVC /arch:armv8.X sets __ARM_ARCH but not __ARM_FEATURE_*
|
|
21
|
+
# macros; the probes accept __ARM_ARCH fallback (e.g., __ARM_ARCH >= 804 for dotprod).
|
|
22
|
+
# FEAT_AdvSIMD (baseline ARM64)
|
|
23
|
+
nk_isa_probe_(nk_target_neon "" "-march=armv8-a+simd" "probes/arm_neon.c")
|
|
24
|
+
# FEAT_FP16: optional from ARMv8.2, mandatory at ARMv9.0 with AdvSIMD
|
|
25
|
+
nk_isa_probe_(nk_target_neonhalf "/arch:armv8.2" "-march=armv8.2-a+simd+fp16" "probes/arm_neon_half.c")
|
|
26
|
+
# FEAT_DotProd: optional from ARMv8.1, mandatory at ARMv8.4 with AdvSIMD
|
|
27
|
+
nk_isa_probe_(nk_target_neonsdot "/arch:armv8.4" "-march=armv8.2-a+dotprod" "probes/arm_neon_sdot.c")
|
|
28
|
+
# FEAT_BF16: optional from ARMv8.2, mandatory at ARMv8.6 with FP
|
|
29
|
+
nk_isa_probe_(nk_target_neonbfdot "/arch:armv8.6" "-march=armv8.6-a+simd+bf16" "probes/arm_neon_bfdot.c")
|
|
30
|
+
# FEAT_FHM: optional from ARMv8.1, mandatory at ARMv8.4 with FP16
|
|
31
|
+
nk_isa_probe_(nk_target_neonfhm "/arch:armv8.4" "-march=armv8.2-a+simd+fp16+fp16fml" "probes/arm_neon_fhm.c")
|
|
32
|
+
|
|
33
|
+
# SVE probes
|
|
34
|
+
nk_isa_probe_(nk_target_sve "" "-march=armv8.2-a+sve" "probes/arm_sve.c")
|
|
35
|
+
nk_isa_probe_(nk_target_svehalf "" "-march=armv8.2-a+sve+fp16" "probes/arm_sve_half.c")
|
|
36
|
+
nk_isa_probe_(nk_target_svebfdot "" "-march=armv8.2-a+sve+bf16" "probes/arm_sve_bfdot.c")
|
|
37
|
+
nk_isa_probe_(nk_target_svesdot "" "-march=armv8.2-a+sve+dotprod" "probes/arm_sve_sdot.c")
|
|
38
|
+
nk_isa_probe_(nk_target_sve2 "" "-march=armv8.2-a+sve2" "probes/arm_sve2.c")
|
|
39
|
+
nk_isa_probe_(nk_target_sve2p1 "" "-march=armv8.2-a+sve2p1" "probes/arm_sve2p1.c")
|
|
40
|
+
|
|
41
|
+
# NEON FP8
|
|
42
|
+
nk_isa_probe_(nk_target_neonfp8 "" "-march=armv8-a+simd+fp8dot4" "probes/arm_neonfp8.c")
|
|
43
|
+
|
|
44
|
+
# SME probes
|
|
45
|
+
nk_isa_probe_(nk_target_sme "" "-march=armv8-a+sme" "probes/arm_sme.c")
|
|
46
|
+
nk_isa_probe_(nk_target_sme2 "" "-march=armv8-a+sme2" "probes/arm_sme2.c")
|
|
47
|
+
nk_isa_probe_(nk_target_sme2p1 "" "-march=armv8-a+sme2p1" "probes/arm_sme2p1.c")
|
|
48
|
+
nk_isa_probe_(nk_target_smef64 "" "-march=armv8-a+sme+sme-f64f64" "probes/arm_sme_f64.c")
|
|
49
|
+
nk_isa_probe_(nk_target_smehalf "" "-march=armv8-a+sme+sme-f16f16" "probes/arm_sme_half.c")
|
|
50
|
+
nk_isa_probe_(nk_target_smebf16 "" "-march=armv8-a+sme2+sme-b16b16" "probes/arm_sme_bf16.c")
|
|
51
|
+
nk_isa_probe_(nk_target_smebi32 "" "-march=armv8-a+sme2" "probes/arm_sme_bi32.c")
|
|
52
|
+
nk_isa_probe_(nk_target_smelut2 "" "-march=armv8-a+sme2+lut" "probes/arm_sme_lut2.c")
|
|
53
|
+
nk_isa_probe_(nk_target_smefa64 "" "-march=armv8-a+sme+sme-fa64" "probes/arm_sme_fa64.c")
|
|
54
|
+
|
|
55
|
+
nk_isa_probes_end_()
|
|
56
|
+
|
|
57
|
+
nk_build_isa_defs_(
|
|
58
|
+
arm
|
|
59
|
+
"Arm"
|
|
60
|
+
"NEON;NEONHALF;NEONSDOT;NEONBFDOT;NEONFHM;SVE;SVEHALF;SVEBFDOT;SVESDOT;SVE2;SVE2P1;NEONFP8;SME;SME2;SME2P1;SMEF64;SMEHALF;SMEBF16;SMEBI32;SMELUT2;SMEFA64"
|
|
61
|
+
)
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# cmake/nk_isa_probe.cmake — shared ISA probe infrastructure
|
|
2
|
+
#
|
|
3
|
+
# Provides the two-pass probe macro and result-list builder used by all
|
|
4
|
+
# per-architecture probe files (nk_x86_isa_probes.cmake, etc.).
|
|
5
|
+
#
|
|
6
|
+
# Each architecture file sets `nk_native_flags_` before including this file,
|
|
7
|
+
# then calls `nk_isa_probe_()` for each ISA and `nk_build_isa_defs_()` once
|
|
8
|
+
# to collect the results.
|
|
9
|
+
|
|
10
|
+
include(CheckSourceCompiles)
|
|
11
|
+
if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.19)
|
|
12
|
+
include(CheckSourceRuns)
|
|
13
|
+
endif ()
|
|
14
|
+
|
|
15
|
+
# Save and restore CMAKE_REQUIRED_FLAGS around probes.
|
|
16
|
+
# Force Release config for try_compile to avoid ASAN DLL-not-found failures.
|
|
17
|
+
# Call nk_isa_probes_begin_() before probe calls, nk_isa_probes_end_() after.
|
|
18
|
+
macro (nk_isa_probes_begin_)
|
|
19
|
+
set(nk_saved_required_flags_ "${CMAKE_REQUIRED_FLAGS}")
|
|
20
|
+
set(nk_saved_try_compile_config_ "${CMAKE_TRY_COMPILE_CONFIGURATION}")
|
|
21
|
+
set(CMAKE_TRY_COMPILE_CONFIGURATION "Release")
|
|
22
|
+
endmacro ()
|
|
23
|
+
|
|
24
|
+
macro (nk_isa_probes_end_)
|
|
25
|
+
set(CMAKE_REQUIRED_FLAGS "${nk_saved_required_flags_}")
|
|
26
|
+
set(CMAKE_TRY_COMPILE_CONFIGURATION "${nk_saved_try_compile_config_}")
|
|
27
|
+
endmacro ()
|
|
28
|
+
|
|
29
|
+
# Two-pass probe: compile with ISA flags (Pass 1) and native flags (Pass 2).
|
|
30
|
+
# Pass 1 result drives nk_shared (dynamic dispatch — compile all the compiler supports).
|
|
31
|
+
# Pass 2 result drives nk_test/nk_bench (must actually run on the local CPU).
|
|
32
|
+
#
|
|
33
|
+
# The native flag (`nk_native_flags_`) is set by the caller:
|
|
34
|
+
# x86/ARM/LoongArch: -march=native
|
|
35
|
+
# Power: -mcpu=native
|
|
36
|
+
# RISC-V: "" (no equivalent — falls back to Pass 1)
|
|
37
|
+
macro (nk_isa_probe_ var_ msvc_arch_ gcc_flags_ probe_file_)
|
|
38
|
+
file(READ "${CMAKE_CURRENT_SOURCE_DIR}/${probe_file_}" nk_probe_source_)
|
|
39
|
+
# Pass 1: can the compiler emit this ISA?
|
|
40
|
+
if (MSVC)
|
|
41
|
+
set(CMAKE_REQUIRED_FLAGS "${msvc_arch_}")
|
|
42
|
+
else ()
|
|
43
|
+
set(CMAKE_REQUIRED_FLAGS "${gcc_flags_}")
|
|
44
|
+
endif ()
|
|
45
|
+
check_source_compiles(C "${nk_probe_source_}" ${var_}_compiles)
|
|
46
|
+
# Pass 2: does the local CPU support it?
|
|
47
|
+
if (NOT CMAKE_CROSSCOMPILING AND NOT MSVC AND NOT "${nk_native_flags_}" STREQUAL "")
|
|
48
|
+
set(CMAKE_REQUIRED_FLAGS "${nk_native_flags_}")
|
|
49
|
+
check_source_compiles(C "${nk_probe_source_}" ${var_}_native)
|
|
50
|
+
elseif (NOT CMAKE_CROSSCOMPILING AND MSVC AND ${var_}_compiles AND CMAKE_VERSION VERSION_GREATER_EQUAL 3.19)
|
|
51
|
+
# MSVC has no -march=native; instead compile with ISA-specific flags and
|
|
52
|
+
# run the probe. If the CPU lacks the ISA the process will crash and
|
|
53
|
+
# check_source_runs() will report failure.
|
|
54
|
+
set(CMAKE_REQUIRED_FLAGS "${msvc_arch_}")
|
|
55
|
+
check_source_runs(C "${nk_probe_source_}" ${var_}_native)
|
|
56
|
+
else ()
|
|
57
|
+
set(${var_}_native ${${var_}_compiles})
|
|
58
|
+
endif ()
|
|
59
|
+
endmacro ()
|
|
60
|
+
|
|
61
|
+
# Build compile-only and native def lists from probe results.
|
|
62
|
+
# arch_prefix_: variable prefix, e.g. "x86" → nk_x86_compile_defs_
|
|
63
|
+
# arch_display_: human-readable name for status messages
|
|
64
|
+
# isa_list_: semicolon-separated list of ISA names, e.g. "HASWELL;SKYLAKE;..."
|
|
65
|
+
function (nk_build_isa_defs_ arch_prefix_ arch_display_ isa_list_)
|
|
66
|
+
set(compile_defs_ "")
|
|
67
|
+
set(native_defs_ "")
|
|
68
|
+
foreach (isa_ IN LISTS isa_list_)
|
|
69
|
+
string(TOLOWER "${isa_}" isa_lower_)
|
|
70
|
+
if (nk_target_${isa_lower_}_compiles)
|
|
71
|
+
list(APPEND compile_defs_ "NK_TARGET_${isa_}=1")
|
|
72
|
+
else ()
|
|
73
|
+
list(APPEND compile_defs_ "NK_TARGET_${isa_}=0")
|
|
74
|
+
endif ()
|
|
75
|
+
if (nk_target_${isa_lower_}_native)
|
|
76
|
+
list(APPEND native_defs_ "NK_TARGET_${isa_}=1")
|
|
77
|
+
else ()
|
|
78
|
+
list(APPEND native_defs_ "NK_TARGET_${isa_}=0")
|
|
79
|
+
endif ()
|
|
80
|
+
endforeach ()
|
|
81
|
+
if (compile_defs_)
|
|
82
|
+
message(STATUS "${arch_display_} ISA compile probes: ${compile_defs_}")
|
|
83
|
+
endif ()
|
|
84
|
+
if (native_defs_)
|
|
85
|
+
message(STATUS "${arch_display_} ISA native probes: ${native_defs_}")
|
|
86
|
+
endif ()
|
|
87
|
+
set(nk_${arch_prefix_}_compile_defs_ "${compile_defs_}" PARENT_SCOPE)
|
|
88
|
+
set(nk_${arch_prefix_}_native_defs_ "${native_defs_}" PARENT_SCOPE)
|
|
89
|
+
set(nk_${arch_prefix_}_isa_defs_ "${native_defs_}" PARENT_SCOPE)
|
|
90
|
+
endfunction ()
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# cmake/nk_loongarch_isa_probes.cmake — LoongArch ISA compiler-capability probes
|
|
2
|
+
#
|
|
3
|
+
# Detect which ISA extensions the compiler can emit.
|
|
4
|
+
# Probe source lives in probes/loongarch_*.c — shared with setup.py and build.rs.
|
|
5
|
+
|
|
6
|
+
set(nk_native_flags_ "-march=native")
|
|
7
|
+
include(cmake/nk_isa_probe.cmake)
|
|
8
|
+
|
|
9
|
+
nk_isa_probes_begin_()
|
|
10
|
+
|
|
11
|
+
nk_isa_probe_(nk_target_loongsonasx "" "-mlasx" "probes/loongarch_lasx.c")
|
|
12
|
+
|
|
13
|
+
nk_isa_probes_end_()
|
|
14
|
+
|
|
15
|
+
nk_build_isa_defs_(loongarch "LoongArch" "LOONGSONASX")
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# cmake/nk_math_lib.cmake
|
|
2
|
+
#
|
|
3
|
+
# Detect whether C++ targets need explicit linkage against `libm`.
|
|
4
|
+
# Some Unix toolchains require `-lm` for cmath symbols, while MSVC and
|
|
5
|
+
# WASM/WASI toolchains do not provide a separate math archive.
|
|
6
|
+
#
|
|
7
|
+
# Contract:
|
|
8
|
+
# Input: MSVC, NK_IS_WASI_PROJECT_, CMAKE_SYSTEM_NAME
|
|
9
|
+
# Output: caller-provided output variable with either "" or "m"
|
|
10
|
+
|
|
11
|
+
include(CheckCXXSourceCompiles)
|
|
12
|
+
|
|
13
|
+
function (nk_detect_cxx_math_lib_ output_var_)
|
|
14
|
+
set(${output_var_} "" PARENT_SCOPE)
|
|
15
|
+
|
|
16
|
+
if (MSVC OR NK_IS_WASI_PROJECT_ OR CMAKE_SYSTEM_NAME STREQUAL "Emscripten")
|
|
17
|
+
return()
|
|
18
|
+
endif ()
|
|
19
|
+
|
|
20
|
+
set(nk_cxx_math_probe_src_
|
|
21
|
+
"
|
|
22
|
+
#include <cmath>
|
|
23
|
+
int main() {
|
|
24
|
+
volatile double x = std::sqrt(2.0);
|
|
25
|
+
volatile double y = std::sin(x);
|
|
26
|
+
volatile double z = std::fma(x, y, 1.0);
|
|
27
|
+
return z == 0.0;
|
|
28
|
+
}
|
|
29
|
+
"
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
set(CMAKE_REQUIRED_QUIET ON)
|
|
33
|
+
set(CMAKE_REQUIRED_LIBRARIES "")
|
|
34
|
+
check_cxx_source_compiles("${nk_cxx_math_probe_src_}" nk_cxx_links_math_without_libm_)
|
|
35
|
+
|
|
36
|
+
if (NOT nk_cxx_links_math_without_libm_)
|
|
37
|
+
set(CMAKE_REQUIRED_LIBRARIES m)
|
|
38
|
+
check_cxx_source_compiles("${nk_cxx_math_probe_src_}" nk_cxx_links_math_with_libm_)
|
|
39
|
+
if (nk_cxx_links_math_with_libm_)
|
|
40
|
+
set(${output_var_} "m" PARENT_SCOPE)
|
|
41
|
+
endif ()
|
|
42
|
+
endif ()
|
|
43
|
+
|
|
44
|
+
unset(CMAKE_REQUIRED_LIBRARIES)
|
|
45
|
+
unset(CMAKE_REQUIRED_QUIET)
|
|
46
|
+
endfunction ()
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# cmake/nk_power_isa_probes.cmake — Power ISA compiler-capability probes
|
|
2
|
+
#
|
|
3
|
+
# Detect which ISA extensions the compiler can emit.
|
|
4
|
+
# Probe source lives in probes/power_*.c — shared with setup.py and build.rs.
|
|
5
|
+
|
|
6
|
+
set(nk_native_flags_ "-mcpu=native")
|
|
7
|
+
include(cmake/nk_isa_probe.cmake)
|
|
8
|
+
|
|
9
|
+
nk_isa_probes_begin_()
|
|
10
|
+
|
|
11
|
+
nk_isa_probe_(nk_target_powervsx "" "-mcpu=power9 -mvsx" "probes/power_vsx.c")
|
|
12
|
+
|
|
13
|
+
nk_isa_probes_end_()
|
|
14
|
+
|
|
15
|
+
nk_build_isa_defs_(power "Power" "POWERVSX")
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# cmake/nk_riscv_isa_probes.cmake — RISC-V ISA compiler-capability probes
|
|
2
|
+
#
|
|
3
|
+
# Detect which ISA extensions the compiler can emit.
|
|
4
|
+
# RISC-V has no -march=native, so native falls back to compile result.
|
|
5
|
+
# Probe source lives in probes/riscv_*.c — shared with setup.py and build.rs.
|
|
6
|
+
|
|
7
|
+
set(nk_native_flags_ "")
|
|
8
|
+
include(cmake/nk_isa_probe.cmake)
|
|
9
|
+
|
|
10
|
+
nk_isa_probes_begin_()
|
|
11
|
+
|
|
12
|
+
nk_isa_probe_(nk_target_rvv "" "-march=rv64gcv" "probes/riscv_rvv.c")
|
|
13
|
+
nk_isa_probe_(nk_target_rvvhalf "" "-march=rv64gcv_zvfh" "probes/riscv_rvv_half.c")
|
|
14
|
+
nk_isa_probe_(nk_target_rvvbf16 "" "-march=rv64gcv_zvfbfwma" "probes/riscv_rvv_bf16.c")
|
|
15
|
+
nk_isa_probe_(nk_target_rvvbb "" "-march=rv64gcv_zvbb" "probes/riscv_rvv_bb.c")
|
|
16
|
+
|
|
17
|
+
nk_isa_probes_end_()
|
|
18
|
+
|
|
19
|
+
nk_build_isa_defs_(riscv "RISC-V" "RVV;RVVHALF;RVVBF16;RVVBB")
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# cmake/nk_x86_isa_probes.cmake — x86 ISA compiler-capability probes
|
|
2
|
+
#
|
|
3
|
+
# Detect which ISA extensions the compiler can emit.
|
|
4
|
+
# Probe source lives in probes/x86_*.c — shared with setup.py and build.rs.
|
|
5
|
+
|
|
6
|
+
set(nk_native_flags_ "-march=native")
|
|
7
|
+
include(cmake/nk_isa_probe.cmake)
|
|
8
|
+
|
|
9
|
+
nk_isa_probes_begin_()
|
|
10
|
+
|
|
11
|
+
nk_isa_probe_(nk_target_haswell "/arch:AVX2" "-mavx2 -mfma -mf16c" "probes/x86_haswell.c")
|
|
12
|
+
|
|
13
|
+
nk_isa_probe_(nk_target_skylake "/arch:AVX512" "-mavx512f -mavx512bw -mavx512dq -mavx512vl" "probes/x86_skylake.c")
|
|
14
|
+
|
|
15
|
+
nk_isa_probe_(nk_target_icelake "/arch:AVX512" "-mavx512vnni -mavx512vl" "probes/x86_icelake.c")
|
|
16
|
+
|
|
17
|
+
nk_isa_probe_(nk_target_genoa "/arch:AVX512" "-mavx512bf16 -mavx512vl" "probes/x86_genoa.c")
|
|
18
|
+
|
|
19
|
+
nk_isa_probe_(nk_target_sapphire "/arch:AVX512" "-mavx512fp16 -mavx512vl" "probes/x86_sapphire.c")
|
|
20
|
+
|
|
21
|
+
nk_isa_probe_(nk_target_sapphireamx "/arch:AVX512" "-mamx-tile -mamx-int8" "probes/x86_sapphireamx.c")
|
|
22
|
+
|
|
23
|
+
nk_isa_probe_(nk_target_graniteamx "/arch:AVX512" "-mamx-tile -mamx-fp16" "probes/x86_graniteamx.c")
|
|
24
|
+
|
|
25
|
+
nk_isa_probe_(nk_target_diamond "/arch:AVX10.2" "-mavx10.2-512" "probes/x86_diamond.c")
|
|
26
|
+
|
|
27
|
+
nk_isa_probe_(nk_target_turin "/arch:AVX512" "-mavx512vp2intersect" "probes/x86_turin.c")
|
|
28
|
+
|
|
29
|
+
nk_isa_probe_(nk_target_alder "/arch:AVX2" "-mavxvnni" "probes/x86_alder.c")
|
|
30
|
+
|
|
31
|
+
nk_isa_probe_(nk_target_sierra "/arch:AVX2" "-mavxvnniint8" "probes/x86_sierra.c")
|
|
32
|
+
|
|
33
|
+
nk_isa_probes_end_()
|
|
34
|
+
|
|
35
|
+
nk_build_isa_defs_(x86 "x86" "HASWELL;SKYLAKE;ICELAKE;GENOA;SAPPHIRE;SAPPHIREAMX;GRANITEAMX;DIAMOND;TURIN;ALDER;SIERRA")
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# AArch64 GNU toolchain for NumKong.
|
|
2
|
+
#
|
|
3
|
+
# Usage:
|
|
4
|
+
# cmake -B build_arm64 -D CMAKE_TOOLCHAIN_FILE=cmake/toolchain-aarch64-gnu.cmake
|
|
5
|
+
# cmake --build build_arm64
|
|
6
|
+
#
|
|
7
|
+
# Prerequisites (choose one):
|
|
8
|
+
# Option A - Ubuntu/Debian packages:
|
|
9
|
+
# sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu qemu-user
|
|
10
|
+
# Option B - Arm GNU Toolchain (recommended for latest ISA support):
|
|
11
|
+
# Download from: https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads
|
|
12
|
+
# Set via AARCH64_TOOLCHAIN_PATH
|
|
13
|
+
#
|
|
14
|
+
# Testing with QEMU:
|
|
15
|
+
# Tests will automatically run under QEMU via CMAKE_CROSSCOMPILING_EMULATOR
|
|
16
|
+
#
|
|
17
|
+
# To customize the architecture, set AARCH64_MARCH before configuring:
|
|
18
|
+
# cmake -B build_arm64 -D CMAKE_TOOLCHAIN_FILE=cmake/toolchain-aarch64-gnu.cmake -D AARCH64_MARCH=armv8.2-a+sve
|
|
19
|
+
|
|
20
|
+
set(CMAKE_SYSTEM_NAME Linux)
|
|
21
|
+
set(CMAKE_SYSTEM_PROCESSOR aarch64)
|
|
22
|
+
|
|
23
|
+
# Cross-compiler detection with fallback chain:
|
|
24
|
+
# 1. AARCH64_TOOLCHAIN_PATH (explicit path to Arm GNU Toolchain)
|
|
25
|
+
# 2. /tmp/aarch64 (default Arm GNU Toolchain location)
|
|
26
|
+
# 3. System packages (aarch64-linux-gnu-)
|
|
27
|
+
if (DEFINED AARCH64_TOOLCHAIN_PATH)
|
|
28
|
+
set(AARCH64_TOOLCHAIN_PREFIX "${AARCH64_TOOLCHAIN_PATH}/bin/aarch64-none-linux-gnu-")
|
|
29
|
+
set(CMAKE_SYSROOT "${AARCH64_TOOLCHAIN_PATH}/aarch64-none-linux-gnu/libc")
|
|
30
|
+
elseif (NOT DEFINED AARCH64_TOOLCHAIN_PREFIX)
|
|
31
|
+
set(AARCH64_TOOLCHAIN_PREFIX "aarch64-linux-gnu-")
|
|
32
|
+
endif ()
|
|
33
|
+
|
|
34
|
+
set(CMAKE_C_COMPILER ${AARCH64_TOOLCHAIN_PREFIX}gcc)
|
|
35
|
+
set(CMAKE_CXX_COMPILER ${AARCH64_TOOLCHAIN_PREFIX}g++)
|
|
36
|
+
|
|
37
|
+
# Target architecture with modern Arm extensions
|
|
38
|
+
# Default: Enables all extensions supported by NumKong
|
|
39
|
+
#
|
|
40
|
+
# Architecture hierarchy:
|
|
41
|
+
# armv8-a : Base AArch64 (NEON mandatory)
|
|
42
|
+
# armv8.2-a : +fp16 (half-precision), +dotprod available
|
|
43
|
+
# armv8.4-a : +bf16 (bfloat16) available
|
|
44
|
+
# armv8.6-a : +i8mm (int8 matrix multiply) available
|
|
45
|
+
# armv9-a : SVE2 mandatory, +sme available
|
|
46
|
+
# armv9.2-a : +sme2 available
|
|
47
|
+
#
|
|
48
|
+
# NumKong Arm targets and required extensions:
|
|
49
|
+
# NK_TARGET_NEON : Base NEON (automatic with aarch64)
|
|
50
|
+
# NK_TARGET_NEONHALF : +fp16
|
|
51
|
+
# NK_TARGET_NEONBFDOT : +bf16
|
|
52
|
+
# NK_TARGET_NEONFHM : +fp16fml (FMLAL/FMLSL widening ops)
|
|
53
|
+
# NK_TARGET_NEONSDOT : +dotprod
|
|
54
|
+
# NK_TARGET_SVE : +sve
|
|
55
|
+
# NK_TARGET_SVEHALF : +sve +fp16
|
|
56
|
+
# NK_TARGET_SVEBFDOT : +sve +bf16
|
|
57
|
+
# NK_TARGET_SVE2 : +sve2
|
|
58
|
+
# NK_TARGET_SME : +sme
|
|
59
|
+
# NK_TARGET_SME2 : +sme2
|
|
60
|
+
#
|
|
61
|
+
# Common CPU profiles:
|
|
62
|
+
# armv8.2-a+fp16+dotprod : Apple M1, Ampere Altra
|
|
63
|
+
# armv8.4-a+sve+fp16+bf16+i8mm : AWS Graviton 3, Neoverse V1
|
|
64
|
+
# armv9-a+sve2+fp16+bf16+i8mm : Neoverse V2, Cortex-X3
|
|
65
|
+
# armv9.2-a+sve2+sme2+fp16+bf16+i8mm+fp16fml : Future SME2-capable CPUs
|
|
66
|
+
#
|
|
67
|
+
# Default: armv9-a with SVE2 and common extensions (GCC 13 compatible)
|
|
68
|
+
# For SME/SME2 support, use GCC 14+ and set:
|
|
69
|
+
# -DAARCH64_MARCH="armv9.2-a+sve2+sme2+fp16+bf16+i8mm+dotprod+fp16fml"
|
|
70
|
+
if (NOT DEFINED AARCH64_MARCH)
|
|
71
|
+
set(AARCH64_MARCH "armv9-a+sve2+fp16+bf16+i8mm+dotprod+fp16fml")
|
|
72
|
+
endif ()
|
|
73
|
+
|
|
74
|
+
set(CMAKE_C_FLAGS_INIT "-march=${AARCH64_MARCH}")
|
|
75
|
+
set(CMAKE_CXX_FLAGS_INIT "-march=${AARCH64_MARCH}")
|
|
76
|
+
|
|
77
|
+
# QEMU user-mode emulation for running tests.
|
|
78
|
+
# -cpu max enables all supported features.
|
|
79
|
+
# For specific CPU emulation: -cpu neoverse-v1, -cpu neoverse-v2, etc.
|
|
80
|
+
set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-aarch64;-cpu;max")
|
|
81
|
+
|
|
82
|
+
# Search paths for libraries and headers (target system only).
|
|
83
|
+
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
|
84
|
+
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
|
85
|
+
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
|
86
|
+
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Android ARM64 toolchain for NumKong.
|
|
2
|
+
#
|
|
3
|
+
# Usage:
|
|
4
|
+
# export ANDROID_NDK_ROOT=/path/to/android-ndk-r29
|
|
5
|
+
# cmake -B build_android -D CMAKE_TOOLCHAIN_FILE=cmake/toolchain-android-arm64.cmake \
|
|
6
|
+
# -D NK_BUILD_SHARED=ON
|
|
7
|
+
# cmake --build build_android
|
|
8
|
+
#
|
|
9
|
+
# Requires ANDROID_NDK_ROOT or ANDROID_NDK to point to the NDK.
|
|
10
|
+
|
|
11
|
+
# Locate the NDK.
|
|
12
|
+
if (DEFINED ENV{ANDROID_NDK_ROOT})
|
|
13
|
+
set(_ndk_root "$ENV{ANDROID_NDK_ROOT}")
|
|
14
|
+
elseif (DEFINED ENV{ANDROID_NDK})
|
|
15
|
+
set(_ndk_root "$ENV{ANDROID_NDK}")
|
|
16
|
+
else ()
|
|
17
|
+
message(FATAL_ERROR "Set ANDROID_NDK_ROOT or ANDROID_NDK to the NDK installation path")
|
|
18
|
+
endif ()
|
|
19
|
+
|
|
20
|
+
# Defaults for ARM64 Android.
|
|
21
|
+
set(ANDROID_ABI "arm64-v8a" CACHE STRING "Android ABI")
|
|
22
|
+
set(ANDROID_PLATFORM "android-28" CACHE STRING "Minimum Android API level")
|
|
23
|
+
|
|
24
|
+
# Delegate to the NDK's own toolchain.
|
|
25
|
+
include("${_ndk_root}/build/cmake/android.toolchain.cmake")
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Android ARMv7 toolchain for NumKong.
|
|
2
|
+
#
|
|
3
|
+
# Usage:
|
|
4
|
+
# export ANDROID_NDK_ROOT=/path/to/android-ndk-r29
|
|
5
|
+
# cmake -B build_android_armv7 -D CMAKE_TOOLCHAIN_FILE=cmake/toolchain-android-armv7.cmake \
|
|
6
|
+
# -D NK_BUILD_SHARED=ON
|
|
7
|
+
# cmake --build build_android_armv7
|
|
8
|
+
#
|
|
9
|
+
# Requires ANDROID_NDK_ROOT or ANDROID_NDK to point to the NDK.
|
|
10
|
+
|
|
11
|
+
# Locate the NDK.
|
|
12
|
+
if (DEFINED ENV{ANDROID_NDK_ROOT})
|
|
13
|
+
set(_ndk_root "$ENV{ANDROID_NDK_ROOT}")
|
|
14
|
+
elseif (DEFINED ENV{ANDROID_NDK})
|
|
15
|
+
set(_ndk_root "$ENV{ANDROID_NDK}")
|
|
16
|
+
else ()
|
|
17
|
+
message(FATAL_ERROR "Set ANDROID_NDK_ROOT or ANDROID_NDK to the NDK installation path")
|
|
18
|
+
endif ()
|
|
19
|
+
|
|
20
|
+
# Defaults for 32-bit ARM Android with NEON.
|
|
21
|
+
set(ANDROID_ABI "armeabi-v7a" CACHE STRING "Android ABI")
|
|
22
|
+
set(ANDROID_PLATFORM "android-28" CACHE STRING "Minimum Android API level")
|
|
23
|
+
|
|
24
|
+
# Delegate to the NDK's own toolchain.
|
|
25
|
+
include("${_ndk_root}/build/cmake/android.toolchain.cmake")
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# LoongArch 64 GNU toolchain for NumKong.
|
|
2
|
+
#
|
|
3
|
+
# Usage:
|
|
4
|
+
# cmake -B build_loongarch -D CMAKE_TOOLCHAIN_FILE=cmake/toolchain-loongarch64-gnu.cmake
|
|
5
|
+
# cmake --build build_loongarch
|
|
6
|
+
#
|
|
7
|
+
# Optional inputs:
|
|
8
|
+
# -D LOONGARCH_TOOLCHAIN_PATH=/path/to/loongarch-gnu-toolchain
|
|
9
|
+
# -D LOONGARCH_SYSROOT=/path/to/loongarch64/sysroot
|
|
10
|
+
#
|
|
11
|
+
# Prerequisites:
|
|
12
|
+
# sudo apt install gcc-loongarch64-linux-gnu g++-loongarch64-linux-gnu qemu-user
|
|
13
|
+
#
|
|
14
|
+
# Testing with QEMU:
|
|
15
|
+
# Tests will automatically run under QEMU via CMAKE_CROSSCOMPILING_EMULATOR
|
|
16
|
+
|
|
17
|
+
set(CMAKE_SYSTEM_NAME Linux)
|
|
18
|
+
set(CMAKE_SYSTEM_PROCESSOR loongarch64)
|
|
19
|
+
|
|
20
|
+
# Cross-compiler.
|
|
21
|
+
# Set LOONGARCH_TOOLCHAIN_PATH to override the default location.
|
|
22
|
+
if (NOT DEFINED LOONGARCH_TOOLCHAIN_PATH)
|
|
23
|
+
if (DEFINED ENV{LOONGARCH_TOOLCHAIN_PATH})
|
|
24
|
+
set(LOONGARCH_TOOLCHAIN_PATH "$ENV{LOONGARCH_TOOLCHAIN_PATH}")
|
|
25
|
+
else ()
|
|
26
|
+
set(LOONGARCH_TOOLCHAIN_PATH "/tmp/loongarch")
|
|
27
|
+
endif ()
|
|
28
|
+
endif ()
|
|
29
|
+
set(LOONGARCH_TOOLCHAIN_PATH "${LOONGARCH_TOOLCHAIN_PATH}" CACHE PATH "LoongArch GNU toolchain root")
|
|
30
|
+
set(ENV{LOONGARCH_TOOLCHAIN_PATH} "${LOONGARCH_TOOLCHAIN_PATH}")
|
|
31
|
+
|
|
32
|
+
set(CMAKE_C_COMPILER "${LOONGARCH_TOOLCHAIN_PATH}/bin/loongarch64-unknown-linux-gnu-gcc")
|
|
33
|
+
set(CMAKE_CXX_COMPILER "${LOONGARCH_TOOLCHAIN_PATH}/bin/loongarch64-unknown-linux-gnu-g++")
|
|
34
|
+
|
|
35
|
+
# Sysroot for the target system.
|
|
36
|
+
if (NOT DEFINED LOONGARCH_SYSROOT)
|
|
37
|
+
if (DEFINED ENV{LOONGARCH_SYSROOT})
|
|
38
|
+
set(LOONGARCH_SYSROOT "$ENV{LOONGARCH_SYSROOT}")
|
|
39
|
+
else ()
|
|
40
|
+
set(LOONGARCH_SYSROOT "${LOONGARCH_TOOLCHAIN_PATH}/sysroot")
|
|
41
|
+
endif ()
|
|
42
|
+
endif ()
|
|
43
|
+
set(LOONGARCH_SYSROOT "${LOONGARCH_SYSROOT}" CACHE PATH "LoongArch sysroot for GNU cross-compilation")
|
|
44
|
+
set(ENV{LOONGARCH_SYSROOT} "${LOONGARCH_SYSROOT}")
|
|
45
|
+
set(CMAKE_SYSROOT "${LOONGARCH_SYSROOT}")
|
|
46
|
+
|
|
47
|
+
# Forward custom variables to nested try_compile() projects.
|
|
48
|
+
list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES LOONGARCH_TOOLCHAIN_PATH LOONGARCH_SYSROOT)
|
|
49
|
+
|
|
50
|
+
# Toolchain validation only needs to prove the project compiles.
|
|
51
|
+
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
|
|
52
|
+
|
|
53
|
+
# Enable LASX (256-bit SIMD) by default.
|
|
54
|
+
# The base ABI is lp64d (64-bit pointers, double-precision floats in FP registers).
|
|
55
|
+
set(CMAKE_C_FLAGS_INIT "-mlasx")
|
|
56
|
+
set(CMAKE_CXX_FLAGS_INIT "-mlasx")
|
|
57
|
+
|
|
58
|
+
# QEMU user-mode emulation for running tests.
|
|
59
|
+
# -L sysroot provides the dynamic linker path.
|
|
60
|
+
# -cpu max enables all supported extensions.
|
|
61
|
+
set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-loongarch64;-L;${LOONGARCH_SYSROOT};-cpu;max")
|
|
62
|
+
|
|
63
|
+
# Search paths for libraries and headers (target system only).
|
|
64
|
+
set(CMAKE_FIND_ROOT_PATH "${LOONGARCH_SYSROOT}")
|
|
65
|
+
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
|
66
|
+
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
|
67
|
+
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
|
68
|
+
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Power ppc64le GNU toolchain for NumKong.
|
|
2
|
+
#
|
|
3
|
+
# Usage:
|
|
4
|
+
# cmake -B build_ppc -D CMAKE_TOOLCHAIN_FILE=cmake/toolchain-ppc64le-gnu.cmake
|
|
5
|
+
# cmake --build build_ppc
|
|
6
|
+
#
|
|
7
|
+
# Optional inputs:
|
|
8
|
+
# -D PPC_TOOLCHAIN_PATH=/path/to/powerpc64le-linux-gnu
|
|
9
|
+
# -D PPC_SYSROOT=/path/to/ppc64le/sysroot
|
|
10
|
+
# -D PPC_MCPU=power10
|
|
11
|
+
#
|
|
12
|
+
# Prerequisites:
|
|
13
|
+
# sudo apt install gcc-powerpc64le-linux-gnu g++-powerpc64le-linux-gnu libc6-dev-ppc64el-cross qemu-user
|
|
14
|
+
#
|
|
15
|
+
# Testing with QEMU:
|
|
16
|
+
# Tests will automatically run under QEMU via CMAKE_CROSSCOMPILING_EMULATOR
|
|
17
|
+
|
|
18
|
+
set(CMAKE_SYSTEM_NAME Linux)
|
|
19
|
+
set(CMAKE_SYSTEM_PROCESSOR ppc64le)
|
|
20
|
+
|
|
21
|
+
# Cross-compiler from the system package (gcc-powerpc64le-linux-gnu).
|
|
22
|
+
set(CMAKE_C_COMPILER powerpc64le-linux-gnu-gcc)
|
|
23
|
+
set(CMAKE_CXX_COMPILER powerpc64le-linux-gnu-g++)
|
|
24
|
+
|
|
25
|
+
# Sysroot for the target system.
|
|
26
|
+
if (NOT DEFINED PPC_SYSROOT)
|
|
27
|
+
if (DEFINED ENV{PPC_SYSROOT})
|
|
28
|
+
set(PPC_SYSROOT "$ENV{PPC_SYSROOT}")
|
|
29
|
+
else ()
|
|
30
|
+
# Default: derive from the cross-compiler
|
|
31
|
+
execute_process(
|
|
32
|
+
COMMAND powerpc64le-linux-gnu-gcc -print-sysroot OUTPUT_VARIABLE PPC_SYSROOT
|
|
33
|
+
OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET
|
|
34
|
+
)
|
|
35
|
+
if (NOT PPC_SYSROOT OR PPC_SYSROOT STREQUAL "")
|
|
36
|
+
set(PPC_SYSROOT "/usr/powerpc64le-linux-gnu")
|
|
37
|
+
endif ()
|
|
38
|
+
endif ()
|
|
39
|
+
endif ()
|
|
40
|
+
set(PPC_SYSROOT "${PPC_SYSROOT}" CACHE PATH "ppc64le sysroot for GNU cross-compilation")
|
|
41
|
+
set(CMAKE_SYSROOT "${PPC_SYSROOT}")
|
|
42
|
+
|
|
43
|
+
# Target CPU microarchitecture.
|
|
44
|
+
# power9: VSX + vec_xl_len + vec_cmpne + f16 conversion (minimum for NumKong powervsx backend).
|
|
45
|
+
# power10: adds MMA + native bf16 conversions (future powermma backend).
|
|
46
|
+
if (NOT DEFINED PPC_MCPU)
|
|
47
|
+
if (DEFINED ENV{PPC_MCPU})
|
|
48
|
+
set(PPC_MCPU "$ENV{PPC_MCPU}")
|
|
49
|
+
else ()
|
|
50
|
+
set(PPC_MCPU "power9")
|
|
51
|
+
endif ()
|
|
52
|
+
endif ()
|
|
53
|
+
set(PPC_MCPU "${PPC_MCPU}" CACHE STRING "Power CPU target for cross-compilation")
|
|
54
|
+
|
|
55
|
+
# Forward settings to nested try_compile() invocations.
|
|
56
|
+
list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES PPC_SYSROOT PPC_MCPU)
|
|
57
|
+
|
|
58
|
+
# Toolchain validation only needs to prove the project compiles.
|
|
59
|
+
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
|
|
60
|
+
|
|
61
|
+
set(CMAKE_C_FLAGS_INIT "-mcpu=${PPC_MCPU} -mvsx")
|
|
62
|
+
set(CMAKE_CXX_FLAGS_INIT "-mcpu=${PPC_MCPU} -mvsx")
|
|
63
|
+
|
|
64
|
+
# QEMU user-mode emulation for running tests.
|
|
65
|
+
# -L sysroot provides the dynamic linker path.
|
|
66
|
+
# -cpu power9 matches our POWER9+ baseline (older QEMU lacks "-cpu max" for ppc64le).
|
|
67
|
+
set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-ppc64le;-L;${PPC_SYSROOT};-cpu;power9")
|
|
68
|
+
|
|
69
|
+
# Search paths for libraries and headers (target system only).
|
|
70
|
+
set(CMAKE_FIND_ROOT_PATH "${PPC_SYSROOT}")
|
|
71
|
+
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
|
72
|
+
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
|
73
|
+
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
|
74
|
+
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
|