12 #include "../../IndexFlat.h"
13 #include "../GpuIndexFlat.h"
14 #include "../StandardGpuResources.h"
15 #include "../utils/DeviceUtils.h"
16 #include "../test/TestUtils.h"
17 #include <gtest/gtest.h>
22 constexpr
float kF16MaxRelErr = 0.07f;
23 constexpr
float kF32MaxRelErr = 6e-3f;
25 void testFlat(
bool useL2,
29 int numVecs = faiss::gpu::randVal(1000, 20000);
30 int dim = faiss::gpu::randVal(50, 800);
31 int numQuery = faiss::gpu::randVal(1, 512);
37 std::min(faiss::gpu::randVal(1, 50), numVecs) :
38 std::min(faiss::gpu::randVal(1, 1024), numVecs);
51 int device = faiss::gpu::randVal(0, faiss::gpu::getNumDevices() - 1);
58 config.device = device;
59 config.useFloat16 = useFloat16;
60 config.storeTransposed = useTransposed;
69 std::vector<float> vecs = faiss::gpu::randVecs(numVecs, dim);
70 cpuIndex->
add(numVecs, vecs.data());
71 gpuIndex->
add(numVecs, vecs.data());
73 std::stringstream str;
74 str << (useL2 ?
"L2" :
"IP") <<
" numVecs " << numVecs
76 <<
" useFloat16 " << useFloat16
77 <<
" transposed " << useTransposed
78 <<
" numQuery " << numQuery
83 faiss::gpu::compareIndices(*cpuIndex, *gpuIndex, numQuery, dim, k, str.str(),
84 useFloat16 ? kF16MaxRelErr : kF32MaxRelErr,
88 useFloat16 ? 0.99f : 0.1f,
89 useFloat16 ? 0.65f : 0.015f);
92 TEST(TestGpuIndexFlat, IP_Float32) {
93 for (
int tries = 0; tries < 5; ++tries) {
94 faiss::gpu::newTestSeed();
95 testFlat(
false,
false,
false);
96 testFlat(
false,
false,
true);
100 TEST(TestGpuIndexFlat, L2_Float32) {
101 for (
int tries = 0; tries < 5; ++tries) {
102 faiss::gpu::newTestSeed();
103 testFlat(
true,
false,
false);
104 testFlat(
true,
false,
true);
109 TEST(TestGpuIndexFlat, L2_Float32_K1) {
110 for (
int tries = 0; tries < 5; ++tries) {
111 faiss::gpu::newTestSeed();
112 testFlat(
true,
false,
false, 1);
113 testFlat(
true,
false,
true, 1);
117 TEST(TestGpuIndexFlat, IP_Float16) {
118 for (
int tries = 0; tries < 5; ++tries) {
119 faiss::gpu::newTestSeed();
120 testFlat(
false,
true,
false);
121 testFlat(
false,
true,
false);
125 TEST(TestGpuIndexFlat, L2_Float16) {
126 for (
int tries = 0; tries < 5; ++tries) {
127 faiss::gpu::newTestSeed();
128 testFlat(
true,
true,
false);
129 testFlat(
true,
true,
true);
134 TEST(TestGpuIndexFlat, L2_Float16_K1) {
135 for (
int tries = 0; tries < 5; ++tries) {
136 faiss::gpu::newTestSeed();
137 testFlat(
true,
true,
false, 1);
138 testFlat(
true,
true,
true, 1);
142 TEST(TestGpuIndexFlat, QueryEmpty) {
148 config.useFloat16 =
false;
149 config.storeTransposed =
false;
158 std::vector<float> queries(numQuery * dim, 1.0f);
160 std::vector<float> dist(numQuery * k, 0);
161 std::vector<faiss::Index::idx_t> ind(numQuery * k);
163 gpuIndex.
search(numQuery, queries.data(), k, dist.data(), ind.data());
165 for (
auto d : dist) {
166 EXPECT_EQ(d, std::numeric_limits<float>::max());
174 TEST(TestGpuIndexFlat, CopyFrom) {
175 faiss::gpu::newTestSeed();
177 int numVecs = faiss::gpu::randVal(100, 200);
178 int dim = faiss::gpu::randVal(1, 1000);
182 std::vector<float> vecs = faiss::gpu::randVecs(numVecs, dim);
183 cpuIndex.
add(numVecs, vecs.data());
189 int device = faiss::gpu::randVal(0, faiss::gpu::getNumDevices() - 1);
193 config.useFloat16 =
false;
194 config.storeTransposed =
false;
200 EXPECT_EQ(gpuIndex.
ntotal, numVecs);
202 EXPECT_EQ(cpuIndex.
d, gpuIndex.
d);
203 EXPECT_EQ(cpuIndex.
d, dim);
205 int idx = faiss::gpu::randVal(0, numVecs - 1);
207 std::vector<float> gpuVals(dim);
210 std::vector<float> cpuVals(dim);
213 EXPECT_EQ(gpuVals, cpuVals);
216 TEST(TestGpuIndexFlat, CopyTo) {
217 faiss::gpu::newTestSeed();
222 int numVecs = faiss::gpu::randVal(100, 200);
223 int dim = faiss::gpu::randVal(1, 1000);
225 int device = faiss::gpu::randVal(0, faiss::gpu::getNumDevices() - 1);
228 config.device = device;
229 config.useFloat16 =
false;
230 config.storeTransposed =
false;
234 std::vector<float> vecs = faiss::gpu::randVecs(numVecs, dim);
235 gpuIndex.
add(numVecs, vecs.data());
239 gpuIndex.
copyTo(&cpuIndex);
242 EXPECT_EQ(gpuIndex.
ntotal, numVecs);
244 EXPECT_EQ(cpuIndex.
d, gpuIndex.
d);
245 EXPECT_EQ(cpuIndex.
d, dim);
247 int idx = faiss::gpu::randVal(0, numVecs - 1);
249 std::vector<float> gpuVals(dim);
252 std::vector<float> cpuVals(dim);
255 EXPECT_EQ(gpuVals, cpuVals);
void copyTo(faiss::IndexFlat *index) const
virtual void reconstruct(idx_t key, float *recons) const override
void reconstruct(faiss::Index::idx_t key, float *out) const override
idx_t ntotal
total nb of indexed vectors
virtual void add(idx_t n, const float *x) override
void copyFrom(const faiss::IndexFlat *index)
void add(Index::idx_t n, const float *x) override
void search(faiss::Index::idx_t n, const float *x, faiss::Index::idx_t k, float *distances, faiss::Index::idx_t *labels) const override