10 #include "GpuDistance.h"
11 #include "../FaissAssert.h"
12 #include "GpuResources.h"
13 #include "impl/Distance.cuh"
14 #include "utils/ConversionOperators.cuh"
15 #include "utils/CopyUtils.cuh"
16 #include "utils/DeviceUtils.h"
17 #include "utils/DeviceTensor.cuh"
19 #include <thrust/execution_policy.h>
20 #include <thrust/transform.h>
22 namespace faiss {
namespace gpu {
24 void bruteForceKnn(GpuResources* resources,
42 auto device = getCurrentDevice();
43 auto stream = resources->getDefaultStreamCurrentDevice();
44 auto& mem = resources->getMemoryManagerCurrentDevice();
46 auto tVectors = toDevice<float, 2>(resources,
48 const_cast<float*
>(vectors),
51 auto tQueries = toDevice<float, 2>(resources,
53 const_cast<float*
>(queries),
57 auto tOutDistances = toDevice<float, 2>(resources,
65 DeviceTensor<int, 2, true> tOutIntIndices(mem, {numQueries, k}, stream);
68 if (metric == faiss::MetricType::METRIC_L2) {
69 runL2Distance(resources,
77 }
else if (metric == faiss::MetricType::METRIC_INNER_PRODUCT) {
78 runIPDistance(resources,
86 FAISS_THROW_MSG(
"metric should be METRIC_L2 or METRIC_INNER_PRODUCT");
90 auto tOutIndices = toDevice<faiss::Index::idx_t, 2>(resources,
97 thrust::transform(thrust::cuda::par.on(stream),
98 tOutIntIndices.data(),
104 fromDevice<float, 2>(tOutDistances, outDistances, stream);
105 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.