@@ -170,18 +170,21 @@ class Xoshiro {
170170
171171} // namespace internal
172172
173+ template <int kPow2 = 1 >
173174class VectorXoshiro {
174175 private:
175- using VU64 = Vec<ScalableTag<std::uint64_t >>;
176+ using TagU64 = ScalableTag<std::uint64_t , kPow2 >;
177+ using TagF64 = ScalableTag<double , kPow2 >;
178+
179+ using VU64 = Vec<TagU64>;
176180 using StateType = AlignedNDArray<std::uint64_t , 2 >;
177181#if HWY_HAVE_FLOAT64
178- using VF64 = Vec<ScalableTag< double > >;
182+ using VF64 = Vec<TagF64 >;
179183#endif
180184 public:
181185 explicit VectorXoshiro (const std::uint64_t seed,
182186 const std::uint64_t threadNumber = 0 )
183- : state_{{internal::Xoshiro::StateSize (),
184- Lanes (ScalableTag<std::uint64_t >{})}},
187+ : state_{{internal::Xoshiro::StateSize (), Lanes (TagU64{})}},
185188 streams{state_.shape ().back ()} {
186189 internal::Xoshiro xoshiro{seed};
187190
@@ -202,7 +205,7 @@ class VectorXoshiro {
202205
203206 AlignedVector<std::uint64_t > operator ()(const std::size_t n) {
204207 AlignedVector<std::uint64_t > result (n);
205- const ScalableTag<std:: uint64_t > tag{};
208+ const TagU64 tag{};
206209 auto s0 = Load (tag, state_[{0 }].data ());
207210 auto s1 = Load (tag, state_[{1 }].data ());
208211 auto s2 = Load (tag, state_[{2 }].data ());
@@ -221,7 +224,7 @@ class VectorXoshiro {
221224 template <std::uint64_t N>
222225 std::array<std::uint64_t , N> operator ()() noexcept {
223226 alignas (HWY_ALIGNMENT) std::array<std::uint64_t , N> result;
224- const ScalableTag<std:: uint64_t > tag{};
227+ const TagU64 tag{};
225228 auto s0 = Load (tag, state_[{0 }].data ());
226229 auto s1 = Load (tag, state_[{1 }].data ());
227230 auto s2 = Load (tag, state_[{2 }].data ());
@@ -246,7 +249,7 @@ class VectorXoshiro {
246249#if HWY_HAVE_FLOAT64
247250
248251 HWY_INLINE VF64 Uniform () noexcept {
249- const ScalableTag< double > real_tag{};
252+ const TagF64 real_tag{};
250253 const auto MUL_VALUE = Set (real_tag, internal::kMulConst );
251254 const auto bits = ShiftRight<11 >(Next ());
252255 const auto real = ConvertTo (real_tag, bits);
@@ -255,8 +258,8 @@ class VectorXoshiro {
255258
256259 AlignedVector<double > Uniform (const std::size_t n) {
257260 AlignedVector<double > result (n);
258- const ScalableTag<std:: uint64_t > tag{};
259- const ScalableTag< double > real_tag{};
261+ const TagU64 tag{};
262+ const TagF64 real_tag{};
260263 const auto MUL_VALUE = Set (real_tag, internal::kMulConst );
261264
262265 auto s0 = Load (tag, state_[{0 }].data ());
@@ -282,8 +285,8 @@ class VectorXoshiro {
282285 template <std::uint64_t N>
283286 std::array<double , N> Uniform () noexcept {
284287 alignas (HWY_ALIGNMENT) std::array<double , N> result;
285- const ScalableTag<std:: uint64_t > tag{};
286- const ScalableTag< double > real_tag{};
288+ const TagU64 tag{};
289+ const TagF64 real_tag{};
287290 const auto MUL_VALUE = Set (real_tag, internal::kMulConst );
288291
289292 auto s0 = Load (tag, state_[{0 }].data ());
@@ -326,7 +329,7 @@ class VectorXoshiro {
326329 }
327330
328331 HWY_INLINE VU64 Next () noexcept {
329- const ScalableTag<std:: uint64_t > tag{};
332+ const TagU64 tag{};
330333 auto s0 = Load (tag, state_[{0 }].data ());
331334 auto s1 = Load (tag, state_[{1 }].data ());
332335 auto s2 = Load (tag, state_[{2 }].data ());
@@ -368,7 +371,7 @@ class CachedXoshiro {
368371 }
369372
370373 private:
371- VectorXoshiro generator_;
374+ VectorXoshiro< /* kPow2= */ 1 > generator_;
372375 alignas (HWY_ALIGNMENT) std::array<result_type, size> cache_;
373376 std::size_t index_;
374377
0 commit comments