Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
#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 не указано, то всё множество итераций делится на непрерывные куски примерно одинакового размера (конкретный способ зависит от реализации), и полученные порции итераций распределяются между нитями.
Дата публикования: 2015-01-13; Прочитано: 333 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!