@@ -5,7 +5,7 @@ class avx512_select : public ::testing::Test {
5
5
};
6
6
TYPED_TEST_SUITE_P (avx512_select);
7
7
8
- TYPED_TEST_P (avx512_select, test_arrsizes )
8
+ TYPED_TEST_P (avx512_select, test_random )
9
9
{
10
10
if (cpu_has_avx512bw ()) {
11
11
if ((sizeof (TypeParam) == 2 ) && (!cpu_has_avx512_vbmi2 ())) {
@@ -48,4 +48,47 @@ TYPED_TEST_P(avx512_select, test_arrsizes)
48
48
}
49
49
}
50
50
51
- REGISTER_TYPED_TEST_SUITE_P (avx512_select, test_arrsizes);
51
+ TYPED_TEST_P (avx512_select, test_small_range)
52
+ {
53
+ if (cpu_has_avx512bw ()) {
54
+ if ((sizeof (TypeParam) == 2 ) && (!cpu_has_avx512_vbmi2 ())) {
55
+ GTEST_SKIP () << " Skipping this test, it requires avx512_vbmi2" ;
56
+ }
57
+ std::vector<int64_t > arrsizes;
58
+ for (int64_t ii = 0 ; ii < 1024 ; ++ii) {
59
+ arrsizes.push_back (ii);
60
+ }
61
+ std::vector<TypeParam> arr;
62
+ std::vector<TypeParam> sortedarr;
63
+ std::vector<TypeParam> psortedarr;
64
+ for (size_t ii = 0 ; ii < arrsizes.size (); ++ii) {
65
+ /* Random array */
66
+ arr = get_uniform_rand_array<TypeParam>(arrsizes[ii], 20 , 1 );
67
+ sortedarr = arr;
68
+ /* Sort with std::sort for comparison */
69
+ std::sort (sortedarr.begin (), sortedarr.end ());
70
+ for (size_t k = 0 ; k < arr.size (); ++k) {
71
+ psortedarr = arr;
72
+ avx512_qselect<TypeParam>(psortedarr.data (), k, psortedarr.size ());
73
+ /* index k is correct */
74
+ ASSERT_EQ (sortedarr[k], psortedarr[k]);
75
+ /* Check left partition */
76
+ for (size_t jj = 0 ; jj < k; jj++) {
77
+ ASSERT_LE (psortedarr[jj], psortedarr[k]);
78
+ }
79
+ /* Check right partition */
80
+ for (size_t jj = k+1 ; jj < arr.size (); jj++) {
81
+ ASSERT_GE (psortedarr[jj], psortedarr[k]);
82
+ }
83
+ psortedarr.clear ();
84
+ }
85
+ arr.clear ();
86
+ sortedarr.clear ();
87
+ }
88
+ }
89
+ else {
90
+ GTEST_SKIP () << " Skipping this test, it requires avx512bw" ;
91
+ }
92
+ }
93
+
94
+ REGISTER_TYPED_TEST_SUITE_P (avx512_select, test_random, test_small_range);
0 commit comments