|
14 | 14 | //
|
15 | 15 | // Also licensed under MIT license, at your choice.
|
16 | 16 |
|
| 17 | +struct Element { |
| 18 | + data: u32; |
| 19 | + flag: atomic<u32>; |
| 20 | +}; |
| 21 | + |
17 | 22 | [[block]]
|
18 | 23 | struct DataBuf {
|
19 |
| - data: [[stride(4)]] array<atomic<u32>>; |
| 24 | + data: [[stride(8)]] array<Element>; |
20 | 25 | };
|
21 | 26 |
|
22 | 27 | [[block]]
|
@@ -48,23 +53,17 @@ fn main([[builtin(global_invocation_id)]] global_id: vec3<u32>) {
|
48 | 53 | var failures = 0u;
|
49 | 54 | for (var i: u32 = 0u; i < n_iter; i = i + 1u) {
|
50 | 55 | let wr_flag_ix = permute_flag_ix(ix);
|
51 |
| - atomicStore(&data_buf.data[ix * 2u], i + 1u); |
| 56 | + data_buf.data[ix].data = i + 1u; |
52 | 57 | storageBarrier(); // release semantics for writing flag
|
53 |
| - atomicStore(&data_buf.data[wr_flag_ix * 2u + 1u], i + 1u); |
| 58 | + atomicStore(&data_buf.data[wr_flag_ix].flag, i + 1u); |
54 | 59 |
|
55 | 60 | // Read from a different workgroup
|
56 | 61 | let read_ix = ((ix & 0xffu) << 8u) | (ix >> 8u);
|
57 | 62 | let read_flag_ix = permute_flag_ix(read_ix);
|
58 | 63 |
|
59 |
| - let flag = atomicLoad(&data_buf.data[read_flag_ix * 2u + 1u]); |
60 |
| - //let flag = atomicOr(&data_buf.data[read_flag_ix * 2u + 1u], 0u); |
| 64 | + let flag = atomicLoad(&data_buf.data[read_flag_ix].flag); |
61 | 65 | storageBarrier(); // acquire semantics for reading flag
|
62 |
| - var data = 0u; |
63 |
| - if (strategy == 0u) { |
64 |
| - data = atomicLoad(&data_buf.data[read_ix * 2u]); |
65 |
| - } else { |
66 |
| - data = atomicOr(&data_buf.data[read_ix * 2u], 0u); |
67 |
| - } |
| 66 | + let data = data_buf.data[read_ix].data; |
68 | 67 | if (flag > data) {
|
69 | 68 | failures = failures + 1u;
|
70 | 69 | }
|
|
0 commit comments