Я хочу генерировать псевдослучайные числа параллельно с помощью openMP, примерно так:
int i;
#pragma omp parallel for
for (i=0;i<100;i++)
{
printf("%d %d %d\n",i,omp_get_thread_num(),rand());
}
return 0;
Я тестировал его на окнах, и у меня получилось огромное ускорение, но каждый поток генерировал точно такие же числа. Я тестировал его и в Linux, и у меня было значительное замедление, параллельная версия на 8-процессорном процессоре была примерно на 10 раз медленнее, чем последовательная, но каждый поток генерировал разные номера.
Есть ли способ иметь как ускорение, так и разные числа?
Изменить 27.11.2010
Думаю, я решил это, используя идею Джонатана Дурси. Похоже, что следующий код работает быстро и для Linux, и для Windows. Числа также псевдослучайны. Что вы думаете об этом?
int seed[10];
int main(int argc, char **argv)
{
int i,s;
for (i=0;i<10;i++)
seed[i] = rand();
#pragma omp parallel private(s)
{
s = seed[omp_get_thread_num()];
#pragma omp for
for (i=0;i<1000;i++)
{
printf("%d %d %d\n",i,omp_get_thread_num(),s);
s=(s*17931+7391); // those numbers should be choosen more carefully
}
seed[omp_get_thread_num()] = s;
}
return 0;
}
PS: Я еще не принял никакого ответа, потому что мне нужно быть уверенным, что эта идея хорошая.