9
9
#include < faiss/impl/pq_4bit/pq4_fast_scan.h>
10
10
#include < faiss/impl/pq_4bit/simd_result_handlers.h>
11
11
12
- #ifdef __x86_64__
13
- #ifdef __AVX2__
14
- #error "this should not be compiled with AVX2"
15
- #endif
16
- #endif
17
-
18
12
#include < faiss/impl/pq_4bit/kernels_simd256.h>
19
13
20
14
#include < faiss/impl/pq_4bit/dispatching.h>
@@ -376,6 +370,8 @@ int pq4_preferred_qbs(int n) {
376
370
377
371
/* *************************** Dispatching */
378
372
373
+ #ifdef COMPILE_SIMD_NONE
374
+
379
375
template <>
380
376
PQ4CodeScanner* make_pq4_scanner<SIMDLevel::NONE, false >(KNN_ARGS_LIST) {
381
377
return make_pq4_scanner_1<SIMDLevel::NONE, false >(KNN_ARGS_LIST_2);
@@ -395,6 +391,7 @@ template <>
395
391
PQ4CodeScanner* make_pq4_scanner<SIMDLevel::NONE, true >(PRES_ARGS_LIST) {
396
392
return make_pq4_scanner_1<SIMDLevel::NONE, true >(PRES_ARGS_LIST_2);
397
393
}
394
+ #endif // COMPILE_SIMD_NONE
398
395
399
396
template <bool with_id_map>
400
397
PQ4CodeScanner* make_knn_scanner (
@@ -407,22 +404,31 @@ PQ4CodeScanner* make_knn_scanner(
407
404
float * dis,
408
405
idx_t * ids,
409
406
const IDSelector* sel) {
410
- #ifdef COMPILE_SIMD_AVX512
411
- if (SIMDConfig::level == SIMDLevel::AVX512) {
412
- return make_pq4_scanner<SIMDLevel::AVX512, with_id_map>(
413
- is_max, ns, ur, nq, ntotal, k, dis, ids, sel);
414
- } else
407
+ // code for dynamic dispatching is commented out
408
+ #ifdef COMPILE_SIMD_AVX512F
409
+ // if (SIMDConfig::level == SIMDLevel::AVX512F) {
410
+ return make_pq4_scanner<SIMDLevel::AVX512F, with_id_map>(
411
+ is_max, ns, ur, nq, ntotal, k, dis, ids, sel);
412
+ // } else
415
413
#endif
416
414
#ifdef COMPILE_SIMD_AVX2
417
- if (SIMDConfig::level == SIMDLevel::AVX2) {
418
- return make_pq4_scanner<SIMDLevel::AVX2, with_id_map>(
419
- is_max, ns, ur, nq, ntotal, k, dis, ids, sel);
420
- } else
415
+ // if (SIMDConfig::level == SIMDLevel::AVX2) {
416
+ return make_pq4_scanner<SIMDLevel::AVX2, with_id_map>(
417
+ is_max, ns, ur, nq, ntotal, k, dis, ids, sel);
418
+ // } else
421
419
#endif
420
+ #ifdef COMPILE_SIMD_NEON
421
+ // if (SIMDConfig::level == SIMDLevel::ARM_NEON) {
422
+ return make_pq4_scanner<SIMDLevel::ARM_NEON, with_id_map>(
423
+ is_max, ns, ur, nq, ntotal, k, dis, ids, sel);
424
+ // } else
425
+ #endif
426
+ #ifdef COMPILE_SIMD_NONE
422
427
{
423
428
return make_pq4_scanner<SIMDLevel::NONE, with_id_map>(
424
429
is_max, ns, ur, nq, ntotal, k, dis, ids, sel);
425
430
}
431
+ #endif
426
432
}
427
433
428
434
PQ4CodeScanner* pq4_make_flat_knn_handler (
@@ -462,22 +468,30 @@ PQ4CodeScanner* pq4_make_ivf_range_handler(
462
468
float radius,
463
469
int norm_scale,
464
470
const IDSelector* sel) {
465
- #ifdef COMPILE_SIMD_AVX512
466
- if (SIMDConfig::level == SIMDLevel::AVX512 ) {
467
- return make_pq4_scanner<SIMDLevel::AVX512 , true >(
468
- is_max, norm_scale, &rres, radius, 0 , sel);
469
- } else
471
+ #ifdef COMPILE_SIMD_AVX512F
472
+ // if (SIMDConfig::level == SIMDLevel::AVX512F ) {
473
+ return make_pq4_scanner<SIMDLevel::AVX512F , true >(
474
+ is_max, norm_scale, &rres, radius, 0 , sel);
475
+ // } else
470
476
#endif
471
477
#ifdef COMPILE_SIMD_AVX2
472
- if (SIMDConfig::level == SIMDLevel::AVX2) {
473
- return make_pq4_scanner<SIMDLevel::AVX2, true >(
474
- is_max, norm_scale, &rres, radius, 0 , sel);
475
- } else
478
+ // if (SIMDConfig::level == SIMDLevel::AVX2) {
479
+ return make_pq4_scanner<SIMDLevel::AVX2, true >(
480
+ is_max, norm_scale, &rres, radius, 0 , sel);
481
+ // } else
476
482
#endif
483
+ #ifdef COMPILE_SIMD_NEON
484
+ // if (SIMDConfig::level == SIMDLevel::ARM_NEON) {
485
+ return make_pq4_scanner<SIMDLevel::ARM_NEON, true >(
486
+ is_max, norm_scale, &rres, radius, 0 , sel);
487
+ // } else
488
+ #endif
489
+ #ifdef COMPILE_SIMD_NONE
477
490
{
478
491
return make_pq4_scanner<SIMDLevel::NONE, true >(
479
492
is_max, norm_scale, &rres, radius, 0 , sel);
480
493
}
494
+ #endif
481
495
}
482
496
483
497
PQ4CodeScanner* pq4_make_ivf_partial_range_handler (
@@ -488,22 +502,30 @@ PQ4CodeScanner* pq4_make_ivf_partial_range_handler(
488
502
idx_t i1,
489
503
int norm_scale,
490
504
const IDSelector* sel) {
491
- #ifdef COMPILE_SIMD_AVX512
492
- if (SIMDConfig::level == SIMDLevel::AVX512 ) {
493
- return make_pq4_scanner<SIMDLevel::AVX512 , true >(
494
- is_max, norm_scale, &pres, radius, 0 , i0, i1, sel);
495
- } else
505
+ #ifdef COMPILE_SIMD_AVX512F
506
+ // if (SIMDConfig::level == SIMDLevel::AVX512F ) {
507
+ return make_pq4_scanner<SIMDLevel::AVX512F , true >(
508
+ is_max, norm_scale, &pres, radius, 0 , i0, i1, sel);
509
+ // } else
496
510
#endif
497
511
#ifdef COMPILE_SIMD_AVX2
498
- if (SIMDConfig::level == SIMDLevel::AVX2) {
499
- return make_pq4_scanner<SIMDLevel::AVX2, true >(
500
- is_max, norm_scale, &pres, radius, 0 , i0, i1, sel);
501
- } else
512
+ // if (SIMDConfig::level == SIMDLevel::AVX2) {
513
+ return make_pq4_scanner<SIMDLevel::AVX2, true >(
514
+ is_max, norm_scale, &pres, radius, 0 , i0, i1, sel);
515
+ // } else
502
516
#endif
517
+ #ifdef COMPILE_SIMD_NEON
518
+ // if (SIMDConfig::level == SIMDLevel::ARM_NEON) {
519
+ return make_pq4_scanner<SIMDLevel::ARM_NEON, true >(
520
+ is_max, norm_scale, &pres, radius, 0 , i0, i1, sel);
521
+ // } else
522
+ #endif
523
+ #ifdef COMPILE_SIMD_NONE
503
524
{
504
525
return make_pq4_scanner<SIMDLevel::NONE, true >(
505
526
is_max, norm_scale, &pres, radius, 0 , i0, i1, sel);
506
527
}
528
+ #endif
507
529
}
508
530
509
531
} // namespace faiss
0 commit comments