Обзор технологий параллельного программирования презентация

Содержание

Языки программирования Содержание Критерии выбора технологии параллельного программирования Классификация и обзор технологий параллельного программирования ©М.Л. Цымблер

Слайд 1Обзор технологий параллельного программирования
ФПК "Параллельные вычислительные технологии"
Любая достаточно ушедшая вперед технология неотличима

от чуда.

А. Кларк

Лекция 11-13

Дейкова Татьяна Васильевна


Слайд 2Языки программирования
Содержание
Критерии выбора технологии параллельного программирования
Классификация и обзор технологий параллельного программирования
©М.Л.

Цымблер

Слайд 3Технологии параллельного программирования
©М.Л. Цымблер
Языки программирования


Слайд 4Языки программирования
Критерии выбора технологии
Эффективность создаваемых программ
Технологии, дающие неэффективные программы, не нужны!
Быстрота

создания программ
Простота освоения технологии специалистами других предметных областей
Сохранение эффективности программ
Гарантия сохранения эффективности программ при их переносе на другую аппаратно-программную платформу

©М.Л. Цымблер


Слайд 5Языки программирования
Классификация технологий
Распараллеливающие компиляторы
Параллельные языки программирования
Параллельные расширения последовательных языков программирования
Высокоуровневые коммуникационные

библиотеки
Параллельные библиотеки
Инструментальные системы разработки параллельных программ
Специализированные прикладные пакеты

©М.Л. Цымблер


Слайд 6Распараллеливающие компиляторы
©М.Л. Цымблер
Языки программирования




Слайд 7Языки программирования
Распараллеливающие компиляторы
for (i=1; i

i++) {
for (j=1; j<=n-i; j++)
A[i+j]=A(2*n-i-j+1)*q+p;
for (j=n-i+1; j<=n; j++)
A[i+j]=A(2*n-i-j+1)*q+p;
}


©М.Л. Цымблер


Слайд 8Языки программирования
Распараллеливающие компиляторы
?
©М.Л. Цымблер
for (i=1; i

i++)
A[i]=UserFunc(A, B[i]);



Слайд 9Языки программирования
Классификация технологий
Распараллеливающие компиляторы
Параллельные языки программирования
Параллельные расширения последовательных языков программирования
Высокоуровневые коммуникационные

библиотеки
Параллельные библиотеки
Инструментальные системы разработки параллельных программ
Специализированные прикладные пакеты

©М.Л. Цымблер


Слайд 10Параллельные языки
©М.Л. Цымблер
Языки программирования




Слайд 11Языки программирования
Параллельные языки
Параллельные языки
НОРМА, ABCL, Adl, Ada, Concurrent Clean, MC#, Erlang,

Linda, Modula-3, NESL, Occam, Orca, Parallaxis, Phantom, Sisal, SR, ZPL и др.

©М.Л. Цымблер


Слайд 12Язык и модель Linda
Языки программирования
Разработаны в 1980 гг. в Йельском университете

(США).
Параллельная программа – множество параллельных процессов, каждый из которых работает как последовательная программа.
Процессы имеют доступ к общей памяти – пространству кортежей.
Кортеж – упорядоченная последовательность значений.
Процессы взаимодействуют друг с другом неявно, через пространство кортежей с помощью операций "поместить", "забрать", "скопировать" кортеж.
Программа считается завершенной, если все процессы завершились или заблокированы.





("Hi", 12, 3.14)

(5, TRUE, "Wow", 1)

(5, TRUE, "Wow", 1)

©М.Л. Цымблер


Слайд 13Функции Linda
Языки программирования
OUT()
Поместить кортеж в пространство кортежей.
Если такой кортеж уже имеется,

то создается дубликат.
Вызывающий процесс не блокируется.
Примеры
out("myTuple", 1);
out(FALSE, 3.14, );

©М.Л. Цымблер


Слайд 14Функции Linda
Языки программирования
IN()
Получить указанный кортеж и удалить его из пространства кортежей.
Если

параметру соответствует несколько кортежей, то случайным образом выбирается один из них.
Вызывающий процесс блокируется, пока соответствующий кортеж не появится в пространстве кортежей.
Примеры
in("myTuple", 1);
int i,j; in("myTuple",1,formal i,?j);

©М.Л. Цымблер


Слайд 15Функции Linda
Языки программирования
READ()
Получить указанный кортеж из пространства кортежей (не удаляя его).
Если

