Skip to content

Commit f876b71

Browse files
committed
fix(ci): guard distance recall SIMD variants with runtime CPU feature checks
1 parent b1d492d commit f876b71

3 files changed

Lines changed: 74 additions & 53 deletions

File tree

cpp/test/src/regression/metric/test_innerproduct_regression.cpp

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -86,27 +86,34 @@ TEST(DeglibRegressionIP, DistanceRecallAllVariantsSameDataset)
8686
EXPECT_EQ(recall, 1.0) << "Distance recall between scalar and " << name << " InnerProduct must be exactly 1.0";
8787
};
8888

89-
// All variants compile now — test them all regardless of compile-time flags
90-
check_variant("InnerProductFloat16Ext_AVX512", [](const void* a, const void* b, const void* qty)
91-
{ return deglib::distances::fp32_ip::InnerProductFloat16Ext_AVX512::compare(a, b, qty); });
92-
check_variant("InnerProductFloat16Ext_AVX2", [](const void* a, const void* b, const void* qty)
93-
{ return deglib::distances::fp32_ip::InnerProductFloat16Ext_AVX2::compare(a, b, qty); });
94-
check_variant("InnerProductFloat16Ext_SSE", [](const void* a, const void* b, const void* qty)
95-
{ return deglib::distances::fp32_ip::InnerProductFloat16Ext_SSE::compare(a, b, qty); });
96-
check_variant("InnerProductFloat8Ext_AVX2", [](const void* a, const void* b, const void* qty)
97-
{ return deglib::distances::fp32_ip::InnerProductFloat8Ext_AVX2::compare(a, b, qty); });
98-
check_variant("InnerProductFloat8Ext_SSE", [](const void* a, const void* b, const void* qty)
99-
{ return deglib::distances::fp32_ip::InnerProductFloat8Ext_SSE::compare(a, b, qty); });
100-
check_variant("InnerProductFloat4Ext_SSE", [](const void* a, const void* b, const void* qty)
101-
{ return deglib::distances::fp32_ip::InnerProductFloat4Ext_SSE::compare(a, b, qty); });
102-
check_variant("InnerProductFloat16ExtResiduals_AVX512", [](const void* a, const void* b, const void* qty)
103-
{ return deglib::distances::fp32_ip::InnerProductFloat16ExtResiduals_AVX512::compare(a, b, qty); });
104-
check_variant("InnerProductFloat16ExtResiduals_AVX2", [](const void* a, const void* b, const void* qty)
105-
{ return deglib::distances::fp32_ip::InnerProductFloat16ExtResiduals_AVX2::compare(a, b, qty); });
106-
check_variant("InnerProductFloat16ExtResiduals_SSE", [](const void* a, const void* b, const void* qty)
107-
{ return deglib::distances::fp32_ip::InnerProductFloat16ExtResiduals_SSE::compare(a, b, qty); });
108-
check_variant("InnerProductFloat4ExtResiduals_SSE", [](const void* a, const void* b, const void* qty)
109-
{ return deglib::distances::fp32_ip::InnerProductFloat4ExtResiduals_SSE::compare(a, b, qty); });
89+
#if defined(DEGLIB_X86)
90+
if (deglib::cpu::has_avx512()) {
91+
check_variant("InnerProductFloat16Ext_AVX512", [](const void* a, const void* b, const void* qty)
92+
{ return deglib::distances::fp32_ip::InnerProductFloat16Ext_AVX512::compare(a, b, qty); });
93+
check_variant("InnerProductFloat16ExtResiduals_AVX512", [](const void* a, const void* b, const void* qty)
94+
{ return deglib::distances::fp32_ip::InnerProductFloat16ExtResiduals_AVX512::compare(a, b, qty); });
95+
}
96+
if (deglib::cpu::has_avx2()) {
97+
check_variant("InnerProductFloat16Ext_AVX2", [](const void* a, const void* b, const void* qty)
98+
{ return deglib::distances::fp32_ip::InnerProductFloat16Ext_AVX2::compare(a, b, qty); });
99+
check_variant("InnerProductFloat8Ext_AVX2", [](const void* a, const void* b, const void* qty)
100+
{ return deglib::distances::fp32_ip::InnerProductFloat8Ext_AVX2::compare(a, b, qty); });
101+
check_variant("InnerProductFloat16ExtResiduals_AVX2", [](const void* a, const void* b, const void* qty)
102+
{ return deglib::distances::fp32_ip::InnerProductFloat16ExtResiduals_AVX2::compare(a, b, qty); });
103+
}
104+
if (deglib::cpu::has_sse42()) {
105+
check_variant("InnerProductFloat16Ext_SSE", [](const void* a, const void* b, const void* qty)
106+
{ return deglib::distances::fp32_ip::InnerProductFloat16Ext_SSE::compare(a, b, qty); });
107+
check_variant("InnerProductFloat8Ext_SSE", [](const void* a, const void* b, const void* qty)
108+
{ return deglib::distances::fp32_ip::InnerProductFloat8Ext_SSE::compare(a, b, qty); });
109+
check_variant("InnerProductFloat4Ext_SSE", [](const void* a, const void* b, const void* qty)
110+
{ return deglib::distances::fp32_ip::InnerProductFloat4Ext_SSE::compare(a, b, qty); });
111+
check_variant("InnerProductFloat16ExtResiduals_SSE", [](const void* a, const void* b, const void* qty)
112+
{ return deglib::distances::fp32_ip::InnerProductFloat16ExtResiduals_SSE::compare(a, b, qty); });
113+
check_variant("InnerProductFloat4ExtResiduals_SSE", [](const void* a, const void* b, const void* qty)
114+
{ return deglib::distances::fp32_ip::InnerProductFloat4ExtResiduals_SSE::compare(a, b, qty); });
115+
}
116+
#endif
110117
check_variant("InnerProductFloat", [](const void* a, const void* b, const void* qty)
111118
{ return deglib::distances::fp32_ip::InnerProductFloat::compare(a, b, qty); });
112119
}

