Почему OpenMP замедляет мой цикл? [Дубликат]

одним способом переключения является использование множественного присваивания

>>> a = 5
>>> b = 3

>>> t = a, b = b, a
>>> t[0]
3

>>> t = a, b = b, a
>>> t[0]
5

Использование itertools:

In [12]: foo = itertools.cycle([1, 2, 3])

In [13]: next(foo)
Out[13]: 1

In [14]: next(foo)
Out[14]: 2

In [15]: next(foo)
Out[15]: 3

In [16]: next(foo)
Out[16]: 1

In [17]: next(foo)
Out[17]: 2
7
задан Islam Hassan 16 May 2012 в 19:47
поделиться

1 ответ

Генератор случайных чисел rand(3) использует глобальные переменные состояния (скрытые в реализации (g) libc). Доступ к ним из нескольких потоков приводит к проблемам с кешем, а также не является потокобезопасным. Вы должны использовать вызов rand_r(3) с параметром seed, приватным для потока:

long i;
unsigned seed;

#pragma omp parallel private(seed)
{
    // Initialise the random number generator with different seed in each thread
    // The following constants are chosen arbitrarily... use something more sensible
    seed = 25234 + 17*omp_get_thread_num();
    #pragma omp for
    for (i = 0; i <= 1000000000; i++) {
       double x = rand_r(&seed);
    }
}

Обратите внимание, что при параллельном запуске будет производиться другой поток случайных чисел, чем при выполнении в последовательном порядке. Я также рекомендовал бы erand48(3) как лучший (псевдо) случайный номер источника.

13
ответ дан Hristo Iliev 26 August 2018 в 14:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: