Files
Michael Norris 8d8881ee3f Make distance_compute_blas_threshold dimension-aware (#5022)
Summary:
Pull Request resolved: https://github.com/facebookresearch/faiss/pull/5022

I used the C++ benchmark in https://github.com/facebookresearch/faiss/pull/4971 but modified it a lot to measure on my machine.

```

  The BLAS threshold for flat distance computation was a fixed query count (nq < 20), regardless of vector dimension. This meant BLAS was
  used for as few as 20 queries even at d=128, where the sequential SIMD path is 10-25x faster.

  The optimal crossover between sequential and BLAS depends on the total work in the query matrix (nq × d), not just query count.
  Benchmarking across dimensions shows the crossover at roughly nq × d ≈ 128,000:

  ┌──────┬────────────────────┬──────────────────────────────┐
  │  d   │ Old threshold (nq) │ New effective threshold (nq) │
  ├──────┼────────────────────┼──────────────────────────────┤
  │ 128  │ 20                 │ 1000                         │
  ├──────┼────────────────────┼──────────────────────────────┤
  │ 256  │ 20                 │ 500                          │
  ├──────┼────────────────────┼──────────────────────────────┤
  │ 512  │ 20                 │ 250                          │
  ├──────┼────────────────────┼──────────────────────────────┤
  │ 1024 │ 20                 │ 125                          │
  ├──────┼────────────────────┼──────────────────────────────┤
  │ 2048 │ 20                 │ 63                           │
  └──────┴────────────────────┴──────────────────────────────┘

  This change replaces the comparison nq < threshold with nq * d < threshold and sets the default to 128,000.

  Speedup vs old default (nb=100,000, L2 (same as IP for me), compiled with optimizations):

      nq | d=128 | d=256 | d=512 | d=1024 | d=2048
     ----|-------|-------|-------|--------|-------
      20 | 22.8x |  9.3x |  4.5x |  2.6x  |  1.4x
      50 | 19.4x |  9.3x |  4.7x |  2.0x  |  1.2x
     100 | 13.3x |  5.6x |  2.1x |  1.0x  |  1.0x
     200 |  8.2x |  2.7x |  1.1x |  1.0x  |  1.0x
     500 |  3.2x |  1.0x |  1.0x |  1.0x  |  1.0x
    1000 |  1.0x |  1.0x |  1.0x |  1.0x  |  1.0x

  No regressions observed — the worst case is d=1024, nq=100 at 0.99x (within noise).
```

Reviewed By: mdouze

Differential Revision: D99032435

fbshipit-source-id: 45153e1d5add3ab20efa0e1e90cfc18533f4ac97
2026-04-04 10:02:07 -07:00
..