Я пытаюсь распараллелить for-loop с помощью OpenMP. Обычно это должно быть достаточно простым. Однако мне нужно выполнить инициализацию, зависящую от потока, до выполнения цикла for.OpenMP 'parallel for' с предшествующей инициализацией
В частности, у меня есть следующая проблема: у меня есть генератор случайных чисел, который не является потокобезопасным, поэтому мне нужно создать экземпляр RNG для каждого потока. Но я хочу убедиться, что не каждый поток будет генерировать одинаковые случайные числа.
Так что я попытался следующие:
#pragma omp parallel
{
int rndseed = 42;
#ifdef _OPENMP
rndseed += omp_get_thread_num();
#endif
// initialize randon number generator
#pragma omp for
for (int sampleid = 0; sampleid < numsamples; ++sampleid)
{
// do stuff
}
}
Если я использую эту конструкцию, я получаю следующее сообщение об ошибке во время выполнения:
Фатальная ошибка Пользователь 1002: «#pragma OMP для» неправильно вложенными в конструкции совместного использования
Итак, есть ли способ инициализации, зависящий от потока?
спасибо
Почему бы не высеять каждый RNG из '/ dev/urandom', который даст вам хорошие семена и разные значения каждой нити? –
Я не знаю, почему это не для вас, но для использования случайных чисел см. Это http://stackoverflow.com/questions/10624755/openmp-program-is-slower-than-sequential-one –
Код, который вы показываете не является причиной проблемы. (Вы не показываете конструкцию совместного использования, вложенную в конструкцию совместного использования). Я ожидаю, что у вас на самом деле есть * другой * #pragma omp для где-то внутри «do stuff». –