Лекция: Директивы распределения работы в OpenMP на примере распараллеливания циклов.

#pragma omp for [опции...]

Директива предшествует циклу for канонического типа:

for(init-expr; var logical_op b; incr_expr)

init_expr ::= var = expr

logical_op >, <, >=, <=

incr_expr ::= var ++, ++ var, var --, — var

var += incr, var -= incr,var = incr + var

var = var + incr, var = var – incr

var переменная целого типа

incr, lb, b инварианты цикла целого типа

#pragma omp parallel shared(a,b,c,nthreads,chunk) private(tid,i,j,k)

#pragma omp for schedule (static, chunk)

В OpenMP переменные в параллельных областях программы разделяются на два основных класса:

· SHARED (общие; под именем A все нити видят одну переменную) и

· PRIVATE (приватные; под именем A каждая нить видит свою переменную).

Отдельные правила определяют поведение переменных при входе и выходе из параллельной области или параллельного цикла: REDUCTION, FIRSTPRIVATE, LASTPRIVATE, COPYIN.

SHARED
Применяется к переменным, которые необходимо сделать общими.

PRIVATE
Применяется к переменным, которые необходимо сделать приватными. При входе в параллельную область для каждой нити создается отдельный экземпляр переменной, который не имеет никакой связи с оригинальной переменной вне параллельной области.

THREADPRIVATE
Применяется к COMMON-блокам, которые необходимо сделать приватными. Директива должна применяться после каждой декларации COMMON-блока.

FIRSTPRIVATE
Приватные копии переменной при входе в параллельную область инициализируются значением оригинальной переменной.

LASTPRIVATE
По окончании параллельно цикла или блока параллельных секций, нить, которая выполнила последнюю итерацию цикла или последнюю секцию блока, обновляет значение оригинальной переменной.

REDUCTION(+:A)
Обозначает переменную, с которой в цикле производится reduction-операция (например, суммирование). При выходе из цикла, данная операция производится над копиями переменной во всех нитях, и результат присваивается оригинальной переменной.

COPYIN
Применяется к COMMON-блокам, которые помечены как THREADPRIVATE. При входе в параллельную область приватные копии этих данных инициализируются оригинальными значениями.

Static – блочно-циклическое распределение итераций цикла; размер блока – chunk. Первый блок из chunk итераций выполняет нулевая нить, второй блок – следующая и т.д. до последней нити, затем распределение снова начинается с нулевой нити. Если значение chunk не указано, то всё множество итераций делится на непрерывные куски примерно одинакового размера (конкретный способ зависит от реализации), и полученные порции итераций распределяются между нитями.

 

еще рефераты
Еще работы по информатике