поддерживаю выше заданые вопросы
|
Введение в технологии параллельного программирования (OpenMP)
4.8. Дополнительные сведения
Итак, возможности технологии OpenMP рассмотрены практически полностью. В данном разделе дополнительно рассматриваются правила разработки параллельных программ с использованием OpenMP на алгоритмическом языке Fortran, описывается возможность компиляции программы как обычного последовательного программного кода и приводится краткий перечень компиляторов, обеспечивающих поддержку OpenMP
4.8.1. Разработка параллельных программ с использованием OpenMP на языке Fortran
Между разработкой параллельных программ с использованием OpenMP на алгоритмическом языке С и алгоритмических языках семейства Fortran (Fortran 77, Fortran 90 и Fortran 95) существует не так много различий.
Прежде всего формат директив OpenMP на языке Fortran имеет следующий вид:
<маркер> <имя_директивы> [<параметр>...]
Вид маркера зависит от формата записи программы:
- При фиксированном формате записи маркер имеет вид
Маркер должен начинаться с позиции 1 строки. При этом сама директива может быть записана в несколько строк; первая строка директивы должна содержать в позиции 6 или пробел или 0; строки продолжения директивы в позиции 6 должны быть отмечены любым произвольным символом, отличающимся от пробела и 0.
!$omp или c$omp или *$omp
- При свободном формате записи маркер должен иметь вид !$omp. Маркер может быть записан, начиная с произвольной позиции строки, при этом маркеру должны предшествовать только пробелы или знаки табуляции. При размещении директивы на нескольких строках первая строка должна заканчиваться символом &, строки продолжения могут начинаться с этого знака, но приводить его в строках продолжения не обязательно.
В качестве основных отличий параллельных программ с использованием OpenMP на языке Fortran отметим следующее:
- Практически все директивы сопровождаются соответствующей директивой завершения; к директивам завершения относятся:
end critical end do end master end ordered end parallel end sections end single end workshare
- В стандарте OpenMP для языка Fortran предусматривается дополнительная директива workshare, которая является близкой по своему назначению директиве sections.
- Часть подпрограмм библиотеки OpenMP являются процедурами и тем самым должны вызываться при помощи оператора вызова процедур CALL.
В качестве принятых соглашений при разработке программ на языке Fortran рекомендуется записывать имена подпрограмм с использованием прописных символов.
В качестве примера приведем вариант программы из примера 5.6 на языке Fortran.
PROGRAM Example INCLUDE "omp_lib.h" INTEGER NMAX 1000 INTEGER LIMIT 100 INTEGER I, J, SUM REAL A(NMAX,NMAX) <инициализация данных> !$OMP PARALLEL DO SHARED(A) PRIVATE(I,J,SUM) & IF (NMAX>LIMIT) DO I = 1, NMAX SUM = 0 DO J = 1, NMAX SUM = SUM + A(I,J) ENDDO PRINT * "Сумма строки ", I, "равна ", SUM ENDDO !$OMP END PARALLEL DO ! Завершение фрагмента STOP END4.13. Пример параллельной программы с использованием OpenMP на языке Fortran
4.8.2. Сохранение возможности последовательного выполнения программы
При разработке параллельной программы с использованием OpenMP в общем случае целесообразно сохранить возможность компиляции программы как обычного последовательного кода (обычно говорят о единственности программного кода для последовательного и параллельного вариантов программ). При соблюдении такого подхода значительно снижаются затраты на сопровождение и развитие программ – так, например, при необходимости изменений в общей части алгоритмов последовательных и параллельных вычислений не требуется проводить корректировку программного кода в разных вариантах программ. Указанный подход полезен и при использовании компиляторов, которые все еще не поддерживают технологию OpenMP. И, наконец, последовательный вариант программы часто необходим для проведения вычислительных экспериментов при определении получаемого ускорения параллельных вычислений.
Поддержка единственности программного кода относится к числу важных положительных качеств технологии OpenMP – формат директив был специально подобран таким образом, чтобы "обычные" компиляторы без поддержки OpenMP воспринимали директивы как комментарии.
Однако проблемы поддержки единственности программного кода возникают при использовании в параллельной программе функций и переменных окружения OpenMP в явном виде. Данные проблемы могут быть решены с помощью директив условной компиляции – средств препроцессирования. Стандартом OpenMP предусматривается, что компиляторы с поддержкой технологии OpenMP должны определять макропеременную _OPENMP, значением которой является дата поддерживаемого стандарта в формате ГГГГММ (год, месяц). Как результат, для обеспечения единственности программного кода последовательного и параллельного вариантов программ, все OpenMP-зависимые расширения параллельного варианта программы следует окружать директивами условной компиляции в виде:
#ifdef _OPENMP <OpenMP-зависимый программный код> #endif
Последовательный вариант программы может порождаться и компиляторами с поддержкой OpenMP – для обеспечения такой возможности в составе OpenMP имеются функции-заглушки для всех функций библиотеки OpenMP. Указание подобного режима компиляции осуществляется при помощи соответствующих параметров компилятора.
4.8.3. Краткий перечень компиляторов с поддержкой OpenMP
Среди компиляторов с поддержкой OpenMP прежде всего следует отметить компиляторы компании Intel для языков Fortran и C/C++ для операционных систем семейств Unix и Windows. В табл. 1 приведены параметры этих компиляторов для управления возможностями OpenMP.
Следует также помнить, что при сборке программы следует использовать библиотеки, обеспечивающие поддержки многопоточности.
Среди других компиляторов можно отметить:
- Fujitsu/Lahey Fortran, C and C++,
- HP Fortran, C and C++,
- IBM Fortran and C,
- Silicon Graphics. Fortran 77/90 (IRIX), C/C++,
- Portland Group (PGI). Fortran и C/C++ для Windows NT, Linux, Solaris (x86).
Параметр | Описание | |
---|---|---|
Windows | Linux | |
-Qopenmp | -openmp | Компиляция программного кода с использованием OpenMP |
-Qopenmp-profile | -openmp-profile | Компиляция с инструментацией программного кода с использованием OpenMP для обеспечения возможности применения Intel VTune Performance Analyzer для профилирования программы |
-Qopenmp-stubs | -openmp-stubs | Компиляция программного кода как обычной последовательной программы (с игнорированием директив и использованием функций-заглушек для функций OpenMP) |
Полный перечень компиляторов, поддерживающих OpenMP представлен на портале www.openmp.org.