We can fill a range [first, last)
using
std::mt19937 g;
std::uniform_real_distribution<> u;
std::generate(first, last, [&]() { return u(g); });
Theoretically, it would be more performant to execute std::generate
with the execution policy std::execution::par_unseq
. However, we could write
std::generate(std::execution::par_unseq, first, last, [&]() { return u(g); });
but is this really safe? I think, parallal access to g
might be problematic. If that's actually true, how can we fix this? I've seen strange looking code like
std::generate(std::execution::par_unseq, first, last, []()
{
thread_local std::mt19937 g;
thread_local std::uniform_real_distribution<> u;
return u(g);
});
But is thread_local
really sensible here? And how should g
be seeded here if the generated samples are supposed to be independent?
Aucun commentaire:
Enregistrer un commentaire