cpp/test/src/regression/metric/test_l2_regression.cpp

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -86,27 +86,34 @@ TEST(DeglibRegressionL2, DistanceRecallAllVariantsSameDataset)
8686
EXPECT_EQ(recall, 1.0) << "Distance recall between scalar and " << name << " L2 must be exactly 1.0";
8787
};
8888

89-
// All variants compile now — test them all regardless of compile-time flags
90-
check_variant("L2Float16Ext_AVX512", [](const void* a, const void* b, const void* qty)
91-
{ return deglib::distances::fp32_l2::L2Float16Ext_AVX512::compare(a, b, qty); });
92-
check_variant("L2Float16Ext_AVX2", [](const void* a, const void* b, const void* qty)
93-
{ return deglib::distances::fp32_l2::L2Float16Ext_AVX2::compare(a, b, qty); });
94-
check_variant("L2Float16Ext_SSE", [](const void* a, const void* b, const void* qty)
95-
{ return deglib::distances::fp32_l2::L2Float16Ext_SSE::compare(a, b, qty); });
96-
check_variant("L2Float8Ext_AVX2", [](const void* a, const void* b, const void* qty)
97-
{ return deglib::distances::fp32_l2::L2Float8Ext_AVX2::compare(a, b, qty); });
98-
check_variant("L2Float8Ext_SSE", [](const void* a, const void* b, const void* qty)
99-
{ return deglib::distances::fp32_l2::L2Float8Ext_SSE::compare(a, b, qty); });
100-
check_variant("L2Float4Ext_SSE", [](const void* a, const void* b, const void* qty)
101-
{ return deglib::distances::fp32_l2::L2Float4Ext_SSE::compare(a, b, qty); });
102-
check_variant("L2Float16ExtResiduals_AVX512", [](const void* a, const void* b, const void* qty)
103-
{ return deglib::distances::fp32_l2::L2Float16ExtResiduals_AVX512::compare(a, b, qty); });
104-
check_variant("L2Float16ExtResiduals_AVX2", [](const void* a, const void* b, const void* qty)
105-
{ return deglib::distances::fp32_l2::L2Float16ExtResiduals_AVX2::compare(a, b, qty); });
106-
check_variant("L2Float16ExtResiduals_SSE", [](const void* a, const void* b, const void* qty)
107-
{ return deglib::distances::fp32_l2::L2Float16ExtResiduals_SSE::compare(a, b, qty); });
108-
check_variant("L2Float4ExtResiduals_SSE", [](const void* a, const void* b, const void* qty)
109-
{ return deglib::distances::fp32_l2::L2Float4ExtResiduals_SSE::compare(a, b, qty); });
89+
#if defined(DEGLIB_X86)
90+
if (deglib::cpu::has_avx512()) {
91+
check_variant("L2Float16Ext_AVX512", [](const void* a, const void* b, const void* qty)
92+
{ return deglib::distances::fp32_l2::L2Float16Ext_AVX512::compare(a, b, qty); });
93+
check_variant("L2Float16ExtResiduals_AVX512", [](const void* a, const void* b, const void* qty)
94+
{ return deglib::distances::fp32_l2::L2Float16ExtResiduals_AVX512::compare(a, b, qty); });
95+
}
96+
if (deglib::cpu::has_avx2()) {
97+
check_variant("L2Float16Ext_AVX2", [](const void* a, const void* b, const void* qty)
98+
{ return deglib::distances::fp32_l2::L2Float16Ext_AVX2::compare(a, b, qty); });
99+
check_variant("L2Float8Ext_AVX2", [](const void* a, const void* b, const void* qty)
100+
{ return deglib::distances::fp32_l2::L2Float8Ext_AVX2::compare(a, b, qty); });
101+
check_variant("L2Float16ExtResiduals_AVX2", [](const void* a, const void* b, const void* qty)
102+
{ return deglib::distances::fp32_l2::L2Float16ExtResiduals_AVX2::compare(a, b, qty); });
103+
}
104+
if (deglib::cpu::has_sse42()) {
105+
check_variant("L2Float16Ext_SSE", [](const void* a, const void* b, const void* qty)
106+
{ return deglib::distances::fp32_l2::L2Float16Ext_SSE::compare(a, b, qty); });
107+
check_variant("L2Float8Ext_SSE", [](const void* a, const void* b, const void* qty)
108+
{ return deglib::distances::fp32_l2::L2Float8Ext_SSE::compare(a, b, qty); });
109+
check_variant("L2Float4Ext_SSE", [](const void* a, const void* b, const void* qty)
110+
{ return deglib::distances::fp32_l2::L2Float4Ext_SSE::compare(a, b, qty); });
111+
check_variant("L2Float16ExtResiduals_SSE", [](const void* a, const void* b, const void* qty)
112+
{ return deglib::distances::fp32_l2::L2Float16ExtResiduals_SSE::compare(a, b, qty); });
113+
check_variant("L2Float4ExtResiduals_SSE", [](const void* a, const void* b, const void* qty)
114+
{ return deglib::distances::fp32_l2::L2Float4ExtResiduals_SSE::compare(a, b, qty); });
115+
}
116+
#endif
110117
check_variant("L2Float", [](const void* a, const void* b, const void* qty)
111118
{ return deglib::distances::fp32_l2::L2Float::compare(a, b, qty); });
112119
}

