7
7
#include < arcticdb/util/vector_common.hpp>
8
8
9
9
namespace arcticdb {
10
+ #ifndef _WIN32
10
11
11
12
template <typename T>
12
13
using vector_type __attribute__ ((vector_size(64 ))) = T;
@@ -20,24 +21,20 @@ class FloatMinFinder {
20
21
static T find (const T* data, size_t n) {
21
22
using vec_t = vector_type<T>;
22
23
23
- // Initialize min vector with infinity
24
24
vec_t vmin;
25
25
for (size_t i = 0 ; i < sizeof (vec_t )/sizeof (T); i++) {
26
26
reinterpret_cast <T*>(&vmin)[i] = std::numeric_limits<T>::infinity ();
27
27
}
28
28
29
- // Process full vectors
30
29
const vec_t * vdata = reinterpret_cast <const vec_t *>(data);
31
30
const size_t elements_per_vector = sizeof (vec_t ) / sizeof (T);
32
31
const size_t vlen = n / elements_per_vector;
33
32
34
- // Main SIMD loop
35
33
for (size_t i = 0 ; i < vlen; i++) {
36
34
vec_t v = vdata[i];
37
35
vmin = (v < vmin) ? v : vmin;
38
36
}
39
37
40
- // Reduce vector to scalar
41
38
T min_val = std::numeric_limits<T>::infinity ();
42
39
const T* min_arr = reinterpret_cast <const T*>(&vmin);
43
40
for (size_t i = 0 ; i < elements_per_vector; i++) {
@@ -46,7 +43,6 @@ class FloatMinFinder {
46
43
}
47
44
}
48
45
49
- // Handle remainder
50
46
const T* remain = data + (vlen * elements_per_vector);
51
47
for (size_t i = 0 ; i < n % elements_per_vector; i++) {
52
48
if (remain[i] == remain[i]) { // Not NaN
@@ -67,24 +63,20 @@ class FloatMaxFinder {
67
63
static T find (const T* data, size_t n) {
68
64
using vec_t = vector_type<T>;
69
65
70
- // Initialize max vector with negative infinity
71
66
vec_t vmax;
72
67
for (size_t i = 0 ; i < sizeof (vec_t )/sizeof (T); i++) {
73
68
reinterpret_cast <T*>(&vmax)[i] = -std::numeric_limits<T>::infinity ();
74
69
}
75
70
76
- // Process full vectors
77
71
const vec_t * vdata = reinterpret_cast <const vec_t *>(data);
78
72
const size_t elements_per_vector = sizeof (vec_t ) / sizeof (T);
79
73
const size_t vlen = n / elements_per_vector;
80
74
81
- // Main SIMD loop
82
75
for (size_t i = 0 ; i < vlen; i++) {
83
76
vec_t v = vdata[i];
84
77
vmax = (v > vmax) ? v : vmax;
85
78
}
86
79
87
- // Reduce vector to scalar
88
80
T max_val = -std::numeric_limits<T>::infinity ();
89
81
const T* max_arr = reinterpret_cast <const T*>(&vmax);
90
82
for (size_t i = 0 ; i < elements_per_vector; i++) {
@@ -93,7 +85,6 @@ class FloatMaxFinder {
93
85
}
94
86
}
95
87
96
- // Handle remainder
97
88
const T* remain = data + (vlen * elements_per_vector);
98
89
for (size_t i = 0 ; i < n % elements_per_vector; i++) {
99
90
if (remain[i] == remain[i]) { // Not NaN
@@ -115,4 +106,19 @@ T find_float_max(const T *data, size_t n) {
115
106
return FloatMaxFinder<T>::find (data, n);
116
107
}
117
108
109
+ #else
110
+
111
+ template <typename T>
112
+ typename std::enable_if<std::is_integral<T>::value, T>::type
113
+ find_float_min (const T *data, size_t n) {
114
+ return *std::min_element (data, data + n);
115
+ }
116
+
117
+ template <typename T>
118
+ typename std::enable_if<std::is_integral<T>::value, T>::type
119
+ find_float_max (const T *data, size_t n) {
120
+ return *std::max_element (data, data + n);
121
+ }
122
+
123
+ #endif
118
124
} // namespace arcticdb
0 commit comments