Skip to content

Commit 8edd481

Browse files
committed
fix(distance): add SIMD target attributes to lambdas in compare_batch
Explicitly annotate batch_impl lambda functions in distance headers with DEGLIB_TARGET_AVX512 and DEGLIB_TARGET_AVX2. GCC/Clang do not propagate function target attributes into nested lambda closures. Without target annotations on the lambdas, compiling AVX-512/AVX2 intrinsics inside non-AVX512 translation units failed with inlining option mismatch errors.
1 parent 6a7e83f commit 8edd481

5 files changed

Lines changed: 10 additions & 10 deletions

File tree

cpp/deglib/include/deglib/distance/evp_inner_product.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ namespace deglib::distances::evp_ip {
216216
uint32_t dim = *((uint32_t*)qty_ptr);
217217
const size_t mask_bytes = dim / 8;
218218

219-
auto batch_impl = [query, mask_bytes, dim](const void* const* db, float* out_dists) {
219+
auto batch_impl = [query, mask_bytes, dim](const void* const* db, float* out_dists) DEGLIB_TARGET_AVX512 {
220220
const std::byte* q_ones = query;
221221
const std::byte* q_negs = query + mask_bytes;
222222

@@ -452,7 +452,7 @@ namespace deglib::distances::evp_ip {
452452
uint32_t dim = *((uint32_t*)qty_ptr);
453453
const size_t mask_bytes = dim / 8;
454454

455-
auto batch_impl = [query, mask_bytes, dim](const void* const* db, float* out_dists) {
455+
auto batch_impl = [query, mask_bytes, dim](const void* const* db, float* out_dists) DEGLIB_TARGET_AVX2 {
456456
const std::byte* q_ones = query;
457457
const std::byte* q_negs = query + mask_bytes;
458458

cpp/deglib/include/deglib/distance/fp16_ip.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ namespace deglib::distances::fp16_ip {
128128
const uint16_t* query = static_cast<const uint16_t*>(query_ptr);
129129
const size_t dim = *((const size_t*)qty_ptr);
130130

131-
auto batch_impl = [query, dim](const void* const* db, float* out_dists) {
131+
auto batch_impl = [query, dim](const void* const* db, float* out_dists) DEGLIB_TARGET_AVX512 {
132132
const size_t nc32 = dim / 32;
133133
size_t offset = nc32 * 32;
134134

@@ -268,7 +268,7 @@ namespace deglib::distances::fp16_ip {
268268
const uint16_t* query = static_cast<const uint16_t*>(query_ptr);
269269
const size_t dim = *((const size_t*)qty_ptr);
270270

271-
auto batch_impl = [query, dim](const void* const* db, float* out_dists) {
271+
auto batch_impl = [query, dim](const void* const* db, float* out_dists) DEGLIB_TARGET_AVX2 {
272272
const size_t nc = dim / 16;
273273
size_t offset = nc * 16;
274274

cpp/deglib/include/deglib/distance/fp32_ip.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ namespace deglib::distances::fp32_ip {
139139
const float* query = static_cast<const float*>(query_ptr);
140140
const size_t dim = *((const size_t*)qty_ptr);
141141

142-
auto batch_impl = [query, dim](const void* const* db, float* out_dists) {
142+
auto batch_impl = [query, dim](const void* const* db, float* out_dists) DEGLIB_TARGET_AVX512 {
143143
const size_t nc16 = dim / 16;
144144
size_t offset = nc16 * 16;
145145

@@ -260,7 +260,7 @@ namespace deglib::distances::fp32_ip {
260260
const float* query = static_cast<const float*>(query_ptr);
261261
const size_t dim = *((const size_t*)qty_ptr);
262262

263-
auto batch_impl = [query, dim](const void* const* db, float* out_dists) {
263+
auto batch_impl = [query, dim](const void* const* db, float* out_dists) DEGLIB_TARGET_AVX2 {
264264
const size_t nc8 = dim / 8;
265265
size_t offset = nc8 * 8;
266266

cpp/deglib/include/deglib/distance/fp32_l2.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ namespace deglib::distances::fp32_l2 {
139139
const float* query = static_cast<const float*>(query_ptr);
140140
const size_t dim = *((const size_t*)qty_ptr);
141141

142-
auto batch_impl = [query, dim](const void* const* db, float* out_dists) {
142+
auto batch_impl = [query, dim](const void* const* db, float* out_dists) DEGLIB_TARGET_AVX512 {
143143
const size_t nc16 = dim / 16;
144144
size_t offset = nc16 * 16;
145145

@@ -262,7 +262,7 @@ namespace deglib::distances::fp32_l2 {
262262
const float* query = static_cast<const float*>(query_ptr);
263263
const size_t dim = *((const size_t*)qty_ptr);
264264

265-
auto batch_impl = [query, dim](const void* const* db, float* out_dists) {
265+
auto batch_impl = [query, dim](const void* const* db, float* out_dists) DEGLIB_TARGET_AVX2 {
266266
const size_t nc8 = dim / 8;
267267
size_t offset = nc8 * 8;
268268

cpp/deglib/include/deglib/distance/uint8_l2.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ namespace deglib::distances::uint8_l2 {
130130
const unsigned char* query = static_cast<const unsigned char*>(query_ptr);
131131
const size_t dim = *((const size_t*)qty_ptr);
132132

133-
auto batch_impl = [query, dim](const void* const* db, float* out_dists) {
133+
auto batch_impl = [query, dim](const void* const* db, float* out_dists) DEGLIB_TARGET_AVX512 {
134134
const size_t nc32 = dim / 32;
135135
size_t offset = nc32 * 32;
136136

@@ -262,7 +262,7 @@ namespace deglib::distances::uint8_l2 {
262262
const unsigned char* query = static_cast<const unsigned char*>(query_ptr);
263263
const size_t dim = *((const size_t*)qty_ptr);
264264

265-
auto batch_impl = [query, dim](const void* const* db, float* out_dists) {
265+
auto batch_impl = [query, dim](const void* const* db, float* out_dists) DEGLIB_TARGET_AVX2 {
266266
const size_t nc16 = dim / 16;
267267
size_t offset = nc16 * 16;
268268

0 commit comments

Comments
 (0)