diff --git a/hnswlib/hnswalg.h b/hnswlib/hnswalg.h index bef00170..2aff4d48 100644 --- a/hnswlib/hnswalg.h +++ b/hnswlib/hnswalg.h @@ -260,8 +260,9 @@ class HierarchicalNSW : public AlgorithmInterface { tableint candidate_id = *(datal + j); // if (candidate_id == 0) continue; #ifdef USE_SSE - _mm_prefetch((char *) (visited_array + *(datal + j + 1)), _MM_HINT_T0); - _mm_prefetch(getDataByInternalId(*(datal + j + 1)), _MM_HINT_T0); + size_t next_index = std::min(size - 1, j + 1); + _mm_prefetch((char *) (visited_array + *(datal + next_index)), _MM_HINT_T0); + _mm_prefetch(getDataByInternalId(*(datal + next_index)), _MM_HINT_T0); #endif if (visited_array[candidate_id] == visited_array_tag) continue; visited_array[candidate_id] = visited_array_tag; @@ -343,7 +344,8 @@ class HierarchicalNSW : public AlgorithmInterface { int candidate_id = *(data + j); // if (candidate_id == 0) continue; #ifdef USE_SSE - _mm_prefetch((char *) (visited_array + *(data + j + 1)), _MM_HINT_T0); + size_t next_index = std::min(size, j + 1); + _mm_prefetch((char *) (visited_array + *(data + next_index)), _MM_HINT_T0); _mm_prefetch(data_level0_memory_ + (*(data + j + 1)) * size_data_per_element_ + offsetData_, _MM_HINT_T0); //////////// #endif @@ -1007,7 +1009,8 @@ class HierarchicalNSW : public AlgorithmInterface { #endif for (int i = 0; i < size; i++) { #ifdef USE_SSE - _mm_prefetch(getDataByInternalId(*(datal + i + 1)), _MM_HINT_T0); + size_t next_index = std::min(size - 1, i + 1); + _mm_prefetch(getDataByInternalId(*(datal + next_index)), _MM_HINT_T0); #endif tableint cand = datal[i]; dist_t d = fstdistfunc_(dataPoint, getDataByInternalId(cand), dist_func_param_);