#include "IndexIVF.h" #include "clustering.h" #include #include #include IndexIVF::IndexIVF(int d, int nbucket): d(d), nbucket(nbucket), router(d){ memory.resize(nbucket); memory_ids.resize(nbucket); }; void IndexIVF::train(int n, const float *x){ if(trained) return; std::vectorcentroids(nbucket*d); //remove seed kmean_clustering(d, n, nbucket, x ,centroids.data(),1); router.add(nbucket, centroids.data()); trained=true; } void IndexIVF::add(int n, const float *x, const uint64_t*xids){ if(!trained) return; std::vector assign(n); std::vector distances(n); router.search(n,x,1,distances.data(), assign.data()); for(int i =0; iassign(n*nprobe); std::vector centroids_distance(n*nprobe); router.search(n,x,nprobe,centroids_distance.data(), assign.data()); for(int i = 0; i set; // std::priority_queue, std::vector>, std::greater>> pq; std::priority_queue> pq; const float *specquer = x+(i*d); for(int p= 0; p //nullptr: 6.32857 //bitmask: 4.60353 //after simd //nullptr: 1.3298 //bitmask: 0.918149 //added simd float dist = 0; int m = 0; __m256 sumvec = _mm256_setzero_ps(); /*for(int m = 0; m only add for un normalized vectors sumvec = _mm256_fmadd_ps(diff, diff, sumvec); } __m128 upper = _mm256_extractf128_ps(sumvec, 1); __m128 lower = _mm256_extractf128_ps(sumvec, 0); __m128 sumbound = _mm_add_ps(upper, lower); __m128 shifted = _mm_movehl_ps(sumbound, sumbound); __m128 current = _mm_add_ps(sumbound, shifted); __m128 shuffled = _mm_shuffle_ps(current, current, 1); __m128 finalsum = _mm_add_ps(current, shuffled); dist = _mm_cvtss_f32(finalsum); /* float sumarr[8]; _mm256_storeu_ps(sumarr,sumvec); currcosine= sumarr[0]+sumarr[1]+ sumarr[2]+sumarr[3]+ sumarr[4]+sumarr[5]+ sumarr[6]+sumarr[7]; //cleanup */ if(pq.size()=0; c--){ speldist[c]= pq.top().first; spelbs[c]= pq.top().second; pq.pop(); } for(int step = count; step