|
1 |
| -// RUN: %clangxx -g -O0 -fsycl -fsycl-targets=%sycl_triple %s -o %t.out |
| 1 | +// RUN: %clangxx -fsycl -fsycl-targets=%sycl_triple %s -o %t.out |
2 | 2 | // RUN: %t.out
|
3 | 3 |
|
4 | 4 | //==-------- sub_group_mask.cpp - SYCL sub-group mask test -----------------==//
|
|
13 | 13 | #include <iostream>
|
14 | 14 |
|
15 | 15 | int main() {
|
16 |
| - auto g = sycl::detail::Builder::createSubGroupMask< |
17 |
| - sycl::ext::oneapi::sub_group_mask>(0, 32); |
18 |
| - assert(g.none() && !g.any() && !g.all()); |
19 |
| - assert(g[10] == false); // reference::operator[](id) const; |
20 |
| - g[10] = true; // reference::operator=(bool); |
21 |
| - assert(g[10] == true); |
22 |
| - g[11] = g[10]; // reference::operator=(reference) reference::operator[](id); |
23 |
| - assert(g[10].flip() == false); // reference::flip() |
24 |
| - assert(~g[10] == true); // refernce::operator~() |
25 |
| - assert(g[10] == false); |
26 |
| - assert(g[11] == true); |
27 |
| - assert(g.test(10) == false && g.test(11) == true); |
28 |
| - g.set(30, 1); |
29 |
| - g.set(11, 0); |
30 |
| - g.set(23, 1); |
31 |
| - assert(!g.none() && g.any() && !g.all()); |
| 16 | + for (size_t sgsize = 32; sgsize > 4; sgsize /= 2) { |
| 17 | + std::cout << "Running test for sub-group size = " << sgsize << std::endl; |
| 18 | + auto g = sycl::detail::Builder::createSubGroupMask< |
| 19 | + sycl::ext::oneapi::sub_group_mask>(0, sgsize); |
| 20 | + assert(g.none() && !g.any() && !g.all()); |
| 21 | + assert(g[5] == false); // reference::operator[](id) const; |
| 22 | + g[5] = true; // reference::operator=(bool); |
| 23 | + assert(g[5] == true); |
| 24 | + g[6] = g[5]; // reference::operator=(reference) reference::operator[](id); |
| 25 | + assert(g[5].flip() == false); // reference::flip() |
| 26 | + assert(~g[5 % sgsize] == true); // refernce::operator~() |
| 27 | + assert(g[5 % sgsize] == false); |
| 28 | + assert(g[6 % sgsize] == true); |
| 29 | + assert(g.test(5 % sgsize) == false && g.test(6 % sgsize) == true); |
| 30 | + g.set(3 % sgsize, 1); |
| 31 | + g.set(6 % sgsize, 0); |
| 32 | + g.set(2 % sgsize, 1); |
| 33 | + assert(!g.none() && g.any() && !g.all()); |
32 | 34 |
|
33 |
| - assert(g.count() == 2); |
34 |
| - assert(g.find_low() == 23); |
35 |
| - assert(g.find_high() == 30); |
36 |
| - assert(g.size() == 32); |
| 35 | + assert(g.count() == 2); |
| 36 | + assert(g.find_low() == 2 % sgsize); |
| 37 | + assert(g.find_high() == 3 % sgsize); |
| 38 | + assert(g.size() == sgsize); |
37 | 39 |
|
38 |
| - g.reset(); |
39 |
| - assert(g.none() && !g.any() && !g.all()); |
40 |
| - assert(g.find_low() == g.size() && g.find_high() == g.size()); |
41 |
| - g.set(); |
42 |
| - assert(!g.none() && g.any() && g.all()); |
43 |
| - assert(g.find_low() == 0 && g.find_high() == 31); |
44 |
| - g.flip(); |
45 |
| - assert(g.none() && !g.any() && !g.all()); |
| 40 | + g.reset(); |
| 41 | + assert(g.none() && !g.any() && !g.all()); |
| 42 | + assert(g.find_low() == g.size() && g.find_high() == g.size()); |
| 43 | + g.set(); |
| 44 | + assert(!g.none() && g.any() && g.all()); |
| 45 | + assert(g.find_low() == 0 && g.find_high() == 31 % sgsize); |
| 46 | + g.flip(); |
| 47 | + assert(g.none() && !g.any() && !g.all()); |
46 | 48 |
|
47 |
| - g.flip(13); |
48 |
| - g.flip(23); |
49 |
| - g.flip(29); |
50 |
| - auto b = g; |
51 |
| - assert(b == g && !(b != g)); |
52 |
| - g.flip(31); |
53 |
| - assert(g.find_high() == 31); |
54 |
| - assert(b.find_high() == 29); |
55 |
| - assert(b != g && !(b == g)); |
56 |
| - b.flip(31); |
57 |
| - assert(b == g && !(b != g)); |
58 |
| - b = g >> 1; |
59 |
| - assert(b[12] && b[22] && b[28] && b[30]); |
60 |
| - b <<= 1; |
61 |
| - assert(b == g); |
62 |
| - g ^= ~b; |
63 |
| - assert(!g.none() && g.any() && g.all()); |
64 |
| - assert((g | ~g).all()); |
65 |
| - assert((g & ~g).none()); |
66 |
| - assert((g ^ ~g).all()); |
67 |
| - b.reset_low(); |
68 |
| - b.reset_high(); |
69 |
| - assert(!b[13] && b[23] && b[29] && !b[31]); |
70 |
| - b.insert_bits(0x01020408); |
71 |
| - assert(b[24] && b[17] && b[10] && b[3]); |
72 |
| - b <<= 13; |
73 |
| - assert(!b[24] && !b[17] && !b[10] && !b[3] && b[30] && b[23] && b[16]); |
74 |
| - b.insert_bits((char)0b01010101, 18); |
75 |
| - assert(b[18] && b[20] && b[22] && b[24] && b[30] && !b[23] && b[16]); |
76 |
| - b[3] = true; |
77 |
| - b.insert_bits(sycl::marray<char, 8>{1, 2, 4, 8, 16, 32, 64, 128}, 5); |
78 |
| - assert(!b[18] && !b[20] && !b[22] && !b[24] && !b[30] && !b[16] && b[3] && |
79 |
| - b[5] && b[14] && b[23]); |
80 |
| - char r, rbc; |
81 |
| - const auto b_const{b}; |
82 |
| - b.extract_bits(r); |
83 |
| - b_const.extract_bits(rbc); |
84 |
| - assert(r == 0b00101000); |
85 |
| - assert(rbc == 0b00101000); |
86 |
| - long r2 = -1, r2bc = -1; |
87 |
| - b.extract_bits(r2, 16); |
88 |
| - b_const.extract_bits(r2bc, 16); |
89 |
| - assert(r2 == 128); |
90 |
| - assert(r2bc == 128); |
| 49 | + g.flip(2); |
| 50 | + g.flip(3); |
| 51 | + g.flip(7); |
| 52 | + auto b = g; |
| 53 | + assert(b == g && !(b != g)); |
| 54 | + g.flip(7); |
| 55 | + assert(g.find_high() == 3 % sgsize); |
| 56 | + assert(b.find_high() == 7 % sgsize); |
| 57 | + assert(b != g && !(b == g)); |
| 58 | + g.flip(7); |
| 59 | + assert(b == g && !(b != g)); |
| 60 | + b = g >> 1; |
| 61 | + assert(b[1] && b[2] && b[6]); |
| 62 | + b <<= 1; |
| 63 | + assert(b == g); |
| 64 | + g ^= ~b; |
| 65 | + assert(!g.none() && g.any() && g.all()); |
| 66 | + assert((g | ~g).all()); |
| 67 | + assert((g & ~g).none()); |
| 68 | + assert((g ^ ~g).all()); |
| 69 | + b.reset_low(); |
| 70 | + b.reset_high(); |
| 71 | + assert(!b[2] && b[3] && !b[7]); |
| 72 | + b.insert_bits(0x01020408); |
| 73 | + assert(((b[24] && b[17]) || sgsize < 32) && (b[10] || sgsize < 16) && b[3]); |
| 74 | + b <<= 10; |
| 75 | + assert(((!b[24] && !b[17] && b[27] && b[20]) || sgsize < 32) && |
| 76 | + ((!b[10] && b[13]) || sgsize < 16) && !b[3]); |
| 77 | + b.insert_bits((char)0b01010101, 6); |
| 78 | + assert(b[6] && ((b[8] && b[10] && b[12] && !b[13]) || sgsize < 16)); |
| 79 | + b[3] = true; |
| 80 | + b.insert_bits(sycl::marray<char, 8>{1, 2, 4, 8, 16, 32, 64, 128}, 5); |
| 81 | + assert( |
| 82 | + ((!b[18] && !b[20] && !b[22] && !b[24] && !b[30] && !b[16] && b[23]) || |
| 83 | + sgsize < 32) && |
| 84 | + b[3] && b[5] && (b[14] || sgsize < 16)); |
| 85 | + b.flip(14); |
| 86 | + b.flip(23); |
| 87 | + char r, rbc; |
| 88 | + const auto b_const{b}; |
| 89 | + b.extract_bits(r); |
| 90 | + b_const.extract_bits(rbc); |
| 91 | + assert(r == 0b00101000); |
| 92 | + assert(rbc == 0b00101000); |
| 93 | + long r2 = -1, r2bc = -1; |
| 94 | + b.extract_bits(r2, 3); |
| 95 | + b_const.extract_bits(r2bc, 3); |
| 96 | + assert(r2 == 5); |
| 97 | + assert(r2bc == 5); |
91 | 98 |
|
92 |
| - b[31] = true; |
93 |
| - const auto b_const2{b}; |
94 |
| - sycl::marray<char, 6> r3{-1}, r3bc{-1}; |
95 |
| - b.extract_bits(r3, 14); |
96 |
| - b_const2.extract_bits(r3bc, 14); |
97 |
| - assert(r3[0] == 1 && r3[1] == 2 && r3[2] == 2 && !r3[3] && !r3[4] && !r3[5]); |
98 |
| - assert(r3bc[0] == 1 && r3bc[1] == 2 && r3bc[2] == 2 && !r3bc[3] && !r3bc[4] && |
99 |
| - !r3bc[5]); |
100 |
| - int ibits = 0b1010101010101010101010101010101; |
101 |
| - b.insert_bits(ibits); |
102 |
| - for (size_t i = 0; i < 32; i++) { |
103 |
| - assert(b[i] != (bool)(i % 2)); |
| 99 | + b.insert_bits((uint32_t)0x08040201); |
| 100 | + const auto b_const2{b}; |
| 101 | + sycl::marray<char, 6> r3{-1}, r3bc{-1}; |
| 102 | + b.extract_bits(r3); |
| 103 | + b_const2.extract_bits(r3bc); |
| 104 | + assert(r3[0] == 1 && r3[1] == (sgsize > 8 ? 2 : 0) && |
| 105 | + r3[2] == (sgsize > 16 ? 4 : 0) && r3[3] == (sgsize > 16 ? 8 : 0) && |
| 106 | + !r3[4] && !r3[5]); |
| 107 | + assert(r3bc[0] == 1 && r3bc[1] == (sgsize > 8 ? 2 : 0) && |
| 108 | + r3bc[2] == (sgsize > 16 ? 4 : 0) && |
| 109 | + r3bc[3] == (sgsize > 16 ? 8 : 0) && !r3bc[4] && !r3bc[5]); |
| 110 | + int ibits = 0b1010101010101010101010101010101; |
| 111 | + b.insert_bits(ibits); |
| 112 | + for (size_t i = 0; i < sgsize; i++) { |
| 113 | + assert(b[i] != (bool)(i % 2)); |
| 114 | + } |
| 115 | + short sbits = 0b0111011101110111; |
| 116 | + b.insert_bits(sbits, 7); |
| 117 | + b.extract_bits(ibits); |
| 118 | + assert(ibits == |
| 119 | + (0b1010101001110111011101111010101 & ((1ULL << sgsize) - 1ULL))); |
| 120 | + sbits = 0b1100001111000011; |
| 121 | + b.insert_bits(sbits, 23); |
| 122 | + b.extract_bits(ibits); |
| 123 | + if (sgsize >= 32) { |
| 124 | + int64_t lbits = -1; |
| 125 | + b.extract_bits(lbits, 33); |
| 126 | + assert(lbits == 0); |
| 127 | + lbits = -1; |
| 128 | + b.extract_bits(lbits, 5); |
| 129 | + assert(lbits == |
| 130 | + (0b111000011011101110111011110 & ((1ULL << sgsize) - 1ULL))); |
| 131 | + lbits = -1; |
| 132 | + b.insert_bits(lbits); |
| 133 | + assert(b.all()); |
| 134 | + } |
104 | 135 | }
|
105 |
| - short sbits = 0b0111011101110111; |
106 |
| - b.insert_bits(sbits, 7); |
107 |
| - b.extract_bits(ibits); |
108 |
| - assert(ibits == 0b1010101001110111011101111010101); |
109 |
| - sbits = 0b1100001111000011; |
110 |
| - b.insert_bits(sbits, 23); |
111 |
| - b.extract_bits(ibits); |
112 |
| - assert(ibits == 0b11100001101110111011101111010101); |
113 |
| - int64_t lbits = -1; |
114 |
| - b.extract_bits(lbits, 33); |
115 |
| - assert(lbits == 0); |
116 |
| - lbits = -1; |
117 |
| - b.extract_bits(lbits, 5); |
118 |
| - assert(lbits == 0b111000011011101110111011110); |
119 |
| - lbits = -1; |
120 |
| - b.insert_bits(lbits); |
121 |
| - assert(b.all()); |
122 | 136 | }
|
0 commit comments