параметру соответствует несколько кортежей, то случайным образом выбирается один из них.
Вызывающий процесс блокируется, пока соответствующий кортеж не появится в пространстве кортежей.
Примеры
int i; float j; char * s; read(?s, formal i, ?j);

©М.Л. Цымблер


Слайд 16Функции Linda
Языки программирования
EVAL()
Поместить кортеж в пространство кортежей.
Если такой кортеж уже имеется,

то создается дубликат.
Вызывающий процесс не блокируется.
Для вычисления поля кортежа, которое содержит обращение к какой-либо функции, порождается параллельный процесс.
Функция не ожидает завершения порожденного процесса.
Поля кортежа вычисляются в произвольном порядке.
Примеры
eval("myTuple",myFunc1(a,b,c),TRUE,myFunc1(i,j,k));

©М.Л. Цымблер


Слайд 17Примеры программ на языке Linda
Языки программирования
Получение номера собственного процесса и общего

количества процессов
out("Next", 1);
in("Next", ?myNumber); out("Next", myNumber+1);
read("Next", ?numProcesses);

©М.Л. Цымблер


Слайд 18Примеры программ на языке Linda
Языки программирования
Барьерная синхронизация процессов
out("I want barrier", numProcesses);
in("I

want barrier", ?Barrier); Barrier--; if (Barrier!=0) { out("I want barrier", Barrier); read("Barrier"); } else out("Barrier");

©М.Л. Цымблер


Слайд 19Примеры программ на языке Linda
Языки программирования
Параллельные процессы, работающие по схеме "мастер-рабочие"
int

i, workers; void main(int argc, char * argv[]) { workers=atoi(argv[1]); for (i=0; ivoid Worker(int i) { /* Работа */ out("Завершение работы"); }

©М.Л. Цымблер


Слайд 20Языки программирования
Классификация технологий
Распараллеливающие компиляторы
Параллельные языки программирования
Параллельные расширения последовательных языков программирования
Высокоуровневые коммуникационные

библиотеки
Параллельные библиотеки
Инструментальные системы разработки параллельных программ
Специализированные прикладные пакеты

©М.Л. Цымблер


Слайд 21Языки программирования
Параллельные расширения
Дополнение последовательного языка программирования параллельными операторами или директивами компилятора
Параллельные

расширения и диалекты языка Fortran
Fortran-DVM, Cray MPP Fortran, F--, Fortran 90/95, Fortran D95, Fortran M, Fx, HPF, Opus, Vienna Fortran и др.
Параллельные расширения и диалекты языков C/C++
C-DVM, A++/P++, CC++, Charm/Charm++, Cilk, HPC, HPC++, C/OpenMP Maisie, Mentat, mpC, MPC++, Parsec, pC++, sC++, uC++ и др.

©М.Л. Цымблер


Слайд 22Язык High Performance FORTRAN
Языки программирования
HPF – расширение языка FORTRAN, которые дают

компилятору информацию для оптимизации выполнения программы на многопроцессорном (многоядерном) компьютере.
Примеры директив
!HPF$ PROCESSORS (n)
Определение количества процессоров, которые могут использоваться программой.
!HPF$ DISTRIBUTE (BLOCK) ONTO procs :: переменные
Блочное распределение данных массива список переменных по процессорам (распределение равными блоками).
ALIGN переменные1(i) WITH переменные2(i+1)
Установка связи между распределением двух массивов. Для всех значений переменной i элемент массива список переменных1(i) должен быть размещен в памяти того же процессора, что и элемент массива список переменных2(i).
FORALL (i=1:1000) переменные1(i)=переменныхе(i)
Определение набора операторов, которые могут выполняться параллельно.

©М.Л. Цымблер


Слайд 23Параллельное расширение C/OpenMP
Языки программирования
©М.Л. Цымблер


Слайд 24Параллельное расширение C/OpenMP
Языки программирования
©М.Л. Цымблер
F1
i=1
i=2
F3
i=5
i=6
F2
i=3
i=4


Слайд 25Языки программирования
Классификация технологий
Распараллеливающие компиляторы
Параллельные языки программирования
Параллельные расширения последовательных языков программирования
Высокоуровневые коммуникационные

библиотеки
Параллельные библиотеки
Инструментальные системы разработки параллельных программ
Специализированные прикладные пакеты

©М.Л. Цымблер


Слайд 26Языки программирования
Интерфейсы параллельного программирования
Программирование на стандартных и широко распространенных языках программирования

с использованием высокоуровневых коммуникационных библиотек и интерфейсов (API) для организации межпроцессного взаимодействия.
Коммуникационные библиотеки и интерфейсы
ACE, ARCH, BIP, BLACS, BSPlib, CVM, Counterpoint, FM, Gala, GA, HPVM, ICC, JIAJIA, KELP, LPARX, MPI, MPL, OOMPI, OpenMP, POSIX Threads, P4, Para++, Phosphorus, PVM, Quarks, ROMIO, ShMem, SVMlib, TOOPS, Windows Threads

©М.Л. Цымблер


Слайд 27MPI-программа
©М.Л. Цымблер
Языки программирования
#include "mpi.h" // Подключение

библиотеки

int main (int argc, char *argv[])
{
// Здесь код без использования MPI функций

MPI_Init(&argc, &argv); // Инициализация выполнения

// Здесь код, реализующий обмены

MPI_Finalize(); // Завершение

// Здесь код без использования MPI функций

return 0;
}

Слайд 28Пример MPI-программы
©М.Л. Цымблер
Языки программирования
#include "mpi.h"
#include
int

main(int argc, char *argv[])
{
int numtasks, rank, dest, src, rc, tag=777;
char inmsg, outmsg='x';
MPI_Status Stat;

MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank == 0) {
dest = 1; src = 1;
rc = MPI_Send(&outmsg, 1, MPI_CHAR, dest, tag, MPI_COMM_WORLD);
rc = MPI_Recv(&inmsg, 1, MPI_CHAR, src, tag, MPI_COMM_WORLD, &Stat);
} else
if (rank == 1) {
dest = 0; src = 0;
rc = MPI_Recv(&inmsg, 1, MPI_CHAR, src, tag, MPI_COMM_WORLD, &Stat);
rc = MPI_Send(&outmsg, 1, MPI_CHAR, dest, tag, MPI_COMM_WORLD);
}
MPI_Finalize();
}

0

1


Слайд 29Пример программы с POSIX Threads
©М.Л. Цымблер
Языки программирования
#include


#include
#define NUM_THREADS 4

void *hello (void *arg) {
printf(“Hello Thread\n”);
}

main() {
pthread_t tid[NUM_THREADS];
for (int i=0; i pthread_create(&tid[i], NULL, hello, NULL);

for (int i=0; i pthread_join(tid[i], NULL);
}

Слайд 30Языки программирования
Классификация технологий
Распараллеливающие компиляторы
Параллельные языки программирования
Параллельные расширения последовательных языков программирования
Высокоуровневые коммуникационные

библиотеки
Параллельные библиотеки
Инструментальные системы разработки параллельных программ
Специализированные прикладные пакеты

©М.Л. Цымблер


Слайд 31Языки программирования
Специализированные параллельные библиотеки
Библиотеки заранее распараллеленных процедур для решения различных научно-технических

задач (линейная алгебра, сеточные методы, методы Монте-Карло, генетические алгоритмы, рендеринг изображений, …)
ATLAS, Aztec, BlockSolve95, Distributed Parallelization at CWP, DOUG, GALOPPS, JOSTLE, NAMD, P-Sparslib, PIM, ParMETIS, PARPACK, PBLAS, PETSc, PGAPack, PLAPACK, ScaLAPACK, SPRNG и др.

©М.Л. Цымблер


Слайд 32Параллельная библиотека Intel MKL
©М.Л. Цымблер
Языки программирования
for

(i=0; i for (j=0; j for (k=0; k C[i][j]+=A[i][k]*B[k][j];
}
}

for (i=0; i for (j=0; j C[i][j]=cblas_ddot(N, &A[i], incx, &B[0][j], incy);
}



Слайд 33Языки программирования
Классификация технологий
Распараллеливающие компиляторы
Параллельные языки программирования
Параллельные расширения последовательных языков программирования
Высокоуровневые коммуникационные

библиотеки
Параллельные библиотеки
Инструментальные системы разработки параллельных программ
Специализированные прикладные пакеты

©М.Л. Цымблер


Слайд 34Языки программирования
Инструментальные системы разработки
Интегрированные среды прототипирования, разработки и отладки параллельных программ
CODE,

Converse, DEEP, EDPEPPS, GRADE, HeNCE, Reactor, TRAPPER и др.
Средства распознавания параллелизма в алгоритмах, средства автоматического и полуавтоматического распараллеливания последовательных программ
BERT 77, FORGE, KAP, PIPS, VAST, V-Ray и др.


©М.Л. Цымблер


Слайд 35Языки программирования
Инструментальная система CODE
Параллельная программа = граф
вершины –последовательные участки
дуги – пересылки

данных.
Последовательные участки могут быть написаны на любом языке, для пересылок используется MPI.

©М.Л. Цымблер


Слайд 36Языки программирования
Пакет V-Ray
V-Ray – комплекс инструментальных средств, направленных на автоматизацию создания

и оптимизацию параллельных Fortran-программ для современных суперкомпьютерных систем. Разработка НИВЦ МГУ.
Основные возможности:
Макроанализ – граф вызовов (порядок вызова процедур проекта), граф вложенности циклов в процедурах, граф использования общей памяти и др.
Микроанализ – иерархический граф управления, определение параллельных циклов, и др.

©М.Л. Цымблер


Слайд 37Языки программирования
V-Ray: граф использования общей памяти

©М.Л. Цымблер



Слайд 38Языки программирования
Классификация технологий
Распараллеливающие компиляторы
Параллельные языки программирования
Параллельные расширения последовательных языков программирования
Высокоуровневые коммуникационные

библиотеки
Параллельные библиотеки
Инструментальные системы разработки параллельных программ
Специализированные прикладные пакеты

©М.Л. Цымблер


Слайд 39Языки программирования
Специализированные прикладные пакеты
Специализированные прикладные пакеты, работающие на параллельных вычислительных платформах
Задачи

инженерного анализа, прочности, теплофизики, деформации, упругости, пластичности, электромагнетизма
ANSYS, MSC.NASTRAN, ABAQUS, LS-DYNA
Задачи аэро- и гидродинамики, механики жидкостей и газов, горения и детонации
CFX, FLUENT, STAR-CD, FLOWVISION, FLOW-3D, GDT
Задачи акустического анализа
LMS Virtual Lab. Acoustic, COMET/Acoustics

©М.Л. Цымблер


Слайд 40Языки программирования
Пакеты ANSYS и CFX: расчет напряжения трубы
Создание геометрии модели (ANSYS)
Создание

сетки (ANSYS)

Настройка тепловых напряжений (ANSYS)

Расчет тепловых нагрузок (CFX)

Расчет напряжения от температуры (ANSYS)

©М.Л. Цымблер


Слайд 41Параллельное программирование в стандарте OpenMP
ФПК "Параллельные вычислительные технологии"
Общая сумма разума на

планете есть величина постоянная, несмотря на постоянный прирост населения.

А. Блох

Слайд 42Параллельные вычисления
Лекция 11-13
Дейкова Татьяна Васильевна
2012
Параллельное программирование
с использованием OpenMP


Слайд 43Москва, 2009 г.
из 26
Технология Intel Cluster OpenMP
В 2006 году в

Intel® компиляторах версии 9.1 появилась поддержка Cluster OpenMP.
Технология Cluster OpenMP поддерживает выполнение OpenMP программ на нескольких вычислительных узлах, объединенных сетью.
Базируется на программной реализации DSM (Thread Marks software by Rice University).
Для компилятора Intel® C++:
icc -cluster-openmp options source-file
icc -cluster-openmp-profile options source-file
Для компилятора Intel® Fortran:
ifort -cluster-openmp options source-file
ifort -cluster-openmp-profile options source-file

kmp_cluster.ini
--hostlist=home,remote --process_threads=2

Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.


Слайд 44Москва, 2009 г.
из 26
Преимущества Intel Cluster OpenMP
Упрощает распределение последовательного или

OpenMP кода по узлам.
Позволяет использовать одну и ту же программу для последовательных, многоядерных и кластерных систем.
Требует совсем незначительного изменения кода программы, что упрощает отладку.
Позволяет слегка измененной OpenMP-программе выполняться на большем числе процессоров без вложений в аппаратную составляющую SMP.
Представляет собой альтернативу MPI, которая может быть быстрее освоена и применена.

Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.


Слайд 45Москва, 2009 г.
из 26
Преимущества Intel Cluster OpenMP
Переносимость и гибкость упрощает

и снижает стоимость разработки приложений.

Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.


Слайд 46
001
Модель памяти в OpenMP
Москва, 2009 г.
из 26




Нить

Кэш общих переменных
Общая память
Private-переменные

Threadprivate-переменные

001
Нить
Кэш

общих переменных

Private-переменные


Threadprivate-переменные


001

Нить

Кэш общих переменных

Private-переменные


Threadprivate-переменные

Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.


Слайд 48Консистентность памяти в OpenMP
Москва, 2009 г.
из 26


Корректная последовательность работы нитей

с переменной:
Нить0 записывает значение переменной - write(var)
Нить0 выполняет операцию синхронизации – flush (var)
Нить1 выполняет операцию синхронизации – flush (var)
Нить1 читает значение переменной – read (var)

1: A = 1
. . .
2: flush(A)

Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.


Слайд 49Директива SHARABLE
Москва, 2009 г.
из 26


#pragma intel omp sharable ( variable

[, variable …] ) – для Си и Си++
!dir$ omp sharable ( variable [, variable …] ) - для Фортрана
определяют переменные, которые должны быть помещены в Distributed Virtual Shared Memory

В компиляторе существуют опции, которые позволяют изменить класс переменных, не изменяя текст программы:
[-no]-clomp-sharable-argexprs
[-no]-clomp-sharable-commons
[-no]-clomp-sharable-localsaves
[-no]-clomp-sharable-modvars


Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.


Слайд 50Москва, 2009 г.
из 26
Использование Intel Cluster OpenMP
malloc (…) -> kmp_sharable_malloc

(…)

#include

foo * fp = new foo (10);
foo * fp = new kmp_sharable foo (10);

std::vector * vp = new std::vector;
std::vector > * vp = new kmp_sharable std::vector>;


Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.


Слайд 51Работа с SHARABLE- переменными
Москва, 2009 г.
из 26



Параллельное программирование с OpenMP:

Использование OpenMP на кластере © Бахтин В.А.

Слайд 52Москва, 2009 г.
из 26
Использование Intel Cluster OpenMP
Целесообразно:
если программа дает хорошее

ускорение при использовании технологии OpenMP:
Speedup = Time(1thread)/Time (n threads) = ~n
еcли программа требует малой синхронизации
данные в программе хорошо локализованы
Наиболее целесообразно для задач (RMS - recognition, mining, and synthesis):
Обработка больших массивов данных
Рендеринг в графике
Поиск
Распознавание образов
Выделение последовательностей в генетике

Параллельное программирование с OpenMP: Использование OpenMP на кластере © Бахтин В.А.


Слайд 53Москва, 2009 г.
из 26
Использование Intel Cluster OpenMP
Параллельное программирование с OpenMP:

Использование OpenMP на кластере © Бахтин В.А.

Слайд 54Москва, 2009 г.
из 26
Гибридная модель параллельного программирования MPI/OpenMP


Данные



Данные

Вычисления

Узел N
OpenMP


Вычисления
MPI
Параллельное программирование

с OpenMP: Использование OpenMP на кластере © Бахтин В.А.

Слайд 55Содержание
ФПК "Параллельные вычислительные технологии"
Модель программирования в общей памяти
Модель "пульсирующего" параллелизма FORK-JOIN


Стандарт OpenMP
Основные понятия и функции OpenMP

© М.Л. Цымблер


Слайд 56Программирование в общей памяти
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Параллельное приложение состоит

из нескольких нитей, выполняющихся одновременно.
Нити разделяют общую память.
Обмены между нитями осуществляются посредством чтения/записи данных в общей памяти.
Нити выполняются на различных ядрах одного процессора.






Нить 0

Нить 1

Нить N-1

Данные


Слайд 57Модель FORK-JOIN
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Программа – полновесный процесс.
Процесс

может запускать легковесные процессы (нити), выполняющиеся в фоновом режиме.
Процесс приложения – главная нить.
Нить может запускать другие нити в рамках процесса. Каждая нить имеет собственный сегмент стека.
Все нити процесса разделяют сегмент данных процесса.

Слайд 58Стандарт OpenMP
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
OpenMP (Open Multi-Processing) – стандарт,

реализующий модели программирования в общей памяти и Fork-Join.
Стандарт содержит набор директив компилятора и спецификаций подпрограмм на языках C, С++ и FORTRAN.
Стандарт реализуется разработчиками компиляторов для различных аппаратно-программных платформ (кластеры, персональные компьютеры, …, Windows, Unix/Linux, …).
Разработчик стандарта – OpenMP Architecture Review Board (www.openmp.org).

Слайд 59OpenMP-программа
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Главная нить (программа) порождает семейство дочерних

нитей (сколько необходимо). Порождение и завершение осуществляется с помощью директив компилятора.

Главная нить

Нити

Параллельные регионы

Последовательные регионы


Слайд 60Простая OpenMP-программа
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"

void main() {

printf("Hello!\n"); }

void main() { #pragma omp parallel {
printf("Hello!\n"); } }

Результат

Результат (для 2-х нитей)

Hello!

Hello! Hello!

Последовательный код

Параллельный код



Слайд 61Простая OpenMP-программа
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"


Слайд 62Преимущества OpenMP
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Поэтапное (инкрементное) распараллеливание
Можно распараллеливать последовательные

программы поэтапно, не меняя их структуру.
Единственность кода
Нет необходимости поддерживать последовательный и параллельный вариант программы, поскольку директивы игнорируются обычными компиляторами.
Эффективность кода
Учет и использование возможностей систем с общей памятью.
Мобильность кода
Поддержка языков C/C++, Fortran и ОС Windows, Unix/Linux.

Слайд 63Директивы OpenMP
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Директивы OpenMP – директивы C/C++

компилятора #pragma.
параметр компиляции /openmp.
Синтаксис директив OpenMP
#pragma omp имя_директивы[параметры]
Примеры:
#pragma omp parallel
#pragma omp for private(i, j) reduction(+: sum)

Слайд 64Функции библиотеки OpenMP
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Назначение функций библиотеки:
контроль и

просмотр параметров OpenMP-программы
omp_get_thread_num() возвращает номер текущей нити
явная синхронизация нитей на базе "замков"
omp_set_lock() устанавливает "замок"
Подключение библиотеки
#include "omp.h"

Слайд 65Переменные окружения OpenMP
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Переменные окружения контролируют поведение

приложения.
OMP_NUM_THREADS – количество нитей в параллельном регионе
OMP_DYNAMIC – разрешение или запрет динамического изменения количества нитей.
OMP_NESTED – разрешение или запрет вложенных параллельных регионов.
OMP_SCHEDULE – способ распределения итераций в цикле.
Функции назначения параметров изменяют значения соответствующих переменных окружения.
Макрос _OPENMP для условной компиляции отдельных участков исходного кода, характерных для параллельной версии программы.

Слайд 66Область видимости переменных
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Общая переменная (shared) –

глобальная по отношению к нити переменная; доступна для модификации всем нитям.
Частная переменная (private) – локальная переменная нити; доступна для модификации только одной (создавшей ее) нити только на время выполнения этой нити.
Видимость переменных по умолчанию:
переменные, определенные вне параллельной области – общие;
переменные, определенные внутри параллельной области – частные.
Явное указание области видимости – параметры директив:
#pragma omp parallel shared(buf)
#pragma omp for private(i, j)

Слайд 67Частные и общие переменные
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
void main() {
int

a, b, c;

#pragma omp parallel shared(с) private(a)
{
int d, e;

}
}

void main() {
int a, b, c;

#pragma omp parallel
{
int d, e;

}
}


Слайд 68Частные и общие переменные
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
void main() {
int

rank;
#pragma omp parallel
{
rank = omp_get_thread_num();
}
printf("%d\n", rank);
}

void main() {
int rank;
#pragma omp parallel
{
rank = omp_get_thread_num();
printf("%d\n", rank);
}
}

Одно случайное число
из диапазона
0..OMP_NUM_THREADS-1


OMP_NUM_THREADS
случайных чисел
(возможно, повторяющихся)
из диапазона
0..OMP_NUM_THREADS-1


Слайд 69Частные и общие переменные
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
void main() {
int

rank;
#pragma omp parallel shared (rank)
{
rank = omp_get_thread_num();
printf("%d\n", rank);
}
}

void main() {
int rank;
#pragma omp parallel private (rank)
{
rank = omp_get_thread_num();
printf("%d\n", rank);
}
}

OMP_NUM_THREADS
случайных чисел
(возможно, повторяющихся)
из диапазона
0..OMP_NUM_THREADS-1

OMP_NUM_THREADS
чисел из диапазона
0..OMP_NUM_THREADS-1
(без повторений,
в случайном порядке)


Слайд 70Распределение вычислений
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Директивы распределения вычислений между нитями

в параллельной области
sections – функциональное распараллеливание раздельных фрагментов кода
single и master – директивы для указания выполнения кода только одной нитью
for – распараллеливание циклов
Начало выполнения директив по умолчанию не синхронизируется.
Завершение директив по умолчанию является синхронным.


Слайд 71Директива sections
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Явное определение блоков кода, которые

могут исполняться параллельно.
каждый фрагмент выполняется однократно
разные фрагменты выполняются разными нитями
завершение директивы синхронизируется.

#pragma omp parallel sections
{
#pragma omp section
Job1();
#pragma omp section
Job2();
#pragma omp section
Job3();
}









Слайд 72Директива single
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Определяет код, который выполняется только

одной (первой пришедшей в данную точку) нитью.
Остальные нити пропускают соответствующий код и ожидают окончания его выполнения.
Если ожидание других нитей необязательно, может быть добавлен параметр nowait.

#pragma omp parallel
{
#pragma omp single
printf("Start Work #1.\n");
Work1();
#pragma omp single
printf("Stop Work #1.\n");
#pragma omp single nowait
printf("Stop Work #1 and start Work #2.\n");
Work2();
}


Слайд 73Директива master
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Определяет код, который выполняется только

одной главной нитью.
Остальные нити пропускают соответствующий код, не ожидая окончания его выполнения.

#pragma omp parallel
{
#pragma omp master
printf("Beginning Work1.\n");
Work1();
#pragma omp master
printf("Finishing Work1.\n");
#pragma omp master
printf("Finished Work1 and beginning Work2.\n");
Work2();
}


Слайд 74Распараллеливание циклов
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Счетчик цикла по умолчанию является

частной переменной.
По умолчанию вычисления распределяются равномерно между нитями.

#pragma omp parallel
{
#pragma omp for
for (i=0; i res[i] = big_calc();
}
}

#pragma omp parallel for
for (i=0; i res[i] = big_calc();
}


i=0
i=1
i=2
i=3

i=8
i=9
i=10
i=11

i=4
i=5
i=6
i=7



Слайд 75Распараллеливание циклов
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Можно явно определять частные данные

цикла.

}

void work(float c[], int N)
{
float x, y;
int i;

#pragma omp parallel for private(x, y)
for(i=0; i x = a[i];
y = b[i];
c[i] = x + y;
}
}


Слайд 76Распараллеливание циклов
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Бесконтрольное изменение нитями общих данных

приводит к логическим ошибкам.

}

float scalar_product(float a[], float b[], int N)
{
float sum = 0.0;
#pragma omp parallel for shared(sum)
for(i=0; i sum = sum + a[i] * b[i];
}
return sum;
}




Слайд 77Критическая секция в циклах
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
В любой момент

времени код критической секции может быть выполнен только одной нитью.

}

float scalar_product(float a[], float b[], int N)
{
float sum = 0.0;
#pragma omp parallel for shared(sum)
for(i=0; i#pragma omp critical
sum = sum + a[i] * b[i];
}
return sum;
}


Слайд 78Редукция операций в циклах
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Редукция подразумевает определение

для каждой нити частной переменной для вычисления "частичного" результата и автоматическое выполнение операции "слияния" частичных результатов.

float scalar_product(float a[], float b[], int N)
{
float sum = 0.0;

#pragma omp parallel for reduction(+:sum)
for(i=0; i sum = sum + a[i] * b[i];
}
return sum;
}


Слайд 79Редукция операций в циклах
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
#include
#include
long

long num_steps = 1000000000;
double step;
int main(int argc, char* argv[])
{
clock_t start, stop;
double x, pi, sum=0.0;
int i;

step = 1./(double)num_steps;
start = clock();
#pragma omp parallel for private(x) reduction(+:sum)
for (i=0; i x = (i + 0.5)*step;
sum = sum + 4.0/(1.+ x*x);
}
pi = sum*step;
stop = clock();
printf("PI=%15.12f\n", pi);
printf("Time=%f sec.\n",((double)(stop - start)/1000.0));
return 0;
}

Слайд 80Директива for
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Формат директивы
#pragma omp parallel for

[clause ...] for (…)
Виды параметра clause
private(список_переменных)
firstprivate(список_переменных)
lastprivate(список_переменных)
reduction(оператор: переменная)
ordered
nowait
schedule(вид_распределения[, размер])


Слайд 81Параметр firstprivate
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Определяет частные переменные цикла for

, которые в начале цикла принимают значения последовательной части программы.

myrank = omp_get_thread_num();
#pragma omp parallel for firstprivate(addendum)
for (i=0; i a[i] = b[i] + b[i+1] + myrank;
myrank = myrank + N % (i+1);
}


Слайд 82Параметр lastprivate
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Определяет частные переменные, которые по

окончании цикла for принимают такие значения, как если бы цикл выполнялся последовательно.

#pragma omp parallel for lastprivate(i)
for (i=0; i a[i] = b[i] + b[i+1];
}
// здесь i=N


Слайд 83Параметр ordered
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Определяет код в теле цикла

for, выполняемый в точности в том порядке, в каком он выполнялся бы при последовательном исполнении цикла.

#pragma omp for ordered schedule(dynamic)
for (i=start; i Process(i);

void Process(int k)
{
#pragma omp ordered
printf(" %d", k);
}


Слайд 84Параметр nowait
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Позволяет избежать неявного барьера при

завершении директивы for.

#pragma omp parallel
{
#pragma omp for nowait
for (i=1; i b[i] = (a[i] + a[i-1]) / 2.0;
#pragma omp for nowait
for (i=0; i y[i] = sqrt(z[i]);
}


Слайд 85Распределение итераций цикла
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Распределение итераций в директиве

for регулируется параметром schedule (вид_распределения [, размер])
static – итерации делятся на блоки по размер итераций и статически разделяются между потоками; если параметр размер не определен, итерации делятся между потоками равномерно и непрерывно
dynamic – распределение итерационных блоков осуществляется динамически (по умолчанию размер=1)
guided – размер итерационного блока уменьшается экспоненциально при каждом распределении; размер определяет минимальный размер блока (по умолчанию размер=1)
runtime – правило распределения определяется переменной OMP_SCHEDULE (при использовании runtime параметр размер задаваться не должен)

Слайд 86Пример
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
// Объем работы в итерациях предсказуем

и примерно одинаков
#pragma omp parallel for schedule(static)
for(i=0; i invariant_amount_of_work(i);
}

// Объем работы в итерациях может существенно различаться
// или непредсказуем
#pragma omp parallel for schedule(dynamic)
for(i=0; i unpredictable_amount_of_work(i);
}


Слайд 87Пример
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
// Нити подходят к точке распределения

итераций
// в разное время, объем работы в итерациях
// предсказуем и примерно одинаков
#pragma omp parallel
{
#pragma omp sections nowait
{
...
}
#pragma omp for schedule(guided)
for(i=0; i invariant_amount_of_work(i);
}
}

Слайд 88Синхронизация вычислений
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Директивы явной синхронизации
critical
barrier
atomic
Директива неявной синхронизации
#pragma

omp parallel



Слайд 89Директива critical
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Определяет критическую секцию –

участок кода, выполняемый одновременно не более чем одной нитью.

#pragma omp parallel shared(x, y) private(x_next, y_next)
{
#pragma omp critical (Xaxis_critical_section)
x_next = Queue_Remove(x);
Process(x_next);
#pragma omp critical (Yaxis_critical_section)
y_next = Queue_Remove(y);
Process(y_next);
}


Слайд 90Директива atomic
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Определяет критическую секцию для одного

оператора вида
x++ и ++x
x-- и --x
x+=выражение, x-=выражение и др.

extern float a[], *p = a, b;

// Предохранение от гонок данных
// при обновлении несколькими нитями
#pragma omp atomic
a[index[i]] += b;

// Предохранение от гонок данных
// при обновлении несколькими нитями
#pragma omp atomic
p[i] -= 1.0f;


Слайд 91Директива barrier
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
Определяет барьер – точку в

программе, которую должна достигнуть каждая нить, чтобы все нити продолжили вычисления.

// Директива должна быть частью структурного блока
if (x!=0) {
#pragma omp barrier
...
}

#pragma omp parallel shared (A, TmpRes, FinalRes) { DoSomeWork(A, TmpRes); printf("Processed A into TmpRes\n"); #pragma omp barrier DoSomeWork(TmpRes, FinalRes); printf("Processed B into C\n"); }


Слайд 92Директива barrier
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
int main()
{
sub1(2);
sub2(2);
sub3(2);
}
void sub1(int n)
{
int i;
#pragma

omp parallel private(i) shared(n)
{
#pragma omp for
for (i=0; isub2(i);
}
}
void sub2(int k)
{
#pragma omp parallel shared(k)
sub3(k);
}
void sub3(int n)
{
work(n);
#pragma omp barrier
work(n);
}

Слайд 93Директивы и параметры
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"


Слайд 94Время работы
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
double start;
double end;

start = omp_get_wtime();
//

Работа
end = omp_get_wtime();
printf(“Work took %f sec. time.\n”, end-start);

Слайд 95Количество нитей
© М.Л. Цымблер
ФПК "Параллельные вычислительные технологии"
// Неверно
np = omp_get_num_threads(); //

Здесь еще не выполнен FORK
#pragma omp parallel for schedule(static)
for (i=0; i work(i);

// Верно

#pragma omp parallel private(i)
{
i = omp_get_thread_num();
work(i);
}

Обратная связь

Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое ThePresentation.ru?

Это сайт презентаций, докладов, проектов, шаблонов в формате PowerPoint. Мы помогаем школьникам, студентам, учителям, преподавателям хранить и обмениваться учебными материалами с другими пользователями.


Для правообладателей

Яндекс.Метрика