Initialization
| 103 | |
| 104 | // Initialization |
| 105 | class initMersenneKernel { |
| 106 | public: |
| 107 | initMersenneKernel(write_accessor<uint> state, read_accessor<uint> tbl, |
| 108 | sycl::local_accessor<uint, 1> lstate, uintl seed) |
| 109 | : state_(state), tbl_(tbl), lstate_(lstate), seed_(seed) {} |
| 110 | |
| 111 | void operator()(sycl::nd_item<1> it) const { |
| 112 | sycl::group g = it.get_group(); |
| 113 | |
| 114 | const uint *ltbl = |
| 115 | tbl_.get_pointer() + (TABLE_SIZE * g.get_group_id(0)); |
| 116 | uint hidden_seed = ltbl[4] ^ (ltbl[8] << 16); |
| 117 | uint tmp = hidden_seed; |
| 118 | tmp += tmp >> 16; |
| 119 | tmp += tmp >> 8; |
| 120 | tmp &= 0xff; |
| 121 | tmp |= tmp << 8; |
| 122 | tmp |= tmp << 16; |
| 123 | lstate_[it.get_local_id(0)] = tmp; |
| 124 | it.barrier(); |
| 125 | if (it.get_local_id(0) == 0) { |
| 126 | lstate_[0] = seed_; |
| 127 | lstate_[1] = hidden_seed; |
| 128 | for (int i = 1; i < N; ++i) { |
| 129 | lstate_[i] ^= ((uint)(1812433253) * |
| 130 | (lstate_[i - 1] ^ (lstate_[i - 1] >> 30)) + |
| 131 | i); |
| 132 | } |
| 133 | } |
| 134 | it.barrier(); |
| 135 | state_[N * g.get_group_id(0) + it.get_local_id(0)] = |
| 136 | lstate_[it.get_local_id(0)]; |
| 137 | } |
| 138 | |
| 139 | protected: |
| 140 | write_accessor<uint> state_; |
| 141 | read_accessor<uint> tbl_; |
| 142 | sycl::local_accessor<uint, 1> lstate_; |
| 143 | uintl seed_; |
| 144 | }; |
| 145 | |
| 146 | void initMersenneState(Param<uint> state, const Param<uint> tbl, uintl seed) { |
| 147 | sycl::nd_range<1> ndrange({BLOCKS * N}, {N}); |