@@ -260,8 +260,9 @@ class HierarchicalNSW : public AlgorithmInterface<dist_t> {
260
260
tableint candidate_id = *(datal + j);
261
261
// if (candidate_id == 0) continue;
262
262
#ifdef USE_SSE
263
- _mm_prefetch ((char *) (visited_array + *(datal + j)), _MM_HINT_T0);
264
- _mm_prefetch (getDataByInternalId (*(datal + j)), _MM_HINT_T0);
263
+ size_t next_index = std::min (size - 1 , j + 1 );
264
+ _mm_prefetch ((char *) (visited_array + *(datal + next_index)), _MM_HINT_T0);
265
+ _mm_prefetch (getDataByInternalId (*(datal + next_index)), _MM_HINT_T0);
265
266
#endif
266
267
if (visited_array[candidate_id] == visited_array_tag) continue ;
267
268
visited_array[candidate_id] = visited_array_tag;
@@ -343,8 +344,9 @@ class HierarchicalNSW : public AlgorithmInterface<dist_t> {
343
344
int candidate_id = *(data + j);
344
345
// if (candidate_id == 0) continue;
345
346
#ifdef USE_SSE
346
- _mm_prefetch ((char *) (visited_array + *(data + j)), _MM_HINT_T0);
347
- _mm_prefetch (data_level0_memory_ + (*(data + j)) * size_data_per_element_ + offsetData_,
347
+ size_t next_index = std::min (size, j + 1 );
348
+ _mm_prefetch ((char *) (visited_array + *(data + next_index)), _MM_HINT_T0);
349
+ _mm_prefetch (data_level0_memory_ + (*(data + j + 1 )) * size_data_per_element_ + offsetData_,
348
350
_MM_HINT_T0); // //////////
349
351
#endif
350
352
if (!(visited_array[candidate_id] == visited_array_tag)) {
@@ -1007,7 +1009,8 @@ class HierarchicalNSW : public AlgorithmInterface<dist_t> {
1007
1009
#endif
1008
1010
for (int i = 0 ; i < size; i++) {
1009
1011
#ifdef USE_SSE
1010
- _mm_prefetch (getDataByInternalId (*(datal + i)), _MM_HINT_T0);
1012
+ size_t next_index = std::min (size - 1 , i + 1 );
1013
+ _mm_prefetch (getDataByInternalId (*(datal + next_index)), _MM_HINT_T0);
1011
1014
#endif
1012
1015
tableint cand = datal[i];
1013
1016
dist_t d = fstdistfunc_ (dataPoint, getDataByInternalId (cand), dist_func_param_);
0 commit comments