MCPcopy Create free account
hub / github.com/arrayfire/arrayfire / initMersenneKernel

Class initMersenneKernel

src/backend/oneapi/kernel/random_engine_mersenne.hpp:105–144  ·  view source on GitHub ↗

Initialization

Source from the content-addressed store, hash-verified

103
104// Initialization
105class 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
146void initMersenneState(Param<uint> state, const Param<uint> tbl, uintl seed) {
147 sycl::nd_range<1> ndrange({BLOCKS * N}, {N});

Callers 1

initMersenneStateFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected