Хранение списка rng в массиве std :: для многопоточности - PullRequest
0 голосов
/ 12 января 2012

Я бы хотел многопоточность моей rng-части моего кода, используя C ++ 11.

Я создаю группу RNG, как это:

typedef std::mt19937 mersenne_twister;
typedef std::uniform_real_distribution<double> unidist;

// 8 rng engines with 8 consecutive seeds
const size_t Nrng = 8;
const array<uint32_t,Nrng> seed_values = {0,1,2,3,4,5,6,7};
array<mersenne_twister,Nrng> engines;
const array<unidist,Nrng> distributions; // default constructor is for [0,1] interval

const array<????,Nrng> rngs; // What type do I put here?

for( size_t i=0; i<Nrng; ++i )
    engines[i].seed(seed_values[i]);
    rngs[i] = std::bind(distributions[i], engines[i]);

С идеей я могупозже передайте каждый из объектов ГСЧ в отдельный std::thread, который заполняет другой array некоторой формой случайных чисел, используя предоставленный генератор.Я не знаю, какой тип мне нужно использовать для rng array.Я знаю, как создать один rng, вот так:

auto rng = std::bind(unidist, generator);

, но мне нужно явно иметь тип (decltype d?) Для array.

1 Ответ

2 голосов
/ 12 января 2012

Один из возможных типов будет std::function<double()>, но учтите, что это не бесплатно.Фактический тип результата bind неизвестен, и поэтому вы не можете просто создать контейнер с типом элемента decltype(std::bind(...)), поскольку не гарантируется взаимная конверсия типов - все, что вы знаете, это то, что все они конвертируются в function.

Если это критично для производительности, я предлагаю вам профиль и сравнить стоимость std::function с прямым использованием unidist(rngs[i]) в вашем целевом коде.(Дистрибутив представляет собой адаптер без сохранения состояния, который в любом случае должен быть повторно входящим, поэтому вам не нужно хранить более одной его копии.)

...