Skip to content

Commit

Permalink
Fix: Overriding SIMD feature flags on Arm
Browse files Browse the repository at this point in the history
  • Loading branch information
ashvardanian committed Oct 21, 2024
1 parent 708d034 commit c46d472
Show file tree
Hide file tree
Showing 9 changed files with 159 additions and 116 deletions.
8 changes: 4 additions & 4 deletions include/simsimd/binary.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ SIMSIMD_PUBLIC void simsimd_jaccard_b8_serial(simsimd_b8_t const* a, simsimd_b8_
*result = (union_ != 0) ? 1 - (simsimd_f64_t)intersection / (simsimd_f64_t)union_ : 1;
}

#if SIMSIMD_TARGET_ARM
#if _SIMSIMD_TARGET_ARM
#if SIMSIMD_TARGET_NEON
#pragma GCC push_options
#pragma GCC target("arch=armv8.2-a+simd")
Expand Down Expand Up @@ -232,9 +232,9 @@ SIMSIMD_PUBLIC void simsimd_jaccard_b8_sve(simsimd_b8_t const* a, simsimd_b8_t c
#pragma clang attribute pop
#pragma GCC pop_options
#endif // SIMSIMD_TARGET_SVE
#endif // SIMSIMD_TARGET_ARM
#endif // _SIMSIMD_TARGET_ARM

#if SIMSIMD_TARGET_X86
#if _SIMSIMD_TARGET_X86
#if SIMSIMD_TARGET_ICE
#pragma GCC push_options
#pragma GCC target("avx2", "avx512f", "avx512vl", "bmi2", "avx512bw", "avx512vpopcntdq")
Expand Down Expand Up @@ -456,7 +456,7 @@ SIMSIMD_PUBLIC void simsimd_jaccard_b8_haswell(simsimd_b8_t const* a, simsimd_b8
#pragma clang attribute pop
#pragma GCC pop_options
#endif // SIMSIMD_TARGET_HASWELL
#endif // SIMSIMD_TARGET_X86
#endif // _SIMSIMD_TARGET_X86

#ifdef __cplusplus
}
Expand Down
8 changes: 4 additions & 4 deletions include/simsimd/curved.h
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ SIMSIMD_MAKE_MAHALANOBIS(accurate, f16, f64, SIMSIMD_F16_TO_F32) // simsimd_maha
SIMSIMD_MAKE_BILINEAR(accurate, bf16, f64, SIMSIMD_BF16_TO_F32) // simsimd_bilinear_bf16_accurate
SIMSIMD_MAKE_MAHALANOBIS(accurate, bf16, f64, SIMSIMD_BF16_TO_F32) // simsimd_mahalanobis_bf16_accurate

#if SIMSIMD_TARGET_ARM
#if _SIMSIMD_TARGET_ARM
#if SIMSIMD_TARGET_NEON
#pragma GCC push_options
#pragma GCC target("arch=armv8.2-a+simd")
Expand Down Expand Up @@ -405,9 +405,9 @@ SIMSIMD_PUBLIC void simsimd_mahalanobis_bf16_neon(simsimd_bf16_t const* a, simsi
#pragma GCC pop_options
#endif // SIMSIMD_TARGET_NEON_BF16

#endif // SIMSIMD_TARGET_ARM
#endif // _SIMSIMD_TARGET_ARM

#if SIMSIMD_TARGET_X86
#if _SIMSIMD_TARGET_X86
#if SIMSIMD_TARGET_HASWELL
#pragma GCC push_options
#pragma GCC target("avx2", "f16c", "fma")
Expand Down Expand Up @@ -795,7 +795,7 @@ SIMSIMD_PUBLIC void simsimd_mahalanobis_f16_sapphire(simsimd_f16_t const* a, sim
#pragma clang attribute pop
#pragma GCC pop_options
#endif // SIMSIMD_TARGET_SAPPHIRE
#endif // SIMSIMD_TARGET_X86
#endif // _SIMSIMD_TARGET_X86

#ifdef __cplusplus
}
Expand Down
12 changes: 7 additions & 5 deletions include/simsimd/dot.h
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ SIMSIMD_MAKE_DOT(accurate, bf16, f64, SIMSIMD_BF16_TO_F32) // simsimd_d
SIMSIMD_MAKE_COMPLEX_DOT(accurate, bf16, f64, SIMSIMD_BF16_TO_F32) // simsimd_dot_bf16c_accurate
SIMSIMD_MAKE_COMPLEX_VDOT(accurate, bf16, f64, SIMSIMD_BF16_TO_F32) // simsimd_vdot_bf16c_accurate

#if SIMSIMD_TARGET_ARM
#if _SIMSIMD_TARGET_ARM
#if SIMSIMD_TARGET_NEON
#pragma GCC push_options
#pragma GCC target("arch=armv8.2-a+simd")
Expand Down Expand Up @@ -337,7 +337,9 @@ SIMSIMD_PUBLIC void simsimd_vdot_f32c_neon(simsimd_f32_t const* a, simsimd_f32_t

#pragma clang attribute pop
#pragma GCC pop_options
#endif // SIMSIMD_TARGET_NEON

#if SIMSIMD_TARGET_NEON_I8
#pragma GCC push_options
#pragma GCC target("arch=armv8.2-a+dotprod")
#pragma clang attribute push(__attribute__((target("arch=armv8.2-a+dotprod"))), apply_to = function)
Expand Down Expand Up @@ -395,7 +397,7 @@ SIMSIMD_PUBLIC void simsimd_dot_u8_neon(simsimd_u8_t const* a, simsimd_u8_t cons

#pragma clang attribute pop
#pragma GCC pop_options
#endif
#endif // SIMSIMD_TARGET_NEON_I8

#if SIMSIMD_TARGET_NEON_F16
#pragma GCC push_options
Expand Down Expand Up @@ -827,9 +829,9 @@ SIMSIMD_PUBLIC void simsimd_vdot_f16c_sve(simsimd_f16_t const* a, simsimd_f16_t
#pragma clang attribute pop
#pragma GCC pop_options
#endif // SIMSIMD_TARGET_SVE
#endif // SIMSIMD_TARGET_ARM
#endif // _SIMSIMD_TARGET_ARM

#if SIMSIMD_TARGET_X86
#if _SIMSIMD_TARGET_X86
#if SIMSIMD_TARGET_HASWELL
#pragma GCC push_options
#pragma GCC target("avx2", "f16c", "fma")
Expand Down Expand Up @@ -1861,7 +1863,7 @@ SIMSIMD_PUBLIC void simsimd_dot_i8_sierra(simsimd_i8_t const* a, simsimd_i8_t co
#pragma clang attribute pop
#pragma GCC pop_options
#endif // SIMSIMD_TARGET_SIERRA
#endif // SIMSIMD_TARGET_X86
#endif // _SIMSIMD_TARGET_X86

#ifdef __cplusplus
}
Expand Down
8 changes: 4 additions & 4 deletions include/simsimd/fma.h
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ SIMSIMD_PUBLIC void simsimd_fma_u8_sapphire(
simsimd_u8_t const* a, simsimd_u8_t const* b, simsimd_u8_t const* c, simsimd_size_t n, //
simsimd_distance_t alpha, simsimd_distance_t beta, simsimd_u8_t* result);

#if SIMSIMD_TARGET_X86
#if _SIMSIMD_TARGET_X86
#if SIMSIMD_TARGET_HASWELL
#pragma GCC push_options
#pragma GCC target("avx2", "f16c", "fma")
Expand Down Expand Up @@ -901,9 +901,9 @@ SIMSIMD_PUBLIC void simsimd_fma_u8_sapphire(
#pragma clang attribute pop
#pragma GCC pop_options
#endif // SIMSIMD_TARGET_SAPPHIRE
#endif // SIMSIMD_TARGET_X86
#endif // _SIMSIMD_TARGET_X86

#if SIMSIMD_TARGET_ARM
#if _SIMSIMD_TARGET_ARM
#if SIMSIMD_TARGET_NEON
#pragma GCC push_options
#pragma GCC target("arch=armv8.2-a+simd")
Expand Down Expand Up @@ -1120,7 +1120,7 @@ SIMSIMD_PUBLIC void simsimd_fma_i8_neon( //
#pragma clang attribute pop
#pragma GCC pop_options
#endif // SIMSIMD_TARGET_NEON_F16
#endif // SIMSIMD_TARGET_ARM
#endif // _SIMSIMD_TARGET_ARM

#ifdef __cplusplus
}
Expand Down
8 changes: 4 additions & 4 deletions include/simsimd/probability.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ SIMSIMD_MAKE_JS(accurate, f16, f64, SIMSIMD_F16_TO_F32, SIMSIMD_F32_DIVISION_EPS
SIMSIMD_MAKE_KL(accurate, bf16, f64, SIMSIMD_BF16_TO_F32, SIMSIMD_F32_DIVISION_EPSILON) // simsimd_kl_bf16_accurate
SIMSIMD_MAKE_JS(accurate, bf16, f64, SIMSIMD_BF16_TO_F32, SIMSIMD_F32_DIVISION_EPSILON) // simsimd_js_bf16_accurate

#if SIMSIMD_TARGET_ARM
#if _SIMSIMD_TARGET_ARM
#if SIMSIMD_TARGET_NEON
#pragma GCC push_options
#pragma GCC target("arch=armv8.2-a+simd")
Expand Down Expand Up @@ -303,9 +303,9 @@ SIMSIMD_PUBLIC void simsimd_js_f16_neon(simsimd_f16_t const* a, simsimd_f16_t co
#pragma clang attribute pop
#pragma GCC pop_options
#endif // SIMSIMD_TARGET_NEON_F16
#endif // SIMSIMD_TARGET_ARM
#endif // _SIMSIMD_TARGET_ARM

#if SIMSIMD_TARGET_X86
#if _SIMSIMD_TARGET_X86
#if SIMSIMD_TARGET_HASWELL
#pragma GCC push_options
#pragma GCC target("avx2", "f16c", "fma")
Expand Down Expand Up @@ -592,7 +592,7 @@ SIMSIMD_PUBLIC void simsimd_js_f16_sapphire(simsimd_f16_t const* a, simsimd_f16_
#pragma clang attribute pop
#pragma GCC pop_options
#endif // SIMSIMD_TARGET_SAPPHIRE
#endif // SIMSIMD_TARGET_X86
#endif // _SIMSIMD_TARGET_X86

#ifdef __cplusplus
}
Expand Down
54 changes: 27 additions & 27 deletions include/simsimd/simsimd.h
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@
#include "spatial.h" // L2, Cosine

// On Apple Silicon, `mrs` is not allowed in user-space, so we need to use the `sysctl` API.
#if defined(SIMSIMD_DEFINED_APPLE)
#if defined(_SIMSIMD_DEFINED_APPLE)
#include <sys/sysctl.h>
#endif

Expand Down Expand Up @@ -294,7 +294,7 @@ SIMSIMD_PUBLIC void simsimd_find_metric_punned( //
simsimd_capability_t* capability_output);
#endif

#if SIMSIMD_TARGET_X86
#if _SIMSIMD_TARGET_X86

/**
* @brief Function to determine the SIMD capabilities of the current 64-bit x86 machine at @b runtime.
Expand Down Expand Up @@ -379,9 +379,9 @@ SIMSIMD_PUBLIC simsimd_capability_t _simsimd_capabilities_x86(void) {
(simsimd_cap_serial_k));
}

#endif // SIMSIMD_TARGET_X86
#endif // _SIMSIMD_TARGET_X86

#if SIMSIMD_TARGET_ARM
#if _SIMSIMD_TARGET_ARM

/* Compiling the next section one may get: selected processor does not support system register name 'id_aa64zfr0_el1'.
* Suppressing assembler errors is very complicated, so when dealing with older ARM CPUs it's simpler to compile this
Expand All @@ -396,7 +396,7 @@ SIMSIMD_PUBLIC simsimd_capability_t _simsimd_capabilities_x86(void) {
* @return A bitmask of the SIMD capabilities represented as a `simsimd_capability_t` enum value.
*/
SIMSIMD_PUBLIC simsimd_capability_t _simsimd_capabilities_arm(void) {
#if defined(SIMSIMD_DEFINED_APPLE)
#if defined(_SIMSIMD_DEFINED_APPLE)
// On Apple Silicon, `mrs` is not allowed in user-space, so we need to use the `sysctl` API.
uint32_t supports_neon = 0, supports_fp16 = 0, supports_bf16 = 0, supports_i8mm = 0;
size_t size = sizeof(supports_neon);
Expand All @@ -416,7 +416,7 @@ SIMSIMD_PUBLIC simsimd_capability_t _simsimd_capabilities_arm(void) {
(simsimd_cap_neon_i8_k * (supports_neon && supports_i8mm)) | //
(simsimd_cap_serial_k));

#elif defined(SIMSIMD_DEFINED_LINUX)
#elif defined(_SIMSIMD_DEFINED_LINUX)

// Read CPUID registers directly
unsigned long id_aa64isar0_el1 = 0, id_aa64isar1_el1 = 0, id_aa64pfr0_el1 = 0, id_aa64zfr0_el1 = 0;
Expand Down Expand Up @@ -473,7 +473,7 @@ SIMSIMD_PUBLIC simsimd_capability_t _simsimd_capabilities_arm(void) {
(simsimd_cap_sve2_k * (supports_sve2)) | //
(simsimd_cap_sve2p1_k * (supports_sve2p1)) | //
(simsimd_cap_serial_k));
#else // SIMSIMD_DEFINED_LINUX
#else // if !_SIMSIMD_DEFINED_LINUX
return simsimd_cap_serial_k;
#endif
}
Expand All @@ -488,12 +488,12 @@ SIMSIMD_PUBLIC simsimd_capability_t _simsimd_capabilities_arm(void) {
* @return A bitmask of the SIMD capabilities represented as a `simsimd_capability_t` enum value.
*/
SIMSIMD_PUBLIC simsimd_capability_t _simsimd_capabilities_implementation(void) {
#if SIMSIMD_TARGET_X86
#if _SIMSIMD_TARGET_X86
return _simsimd_capabilities_x86();
#endif // SIMSIMD_TARGET_X86
#if SIMSIMD_TARGET_ARM
#endif // _SIMSIMD_TARGET_X86
#if _SIMSIMD_TARGET_ARM
return _simsimd_capabilities_arm();
#endif // SIMSIMD_TARGET_ARM
#endif // _SIMSIMD_TARGET_ARM
return simsimd_cap_serial_k;
}

Expand Down Expand Up @@ -1414,22 +1414,22 @@ SIMSIMD_DYNAMIC void simsimd_js_f64(simsimd_f64_t const* a, simsimd_f64_t const*
*/

// clang-format off
SIMSIMD_PUBLIC int simsimd_uses_neon(void) { return SIMSIMD_TARGET_ARM && SIMSIMD_TARGET_NEON; }
SIMSIMD_PUBLIC int simsimd_uses_neon_f16(void) { return SIMSIMD_TARGET_ARM && SIMSIMD_TARGET_NEON_F16 ; }
SIMSIMD_PUBLIC int simsimd_uses_neon_bf16(void) { return SIMSIMD_TARGET_ARM && SIMSIMD_TARGET_NEON_BF16; }
SIMSIMD_PUBLIC int simsimd_uses_neon_i8(void) { return SIMSIMD_TARGET_ARM && SIMSIMD_TARGET_NEON_I8; }
SIMSIMD_PUBLIC int simsimd_uses_sve(void) { return SIMSIMD_TARGET_ARM && SIMSIMD_TARGET_SVE; }
SIMSIMD_PUBLIC int simsimd_uses_sve_f16(void) { return SIMSIMD_TARGET_ARM && SIMSIMD_TARGET_SVE_F16; }
SIMSIMD_PUBLIC int simsimd_uses_sve_bf16(void) { return SIMSIMD_TARGET_ARM && SIMSIMD_TARGET_SVE_BF16; }
SIMSIMD_PUBLIC int simsimd_uses_sve_i8(void) { return SIMSIMD_TARGET_ARM && SIMSIMD_TARGET_SVE_I8; }
SIMSIMD_PUBLIC int simsimd_uses_sve2(void) { return SIMSIMD_TARGET_ARM && SIMSIMD_TARGET_SVE2; }
SIMSIMD_PUBLIC int simsimd_uses_haswell(void) { return SIMSIMD_TARGET_X86 && SIMSIMD_TARGET_HASWELL; }
SIMSIMD_PUBLIC int simsimd_uses_skylake(void) { return SIMSIMD_TARGET_X86 && SIMSIMD_TARGET_SKYLAKE; }
SIMSIMD_PUBLIC int simsimd_uses_ice(void) { return SIMSIMD_TARGET_X86 && SIMSIMD_TARGET_ICE; }
SIMSIMD_PUBLIC int simsimd_uses_genoa(void) { return SIMSIMD_TARGET_X86 && SIMSIMD_TARGET_GENOA; }
SIMSIMD_PUBLIC int simsimd_uses_sapphire(void) { return SIMSIMD_TARGET_X86 && SIMSIMD_TARGET_SAPPHIRE; }
SIMSIMD_PUBLIC int simsimd_uses_turin(void) { return SIMSIMD_TARGET_X86 && SIMSIMD_TARGET_TURIN; }
SIMSIMD_PUBLIC int simsimd_uses_sierra(void) { return SIMSIMD_TARGET_X86 && SIMSIMD_TARGET_SIERRA; }
SIMSIMD_PUBLIC int simsimd_uses_neon(void) { return _SIMSIMD_TARGET_ARM && SIMSIMD_TARGET_NEON; }
SIMSIMD_PUBLIC int simsimd_uses_neon_f16(void) { return _SIMSIMD_TARGET_ARM && SIMSIMD_TARGET_NEON_F16 ; }
SIMSIMD_PUBLIC int simsimd_uses_neon_bf16(void) { return _SIMSIMD_TARGET_ARM && SIMSIMD_TARGET_NEON_BF16; }
SIMSIMD_PUBLIC int simsimd_uses_neon_i8(void) { return _SIMSIMD_TARGET_ARM && SIMSIMD_TARGET_NEON_I8; }
SIMSIMD_PUBLIC int simsimd_uses_sve(void) { return _SIMSIMD_TARGET_ARM && SIMSIMD_TARGET_SVE; }
SIMSIMD_PUBLIC int simsimd_uses_sve_f16(void) { return _SIMSIMD_TARGET_ARM && SIMSIMD_TARGET_SVE_F16; }
SIMSIMD_PUBLIC int simsimd_uses_sve_bf16(void) { return _SIMSIMD_TARGET_ARM && SIMSIMD_TARGET_SVE_BF16; }
SIMSIMD_PUBLIC int simsimd_uses_sve_i8(void) { return _SIMSIMD_TARGET_ARM && SIMSIMD_TARGET_SVE_I8; }
SIMSIMD_PUBLIC int simsimd_uses_sve2(void) { return _SIMSIMD_TARGET_ARM && SIMSIMD_TARGET_SVE2; }
SIMSIMD_PUBLIC int simsimd_uses_haswell(void) { return _SIMSIMD_TARGET_X86 && SIMSIMD_TARGET_HASWELL; }
SIMSIMD_PUBLIC int simsimd_uses_skylake(void) { return _SIMSIMD_TARGET_X86 && SIMSIMD_TARGET_SKYLAKE; }
SIMSIMD_PUBLIC int simsimd_uses_ice(void) { return _SIMSIMD_TARGET_X86 && SIMSIMD_TARGET_ICE; }
SIMSIMD_PUBLIC int simsimd_uses_genoa(void) { return _SIMSIMD_TARGET_X86 && SIMSIMD_TARGET_GENOA; }
SIMSIMD_PUBLIC int simsimd_uses_sapphire(void) { return _SIMSIMD_TARGET_X86 && SIMSIMD_TARGET_SAPPHIRE; }
SIMSIMD_PUBLIC int simsimd_uses_turin(void) { return _SIMSIMD_TARGET_X86 && SIMSIMD_TARGET_TURIN; }
SIMSIMD_PUBLIC int simsimd_uses_sierra(void) { return _SIMSIMD_TARGET_X86 && SIMSIMD_TARGET_SIERRA; }
SIMSIMD_PUBLIC int simsimd_uses_dynamic_dispatch(void) { return 0; }
SIMSIMD_PUBLIC simsimd_capability_t simsimd_capabilities(void) { return _simsimd_capabilities_implementation(); }
SIMSIMD_PUBLIC void simsimd_find_metric_punned( //
Expand Down
8 changes: 4 additions & 4 deletions include/simsimd/sparse.h
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ SIMSIMD_MAKE_INTERSECT_WEIGHTED(serial, spdot_weights, u16, size, bf16, f32,
* - `_mm512_permutexvar_epi16` - needs BW - 4-6 cycles latency
* - `_mm512_permutexvar_epi8` - needs VBMI - 3 cycles latency
*/
#if SIMSIMD_TARGET_X86
#if _SIMSIMD_TARGET_X86
#if SIMSIMD_TARGET_ICE
#pragma GCC push_options
#pragma GCC target("avx2", "avx512f", "avx512vl", "bmi2", "lzcnt", "popcnt", "avx512bw", "avx512vbmi2")
Expand Down Expand Up @@ -849,9 +849,9 @@ SIMSIMD_PUBLIC void simsimd_spdot_counts_u16_turin( //
#pragma clang attribute pop
#pragma GCC pop_options
#endif // SIMSIMD_TARGET_TURIN
#endif // SIMSIMD_TARGET_X86
#endif // _SIMSIMD_TARGET_X86

#if SIMSIMD_TARGET_ARM
#if _SIMSIMD_TARGET_ARM
#if SIMSIMD_TARGET_NEON
#pragma GCC push_options
#pragma GCC target("arch=armv8.2-a")
Expand Down Expand Up @@ -1427,7 +1427,7 @@ SIMSIMD_PUBLIC void simsimd_spdot_weights_u16_sve2( //
#pragma clang attribute pop
#pragma GCC pop_options
#endif // SIMSIMD_TARGET_SVE2 && SIMSIMD_TARGET_SVE_BF16
#endif // SIMSIMD_TARGET_ARM
#endif // _SIMSIMD_TARGET_ARM

#ifdef __cplusplus
}
Expand Down
12 changes: 6 additions & 6 deletions include/simsimd/spatial.h
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,7 @@ SIMSIMD_MAKE_COS(accurate, bf16, f64, SIMSIMD_BF16_TO_F32) // simsimd_cos_bf16_
SIMSIMD_MAKE_L2SQ(accurate, bf16, f64, SIMSIMD_BF16_TO_F32) // simsimd_l2sq_bf16_accurate
SIMSIMD_MAKE_L2(accurate, bf16, f64, SIMSIMD_BF16_TO_F32) // simsimd_l2_bf16_accurate

#if SIMSIMD_TARGET_ARM
#if _SIMSIMD_TARGET_ARM
#if SIMSIMD_TARGET_NEON
#pragma GCC push_options
#pragma GCC target("arch=armv8.2-a+simd")
Expand Down Expand Up @@ -997,9 +997,9 @@ SIMSIMD_PUBLIC void simsimd_cos_bf16_sve(simsimd_bf16_t const* a_enum, simsimd_b
#pragma clang attribute pop
#pragma GCC pop_options
#endif // SIMSIMD_TARGET_SVE_BF16
#endif // SIMSIMD_TARGET_ARM
#endif // _SIMSIMD_TARGET_ARM

#if SIMSIMD_TARGET_X86
#if _SIMSIMD_TARGET_X86
#if SIMSIMD_TARGET_HASWELL
#pragma GCC push_options
#pragma GCC target("avx2")
Expand Down Expand Up @@ -1077,9 +1077,9 @@ SIMSIMD_INTERNAL simsimd_distance_t _simsimd_cos_normalize_f32_haswell(simsimd_f
#pragma clang attribute pop
#pragma GCC pop_options
#endif // SIMSIMD_TARGET_HASWELL
#endif // SIMSIMD_TARGET_X86
#endif // _SIMSIMD_TARGET_X86

#if SIMSIMD_TARGET_X86
#if _SIMSIMD_TARGET_X86
#if SIMSIMD_TARGET_HASWELL
#pragma GCC push_options
#pragma GCC target("avx2", "f16c", "fma")
Expand Down Expand Up @@ -2271,7 +2271,7 @@ SIMSIMD_PUBLIC void simsimd_cos_i8_sierra(simsimd_i8_t const* a, simsimd_i8_t co
#pragma clang attribute pop
#pragma GCC pop_options
#endif // SIMSIMD_TARGET_SIERRA
#endif // SIMSIMD_TARGET_X86
#endif // _SIMSIMD_TARGET_X86

#ifdef __cplusplus
}
Expand Down
Loading

0 comments on commit c46d472

Please sign in to comment.