В OpenMP, как работает планирование stati c, когда количество потоков не делится равномерно на число итераций в параллели для l oop? - PullRequest
0 голосов
/ 13 марта 2020

Я понимаю общую идею о том, как работает планирование stati c, но меня смущает одна ситуация, когда в параллели OpenMP для l oop с планированием stati c, заданным размером порции и данным количество потоков, как компилятор будет распределять итерации между потоками, если количество потоков не делится поровну на количество итераций?

Например:

#pragma omp parallel for num_threads(4) schedule(static, 2)
  for (int i = 0; i < 10; i++) {

Здесь есть параллель для l oop с 4 потоками, 10 итерациями и расписанием stati c с размером фрагмента 2. Будет ли компилятор распределяет итерации так, что количество итераций для каждого соответствующего потока будет выглядеть примерно как 3-3-2-2? Или это может быть любой тип распределения, такой как 2-2-3-3, 2-3-2-3, 3-2-2-3, et c.

1 Ответ

0 голосов
/ 13 марта 2020

В разделе 2.9.2 спецификации OpenMP 5.0 говорится:

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

Таким образом, результат в этом случае 4-2-2-2.

...