9 #include "GpuDistance.h"
10 #include "../FaissAssert.h"
11 #include "GpuResources.h"
12 #include "impl/Distance.cuh"
13 #include "utils/ConversionOperators.cuh"
14 #include "utils/CopyUtils.cuh"
15 #include "utils/DeviceUtils.h"
16 #include "utils/DeviceTensor.cuh"
18 #include <thrust/execution_policy.h>
19 #include <thrust/transform.h>
21 namespace faiss {
namespace gpu {
23 void bruteForceKnn(GpuResources* resources,
43 auto device = getCurrentDevice();
44 auto stream = resources->getDefaultStreamCurrentDevice();
45 auto& mem = resources->getMemoryManagerCurrentDevice();
47 auto tVectors = toDevice<float, 2>(resources,
49 const_cast<float*
>(vectors),
51 {vectorsRowMajor ? numVectors : dims,
52 vectorsRowMajor ? dims : numVectors});
53 auto tQueries = toDevice<float, 2>(resources,
55 const_cast<float*
>(queries),
57 {queriesRowMajor ? numQueries : dims,
58 queriesRowMajor ? dims : numQueries});
60 auto tOutDistances = toDevice<float, 2>(resources,
68 DeviceTensor<int, 2, true> tOutIntIndices(mem, {numQueries, k}, stream);
71 if (metric == faiss::MetricType::METRIC_L2) {
72 runL2Distance(resources,
81 }
else if (metric == faiss::MetricType::METRIC_INNER_PRODUCT) {
82 runIPDistance(resources,
91 FAISS_THROW_MSG(
"metric should be METRIC_L2 or METRIC_INNER_PRODUCT");
95 auto tOutIndices = toDevice<faiss::Index::idx_t, 2>(resources,
102 thrust::transform(thrust::cuda::par.on(stream),
103 tOutIntIndices.data(),
104 tOutIntIndices.end(),
109 fromDevice<float, 2>(tOutDistances, outDistances, stream);
110 fromDevice<faiss::Index::idx_t, 2>(tOutIndices, outIndices, stream);
long idx_t
all indices are this type
MetricType
Some algorithms support both an inner product version and a L2 search version.