static – распределение итераций цикла; размер блока – chunk.
Первый блок из chunk итераций выполняет нулевая нить, второй блок –
следующая и т.д. до последней нити, затем распределение снова
начинается с нулевой нити. Если значение chunk не указано, то всё
множество итераций делится на непрерывные куски примерно
одинакового размера (конкретный способ зависит от реализации), и
полученные порции итераций распределяются между нитями.
dynamic – динамическое распределение итераций с фиксированным
размером блока: сначала каждая нить получает chunk итераций (по
умолчанию chunk=1), та нить, которая заканчивает выполнение своей
порции итераций, получает первую свободную порцию из chunk итераций. Освободившиеся нити получают новые порции итераций до тех
пор, пока все порции не будут исчерпаны. Последняя порция может
содержать меньше итераций, чем все остальные.
guided – динамическое распределение итераций, при котором размер
порции уменьшается с некоторого начального значения до величины
chunk (по умолчанию chunk=1) пропорционально количеству ещё не
распределённых итераций, делённому на количество нитей, выполняющих
цикл. Размер первоначально выделяемого блока зависит от реализации. В
ряде случаев такое распределение позволяет аккуратнее разделить работу
и сбалансировать загрузку нитей. Количество итераций в последней
порции может оказаться меньше значения chunk.
auto – способ распределения итераций выбирается компилятором
и/или системой выполнения. Параметр chunk при этом не задаётся.
runtime – способ распределения итераций выбирается во время
работы программы по значению переменной среды OMP_SCHEDULE.
Параметр chunk при этом не задаётся.
При распараллеливании цикла следует убедиться в том, что его
итерации не имеют зависимостей, и их можно выполнять в любом
63
порядке. Несоблюдение данного требования приведет к получению
некорректного результата [6,13].