perf: Tier 4c — optional rayon parallelism for HNSW prune_connections
CI / test (push) Failing after 3s
CI / test (push) Failing after 3s
Add a default-off `parallel` feature to clawhdf5-ann (rayon optional dep), matching the convention already used in clawhdf5-format/clawhdf5-agent. Gate prune_connections' per-neighbor distance computation on it — a pure read-only map with no shared mutable state, sorted immediately after, so swapping to rayon's par_iter is low-risk. Deliberately not touching build_with_metric's outer insert loop per the original plan: it has genuine cross-iteration data dependencies (graph mutation, entry-point updates) and needs its own correctness-focused design pass. The win here is likely small since neighbor lists are bounded by m/m_max0 (typically small) — this is a low-risk completeness item, not a headline perf change. Verified identical results with default features and --features parallel across the full HNSW test suite (23/23 both ways), including the build+search end-to-end tests (build_small_index, search_accuracy_cosine, incremental_insert_matches_batch_recall).
This commit is contained in:
@@ -857,6 +857,15 @@ fn prune_connections(
|
||||
if neighbors.len() <= max_conn {
|
||||
return;
|
||||
}
|
||||
#[cfg(feature = "parallel")]
|
||||
let mut scored: Vec<(usize, f32)> = {
|
||||
use rayon::prelude::*;
|
||||
neighbors
|
||||
.par_iter()
|
||||
.map(|&n| (n, compute_distance(&vectors[node], &vectors[n], metric)))
|
||||
.collect()
|
||||
};
|
||||
#[cfg(not(feature = "parallel"))]
|
||||
let mut scored: Vec<(usize, f32)> = neighbors
|
||||
.iter()
|
||||
.map(|&n| (n, compute_distance(&vectors[node], &vectors[n], metric)))
|
||||
|
||||
Reference in New Issue
Block a user