Параллельное программирование с использованием OpenMP. Антонов (2009) (Параллельное программирование с использованием OpenMP. Антонов (2009).pdf), страница 11
Описание файла
PDF-файл из архива "Параллельное программирование с использованием OpenMP. Антонов (2009).pdf", который расположен в категории "". Всё это находится в предмете "суперкомпьютерное моделирование и технологии" из 11 семестр (3 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 11 страницы из PDF
Значение переменной может задаваться в виде size |sizeB | sizeK | sizeM | sizeG, где size – положительное целое число, абуквы B, K, M, G задают соответственно, байты, килобайты, мегабайты и гигабайты. Если ни одной из этих букв не указано, размер задаётся в килобайтах.Если задан неправильный формат или невозможно выделить запрошенныйразмер стека, результат будет зависеть от реализации.Например, в Linux в командной оболочке bash задать размер стека можно припомощи следующей команды:export OMP_STACKSIZE=2000K69Переменная среды OMP_WAIT_POLICY задаёт поведение ждущих процессов.Если задано значение ACTIVE, то ждущему процессу будут выделяться циклыпроцессорного времени, а при значении PASSIVE ждущий процесс можетбыть отправлен в спящий режим, при этом процессор может быть назначендругим процессам.Переменная среды OMP_THREAD_LIMIT задаёт максимальное число нитей, допустимых в программе.
Если значение переменной не является положительным целым числом или превышает максимально допустимое в системе числопроцессов, поведение программы будет зависеть от реализации. Значение переменнойможетбытьполученоприпомощипроцедурыomp_get_thread_limit().Си:int omp_get_thread_limit(void);Фортран:integer function omp_get_thread_limit()70Использование OpenMPЕсли целевая вычислительная платформа является многопроцессорной и/илимногоядерной, то для повышения быстродействия программы нужно задействовать все доступные пользователю вычислительные ядра.
Чаще всего разумно порождать по одной нити на вычислительное ядро, хотя это не является обязательным требованием. Например, для первоначальной отладки можетбыть вполне достаточно одноядерного процессора, на котором порождаетсянесколько нитей, работающих в режиме разделения времени. Порождение иуничтожение нитей в OpenMP являются относительно недорогими операциями, однако надо помнить, что многократное совершение этих действий(например, в цикле) может повлечь существенное увеличение времени работы программы.Для того чтобы получить параллельную версию, сначала необходимо определить ресурс параллелизма программы, то есть, найти в ней участки, которые могут выполняться независимо разными нитями.
Если таких участковотносительно немного, то для распараллеливания чаще всего используютсяконструкции, задающие конечный (неитеративный) параллелизм, например,параллельные секции, конструкция workshare или низкоуровневое распараллеливание по номеру нити.Однако, как показывает практика, наибольший ресурс параллелизма в программах сосредоточен в циклах. Поэтому наиболее распространенным способом распараллеливания является то или иное распределение итераций циклов. Если между итерациями некоторого цикла нет информационныхзависимостей, то их можно каким-либо способом раздать разным процессорам для одновременного исполнения.
Различные способы распределенияитераций позволяют добиваться максимально равномерной загрузки нитей,между которыми распределяются итерации цикла.Статический способ распределения итераций позволяет уже в момент написания программы точно определить, какой нити достанутся какие итерации.Однако он не учитывает текущей загруженности процессоров, соотношениявремён выполнения различных итераций и некоторых других факторов. Этифакторы в той или иной степени учитываются динамическими способамираспределения итераций. Кроме того, возможно отложить решение по способу распределения итераций на время выполнения программы (например, выбирать его, исходя из текущей загруженности нитей) или возложить выборраспределения на компилятор и/или систему выполнения.Обмен данными в OpenMP происходит через общие переменные.
Это приводит к необходимости разграничения одновременного доступа разных нитей кобщим данным. Для этого предусмотрены достаточно развитые средства71синхронизации. При этом нужно учитывать, что использование излишнихсинхронизаций может существенно замедлить программу.Использование идеи инкрементального распараллеливания позволяет припомощи OpenMP быстро получить параллельный вариант программы. Взявза основу последовательный код, пользователь шаг за шагом добавляет новые директивы, описывающие новые параллельные области.
Нет необходимости сразу распараллеливать всю программу, её создание ведется последовательно, что упрощает и процесс программирования, и отладку.Программа, созданная с использованием технологии OpenMP, может бытьиспользована и в качестве последовательной программы. Таким образом, нетнеобходимости поддерживать последовательную и параллельную версии.Директивы OpenMP просто игнорируются последовательным компилятором,а для вызова функций OpenMP могут быть подставлены специальные «заглушки» (stubs), текст которых приведен в описании стандарта. Они гарантируют корректную работу программы в последовательном случае – нужнотолько перекомпилировать программу и подключить другую библиотеку.Одним из достоинств OpenMP его разработчики считают поддержку так называемых оторванных (orphaned) директив.
Это предполагает, что директивы синхронизации и распределения работы могут не входить непосредственно в лексический контекст параллельной области. Например, можновставлять директивы в вызываемую подпрограмму, предполагая, что её вызов произойдёт из параллельной области.OpenMP может использоваться совместно с другими технологиями параллельного программирования, например, с MPI. Обычно в этом случае MPIиспользуется для распределения работы между несколькими вычислительными узлами, а OpenMP затем используется для распараллеливания на одномузле.72Примеры программПример 30 реализует простейшую программу вычисления числа Пи.
Дляраспараллеливания достаточно добавить в последовательную программу всего две строчки.#include <stdio.h>double f(double y) {return(4.0/(1.0+y*y));}int main(){double w, x, sum, pi;int i;int n = 1000000;w = 1.0/n;sum = 0.0;#pragma omp parallel for private(x) shared(w)\reduction(+:sum)for(i=0; i < n; i++){x = w*(i-0.5);sum = sum + f(x);}pi = w*sum;printf("pi = %f\n", pi);}Пример 30a. Вычисление числа Пи на языке Си.program compute_piparameter (n = 1000000)integer idouble precision w, x, sum, pi, f, yf(y) = 4.d0/(1.d0+y*y)w = 1.0d0/nsum = 0.0d0;!$omp parallel do private(x) shared(w)!$omp& reduction(+:sum)do i=1,nx = w*(i-0.5d0)sum = sum + f(x)end dopi = w*sumprint *, 'pi = ', piendПример 30b. Вычисление числа Пи на языке Фортран.73Пример 31 реализует простейшую программу, реализующую перемножениедвух квадратных матриц. В программе замеряется время на основной вычислительный блок, не включающий начальную инициализацию.
В основномвычислительном блоке программы на языке Фортран изменён порядок циклов с параметрами i и j для лучшего соответствия правилам размещения элементов массивов.#include <stdio.h>#include <omp.h>#define N 4096double a[N][N], b[N][N], c[N][N];int main(){int i, j, k;double t1, t2;// инициализация матрицfor (i=0; i<N; i++)for (j=0; j<N; j++)a[i][j]=b[i][j]=i*j;t1=omp_get_wtime();// основной вычислительный блок#pragma omp parallel for shared(a, b, c) private(i, j, k)for(i=0; i<N; i++){for(j=0; j<N; j++){c[i][j] = 0.0;for(k=0; k<N; k++) c[i][j]+=a[i][k]*b[k][j];}}t2=omp_get_wtime();printf("Time=%lf\n", t2-t1);}Пример 31a.
Перемножение матриц на языке Си.74program matrmultinclude "omp_lib.h"integer Nparameter(N=4096)common /arr/ a, b, cdouble precision a(N, N), b(N, N), c(N, N)integer i, j, kdouble precision t1, t2C инициализация матрицdo i=1, Ndo j=1, Na(i, j)=i*jb(i, j)=i*jend doend dot1=omp_get_wtime()C основной вычислительный блок!$omp parallel do shared(a, b, c) private(i, j, k)do j=1, Ndo i=1, Nc(i, j) = 0.0do k=1, Nc(i, j)=c(i, j)+a(i, k)*b(k, j)end doend doend dot2=omp_get_wtime()print *, "Time=", t2-t1endПример 31b.
Перемножение матриц на языке Фортран.В таблице 2 приведены времена выполнения примера 31 на узле суперкомпьютера СКИФ МГУ «ЧЕБЫШЁВ» [9]. Использовался компилятор Intel 11.0без дополнительных опций оптимизации, кроме –openmp.Количество1248нитейСи165.442016114.41322768.27114939.039399Фортран164.433444115.10083567.95378039.606582Таблица 2. Времена выполнения произведения матриц на узлесуперкомпьютера СКИФ МГУ «ЧЕБЫШЁВ».75Литература1. OpenMP Architecture Review Board (http://www.openmp.org/).2. The Community of OpenMP Users, Researchers, Tool Developers and Providers (http://www.compunity.org/).3. OpenMP Application Program Interface Version 3.0 May 2008(http://www.openmp.org/mp-documents/spec30.pdf).4.
Что такое OpenMP? (http://parallel.ru/tech/tech_dev/openmp.html).5. Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. СПб.:БХВ-Петербург, 2002. - 608 с.6. Barbara Chapman, Gabriele Jost, Ruud van der Pas. Using OpenMP: portable shared memory parallel programming (Scientific and EngineeringComputation). Cambridge, Massachusetts: The MIT Press., 2008. - 353 pp.7. Антонов А.С. Введение в параллельные вычисления. Методическоепособие.-М.: Изд-во Физического факультета МГУ, 2002. - 70 с.8. Антонов А.С. Параллельное программирование с использованием технологии MPI: Учебное пособие.
-М.: Изд-во МГУ, 2004. - 71 с.9. СуперкомпьютерныйкомплексМосковскогоуниверситета(http://parallel.ru/cluster/).76Учебное изданиеАнтонов Александр СергеевичПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕС ИСПОЛЬЗОВАНИЕМ ТЕХНОЛОГИИOpenMPПодписано в печать 18.03.2009. Формат 60х84/16.Бумага офсетная №1. Печать ризо. Усл. печ. л. 4,75.Уч.-изд. л. 5,0. Тираж 100 экз. Заказ № 1.Ордена «Знак Почета» издательство Московского университета.125009, Москва, ул.
Б. Никитская, 5/7.Участок оперативной печати НИВЦ МГУ.119992, ГСП-2, Москва, НИВЦ МГУ..