Параллельный OpenMP для со статическим расписанием

У меня есть путаница или, возможно, неправильное понимание поведения parallel for с расписанием static и размером блока по умолчанию.

Например, на картинке ниже. Что я исключаю, так это то, что да, главный поток выполнит дополнительную итерацию, но я исключил, что это будет индекс 8, а не 2!

Алгоритм статического расписания с размером фрагмента по умолчанию применяет циклический перебор к (#iterations / #threads) с двумя случаями.

  1. Если #iterations делится на #threads, например N=8 и #threads=4, каждый поток будет выполнять равное количество итераций в циклическом режиме (прямой случай)

  2. Если #iterations не делится на #threads. Он рассчитает ближайшее целое число итераций, деленное на #threads, и сделает то же самое, что и выше.

случай N=9 --> 8 разделит 2 2 2 2 и 1

в случае N=11 --> 12 он будет разделен на 3 3 3 и 2

темы 0 1 2 3

введите здесь описание изображения


person N0rA    schedule 28.02.2019    source источник
comment
Опубликуйте минимально воспроизводимый пример и результат, который вы получите в виде текста внутри вашего вопроса.   -  person Zulan    schedule 28.02.2019


Ответы (2)


Когда вы используете статическое планирование, реализация OpenMP должна будет гарантировать, что все итерации будут вычисляться каким-либо потоком, если количество потоков не делится поровну на количество итераций.

С точки зрения балансировки нагрузки компилятор попытается выделить примерно одинаковое количество итераций для каждого потока и избежать получения одним потоком всех оставшихся итераций, превышающих деление. Итак, в вашем примере с N = 11 и четырьмя потоками остаток будет равен 3, а первые три потока 0..2 получат одну дополнительную итерацию вместо того, чтобы назначать 3 дополнительные итерации последнему потоку.

person Michael Klemm    schedule 28.02.2019
comment
ага!, так что N --› ​​9 и 4 темы у нас есть напоминание 1, оно будет 3 2 2 2 N --› ​​11 и 4 темы у нас есть 3 напоминание, тогда оно будет 3 3 3 2 Большое спасибо! - person N0rA; 28.02.2019

Ваше ожидание распределения итераций для статического расписания без фрагментов неверно. Циклическое распределение указано только для расписания (статическое, фрагмент), а не для расписания (статическое), когда «на каждый поток распределяется не более одного фрагмента».

Итерации 0, 1 и 8 образуют два фрагмента, поскольку они не являются последовательными и поэтому не могут быть назначены одному и тому же потоку. Допустимые распределения 9 итераций на 4 потока: 3-2-2-2, 2-3-2-2, 2-2-3-2, 2-2-2-3, 3-3-2-1, и т. д., даже 3-3-3-0 будет действительным. Все, что говорит спецификация OpenMP, это то, что куски должны быть примерно одинаковыми по размеру, без указания точного алгоритма распределения.

person Andrey Churbanov    schedule 04.03.2019