Лекция: Устранение информационных зависимостей в циклах средствами OpenMP, директива reduction.
Информационные зависимости. Зависимости по данным (a=1;b=a). Зависимости по управлению (if(a){ x=c+d; y=1;}). Информационные зависимости в цикле:
for(j = 0; j < n; j ++) { a[j] = a[j – 1] + a[j – 2]; }
Опция reduction определяет что на выходе из параллельного блока переменная получит комбинированное значение. Пример:
#pragma omp for reduction(+: x)
Допустимы следующие операции: +, *, -, &, |, ^, &&, ||
Опция reduction определяет значение переменных, входящих в список ее аргументов, на главном потоке после завершения параллельного участка как результат выполнения редуктивной операции. На каждом из потоков, выполняющих параллельный участок, переменная инициализируется значением, соответствующим редуктивной операции .
Пусть параллельный участок выполнялся n потоками, и до него переменная имела значение v. Если в конце выполнения параллельного участка локальные копии переменной a имели значения v1, …, vn, то после параллельного участка переменная a на главном потоке получит значение, равное ( v x v1 x v2 x … x vn ). Инициализация для reduction:
Операция Значение
+ 0
* 1
— 0
& 0
| 0
^ 0
&& 1
|| 0
#pragma omp parallel for reduction(+:s)
for(i = 0; i < n; i ++){
s += g(a + i * h + 0.5 * h);
}
Итого: OpenMP – удобное средство разработки программ для общей памяти. Основные достоинства:
Высокая скорость разработки параллельных програм, Стандартизованный интерфейс, поддерживаемый ведущими разработчиками трансляторов.
Недостатки: Только для общей памяти (среда cluster OpenMP не получила распространения)
Отсутствует низкоуровневый контроль за создаваемыми потоками