Автор работы: Пользователь скрыл имя, 26 Декабря 2011 в 20:22, реферат
OpenMP (Open Multi-Processing) - это набор директив компилятора, библиотечных процедур и переменных окружения, которые предназначены для программирования многопоточных приложений на многопроцессорных системах с общей памятью (SMP-системах).
Первый стандарт OpenMP был разработан в 1997 г. как API, ориентированный на написание легко переносимых многопоточных приложений. Сначала он был основан на языке Fortran, но позднее включил в себя и языки Си и Си++.
Такая переменная не может быть общей, т.к. у каждой нити она должна принимать свое значение. Многие компиляторы просто игнорируют указания сделать общей управляющую переменную цикла.
Итогом этой ошибки будет не разделение цикла между нитями, а каждая нить будет выполнять его целиком, что может привести к ошибке общей переменной.
В OpenMP можно изменять число нитей, на которые программа будет поделена, только в последовательном участке программы.
Замок может быть снят только нитью, установившей его.
Изменение управляющей переменной может привести к непредсказуемым результатам, т.к. будет нарушено распределение итераций цикла между нитями.
Из перечисленных ошибок наиболее частыми и трудно отслеживаемыми являются ошибки 1 и 4. Но поскольку отличить их друг от друга во время выполнения программы в большинстве случаев невозможно, то следует их объединить в одну группу. Назовем ее ошибками общей переменной.
Приведенный список ошибок не является полным и поэтому следует сказать еще о паре ошибок, которые могут возникнуть в OpenMP-программе:
Отладка
параллельных программ
Процесс отладки параллельных программ можно условно поделить на традиционную и автоматическую.
В
традиционном подходе отлаживаемая
программа запускается под
Одним
из видов автоматической отладки является
динамический контроль корректности.
Автоматическая отладка позволяет только
определить корректность самой программы,
а не правильность работы реализованного
в ней алгоритма. Т.е. автоматически будут
найдены участки кода, которые создают
ситуации несоответствующие стандарту
языка или используемой технологии. Работа
динамического контроля корректности
заключается в слежении за состоянием
отлаживаемой программы во время ее выполнения
и обнаружении некорректных ситуаций.
С
чего начать
Параллелизовать программу можно несколькими способами. Во-первых, следует определить, нужна ли параллелизация. Некоторые алгоритмы не годятся для параллелизации. Если создается новый проект, можно выбрать алгоритм, который может быть параллелизован. До начала попыток параллелизации очень важно убедиться, что код выполняется правильно в последовательном режиме. Определите временные характеристики при последовательном выполении, по которым можно будет принять решение о целесообразности параллелизации.
Скомпилируйте последовательную версию в нескольких режимах оптимизации. Вообще говоря, компилятор может выполнить гораздо более серьезную оптимизацию, чем сам программист.
Когда
программа готова для параллелизации,
можно применить ряд функций
и средств Sun Studio, которые помогут достигнуть
цели. Они кратко описаны ниже.
Автоматическая
параллелизация
Можно попробовать применить ключ автоматической параллелизации компилятора (-xautopar). Доверив параллелизацию компилятору, программист может параллелизовать программу без каких-либо усилий со своей стороны. Кроме того, автоматический параллелизатор может помочь определить фрагменты кода, которые можно параллелизовать с помощью прагм OpenMP, и особенности, которые могут помешать параллелизации (например, зависимости между повторениями тела цикла). Комментарии компилятора можно просмотреть, скомпилировав программу с ключом -g и использовав служебную программу er_src(1) из состава Sun Studio, например, следующим образом:
% cc -g -xautopar -c source.c
%
er_src source.o
Автоопределение
области действия
Одним
из наиболее распространенных типов
ошибок в программировании с использованием
OpenMP являются ошибки в определении
области действия, когда область
действия переменной указывается неверно,
например, переменная определяется как
общая (частная), в то время как ее нужно
определить как частную (общую). Функция
автоопределения области действия в компиляторах
Sun Studio освобождает программиста от задачи
определения областей действия переменных.
Поддерживаются два расширения OpenMP: оператор __auto и
оператор default(__auto). Подробности приведены
в Руководстве пользователя по OpenMP.
Отладчик
dbx
Отладчик
Sun Studio, dbx, поддерживает работу с потоками
и может использоваться для отладки
программы, использующей OpenMP. Для отладки
программы, использующей OpenMP, следует,
во-первых, скомпилировать программу без
какой-либо оптимизации, использовав ключи
компилятора -xopenmp=noopt -g, затем запустить
dbx для отладки полученного исполнимого
модуля. С помощью dbx можно устанавливать
точки останова внутри области параллельности
и выполнять код в области параллельности
в пошаговом режиме, проверять переменные,
являющиеся частными для потока, и так
далее.
Анализатор
производительности
Анализатор
производительности Sun Studio можно использовать
для определения узких мест в программе.
Это средство можно использовать для определения
критических областей в программе, занимающих
большую часть времени. Кроме того, это
средство предоставляет возможности измерения
времени работы и ожидания для функций,
строк исходного кода и машинных инструкций,
что может помочь в определении узких
мест в программе, использующей OpenMP.
Положительные
стороны
Ключевые
элементы
Ключевыми
элементами OpenMP являются:
Примеры
программ
Ниже
приведены примеры программ с
использованием директив OpenMP:
1. Fortran
В
этой программе на языке Fortran создается заранее неизвестное
число потоков (оно определяется переменной
окружения OMP_NUM_THREADS
PROGRAM HELLO
INTEGER ID, NTHRDS
INTEGER OMP_GET_THREAD_NUM, OMP_GET_NUM_THREADS
C$OMP PARALLEL PRIVATE(ID)
ID = OMP_GET_THREAD_NUM()
PRINT *, 'HELLO WORLD FROM THREAD', ID
C$OMP BARRIER
IF ( ID .EQ. 0 ) THEN
NTHRDS = OMP_GET_NUM_THREADS()
PRINT *, 'THERE ARE', NTHRDS, 'THREADS'
END IF
C$OMP END PARALLEL
END
2. Си
В этой программе два массива (a и b) складываются параллельно десятью потоками.
#include <stdio.h>
#include <omp.h>
#define N 100
int main(int argc, char *argv[])
{
float a[N], b[N], c[N];
int i;
omp_set_dynamic(0); // запретить библиотеке openmp менять число потоков во время исполнения
omp_set_num_threads(10); // установить число потоков в 10
// инициализируем массивы
for (i = 0; i < N; i++)
{
a[i] = i * 1.0;
b[i] = i * 2.0;
}
// вычисляем сумму массивов
#pragma omp parallel shared(a, b, c) private(i)
{
#pragma omp for
for (i = 0; i < N; i++)
c[i] = a[i] + b[i];
}
printf ("%f\n", c[10]);
return 0;
}
Существующие
реализации
OpenMP
поддерживается многими