OpenMP параллельно "для" со "статическим" расписанием - PullRequest
0 голосов
/ 28 февраля 2019

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

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

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

  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

enter image description here

Ответы [ 2 ]

0 голосов
/ 04 марта 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 гласит, что блоки должны быть примерно одинакового размера, без указания точного алгоритма распределения.

0 голосов
/ 28 февраля 2019

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

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

...