@@ -38,6 +38,23 @@ struct DummyScaler {
38
38
return simd16uint16 (0 );
39
39
}
40
40
41
+ #ifdef __AVX512F__
42
+ inline simd64uint8 lookup (const simd64uint8&, const simd64uint8&) const {
43
+ FAISS_THROW_MSG (" DummyScaler::lookup should not be called." );
44
+ return simd64uint8 (0 );
45
+ }
46
+
47
+ inline simd32uint16 scale_lo (const simd64uint8&) const {
48
+ FAISS_THROW_MSG (" DummyScaler::scale_lo should not be called." );
49
+ return simd32uint16 (0 );
50
+ }
51
+
52
+ inline simd32uint16 scale_hi (const simd64uint8&) const {
53
+ FAISS_THROW_MSG (" DummyScaler::scale_hi should not be called." );
54
+ return simd32uint16 (0 );
55
+ }
56
+ #endif
57
+
41
58
template <class dist_t >
42
59
inline dist_t scale_one (const dist_t &) const {
43
60
FAISS_THROW_MSG (" DummyScaler::scale_one should not be called." );
@@ -67,6 +84,23 @@ struct NormTableScaler {
67
84
return (simd16uint16 (res) >> 8 ) * scale_simd;
68
85
}
69
86
87
+ #ifdef __AVX512F__
88
+ inline simd64uint8 lookup (const simd64uint8& lut, const simd64uint8& c)
89
+ const {
90
+ return lut.lookup_4_lanes (c);
91
+ }
92
+
93
+ inline simd32uint16 scale_lo (const simd64uint8& res) const {
94
+ auto scale_simd_wide = simd32uint16 (scale_simd, scale_simd);
95
+ return simd32uint16 (res) * scale_simd_wide;
96
+ }
97
+
98
+ inline simd32uint16 scale_hi (const simd64uint8& res) const {
99
+ auto scale_simd_wide = simd32uint16 (scale_simd, scale_simd);
100
+ return (simd32uint16 (res) >> 8 ) * scale_simd_wide;
101
+ }
102
+ #endif
103
+
70
104
// for non-SIMD implem 2, 3, 4
71
105
template <class dist_t >
72
106
inline dist_t scale_one (const dist_t & x) const {
0 commit comments