cpp/test/src/regression/metric/test_l2_uint8_regression.cpp

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -85,17 +85,24 @@ TEST(DeglibRegressionL2Uint8, DistanceRecallAllVariantsSameDataset)
8585
EXPECT_EQ(recall, 1.0) << "Distance recall between scalar and " << name << " L2Uint8 must be exactly 1.0";
8686
};
8787

88-
// All variants compile now — test them all regardless of compile-time flags
89-
check_variant("L2Uint8Ext32_AVX512", [](const void* a, const void* b, const void* qty)
90-
{ return deglib::distances::uint8_l2::L2Uint8Ext32_AVX512::compare(a, b, qty); });
91-
check_variant("L2Uint8Ext32_AVX2", [](const void* a, const void* b, const void* qty)
92-
{ return deglib::distances::uint8_l2::L2Uint8Ext32_AVX2::compare(a, b, qty); });
93-
check_variant("L2Uint8Ext32_SSE", [](const void* a, const void* b, const void* qty)
94-
{ return deglib::distances::uint8_l2::L2Uint8Ext32_SSE::compare(a, b, qty); });
95-
check_variant("L2Uint8Ext16_AVX2", [](const void* a, const void* b, const void* qty)
96-
{ return deglib::distances::uint8_l2::L2Uint8Ext16_AVX2::compare(a, b, qty); });
97-
check_variant("L2Uint8Ext16_SSE", [](const void* a, const void* b, const void* qty)
98-
{ return deglib::distances::uint8_l2::L2Uint8Ext16_SSE::compare(a, b, qty); });
88+
#if defined(DEGLIB_X86)
89+
if (deglib::cpu::has_avx512()) {
90+
check_variant("L2Uint8Ext32_AVX512", [](const void* a, const void* b, const void* qty)
91+
{ return deglib::distances::uint8_l2::L2Uint8Ext32_AVX512::compare(a, b, qty); });
92+
}
93+
if (deglib::cpu::has_avx2()) {
94+
check_variant("L2Uint8Ext32_AVX2", [](const void* a, const void* b, const void* qty)
95+
{ return deglib::distances::uint8_l2::L2Uint8Ext32_AVX2::compare(a, b, qty); });
96+
check_variant("L2Uint8Ext16_AVX2", [](const void* a, const void* b, const void* qty)
97+
{ return deglib::distances::uint8_l2::L2Uint8Ext16_AVX2::compare(a, b, qty); });
98+
}
99+
if (deglib::cpu::has_sse42()) {
100+
check_variant("L2Uint8Ext32_SSE", [](const void* a, const void* b, const void* qty)
101+
{ return deglib::distances::uint8_l2::L2Uint8Ext32_SSE::compare(a, b, qty); });
102+
check_variant("L2Uint8Ext16_SSE", [](const void* a, const void* b, const void* qty)
103+
{ return deglib::distances::uint8_l2::L2Uint8Ext16_SSE::compare(a, b, qty); });
104+
}
105+
#endif
99106
check_variant("L2Uint8", [](const void* a, const void* b, const void* qty)
100107
{ return deglib::distances::uint8_l2::L2Uint8::compare(a, b, qty); });
101108
}

0 commit comments

Comments
 (0)