Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПРВ_ответы2.doc
Скачиваний:
3
Добавлен:
20.12.2018
Размер:
566.27 Кб
Скачать

27(См. Тетрадь!) (см. В. 23!)

28,29

2 типа передачи сообщений:

- 1му получателю (известно кому) Точка-точка. Синх.\асинхр. Синхр - получатель готов получать сообщ – происходит передача. Асинхр – есть буфер, в который пишутся сообщения, и будут потом из него считаны.

- коллективный (массовая рассылка).

30

OpenMP (Open Multi-Processing) — открытый стандарт для распараллеливания программ на языках Си, Си++ и Фортран. Описывает совокупность директив компилятора, библиотечных процедур и переменных окружения, которые предназначены для программирования многопоточных приложений на многопроцессорных системах с общей памятью.

Разработка

Разработку спецификации OpenMP ведут несколько крупных производителей вычислительной техники и программного обеспечения, чья работа регулируется некоммерческой организацией, называемой OpenMP Architecture Review Board (ARB) [1].

Первая версия появилась в 1997 году, предназначалась для языка Fortran. Для С/С++ версия разработана в 1998 году. В 2008 году вышла версия OpenMP 3.0.

Введение

OpenMP реализует параллельные вычисления с помощью многопоточности, в которой «главный» (master) поток создает набор подчиненных (slave) потоков и задача распределяется между ними. Предполагается, что потоки выполняются параллельно на машине с несколькими процессорами (количество процессоров не обязательно должно быть больше или равно количеству потоков).

Задачи, выполняемые потоками параллельно, также как и данные, требуемые для выполнения этих задач, описываются с помощью специальных директив препроцессора соответствующего языка — прагм. Например, участок кода на языке Fortran, который должен исполняться несколькими потоками, каждый из которых имеет свою копию переменной N, предваряется следующей директивой: !$OMP PARALLEL PRIVATE(N)

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

Ключевые элементы

Ключевыми элементами OpenMP являются

  • конструкции для создания потоков (директива parallel),

  • конструкции распределения работы между потоками (директивы DO/for и section),

  • конструкции для управления работой с данными (выражения shared и private),

  • конструкции для синхронизации потоков (директивы critical, atomic и barrier),

  • процедуры библиотеки поддержки времени выполнения (например, omp_get_thread_num),

  • переменные окружения (например, OMP_NUM_THREADS).

Примеры программ

В этой программе два массива (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;

}