|
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