Оцените презентацию от 1 до 5 баллов!
Тип файла:
ppt / pptx (powerpoint)
Всего слайдов:
27 слайдов
Для класса:
1,2,3,4,5,6,7,8,9,10,11
Размер файла:
1.21 MB
Просмотров:
112
Скачиваний:
0
Автор:
неизвестен
Слайды и текст к этой презентации:
№1 слайд
№2 слайд
Содержание слайда: Параллельное программирование
с использованием OpenMP
№3 слайд
Содержание слайда: Директивы openmp
№4 слайд
Содержание слайда: Директива master
Директива master определяет фрагмент кода, который должен быть выполнен только основным потоком
Все остальные потоки пропускают данный фрагмент кода
Завершение директивы не синхронизируется
#pragma omp master newline
structured_block
№5 слайд
Содержание слайда: Директива single
Директива single определяет фрагмент кода, который должен быть выполнен только одним потоком (любым)
Один поток исполняет блок в single, остальные потоки приостанавливаются до завершения выполнения блока
Формат директивы single
#pragma omp single [clause ...]
structured_block
Возможные параметры (clauses)
private(list)
firstprivate(list)
copyprivate(list)
nowait
№6 слайд
Содержание слайда: Директива critical…
Директива critical определяет фрагмент кода, который должен выполняться только одним потоком в каждый текущий момент времени (критическая секция)
Формат директивы critical
#pragma omp critical [name] newline
structured_block
№7 слайд
Содержание слайда: Директива critical
#include <omp.h>
main()
{
int x;
x = 0;
#pragma omp parallel shared(x)
{
#pragma omp critical
x = x + 1;
} // end of parallel section
}
№8 слайд
Содержание слайда: Директива barrier
Директива barrier определяет точку синхронизации, которую должны достигнуть все потоки для продолжения вычислений (директива должны быть вложена в блок)
Формат директивы barrier
#pragma omp barrier newline
№9 слайд
Содержание слайда: Директива atomic
Директива atomic определяет переменную, операция с которой (чтение/запись) должна быть выполнена как неделимая
Формат директивы atomic
#pragma omp atomic newline
statement_expression
Возможный формат записи выражения
x binop = expr , x++, ++x, x--, --x
x должна быть скалярной переменной
expr не должно ссылаться на x
binop должна быть неперегруженной операцией вида:
+, -, *, /, &, ^, |, >>, <<
№10 слайд
Содержание слайда: Библиотека функций openmp
№11 слайд
Содержание слайда: Функции управления выполнением…
Задать число потоков в параллельных областях
void omp_set_num_threads(int num_threads)
Вернуть число потоков в параллельной области
int omp_get_num_threads(void)
Вернуть максимальное число потоков, которое может быть создано в следующих параллельных областях без параметра num_threads
int omp_get_max_threads(void)
№12 слайд
Содержание слайда: Функции управления выполнением…
Вернуть номер потока в параллельной области
int omp_get_thread_num(void)
Вернуть число процессоров, доступных приложению
int omp_get_num_procs(void)
Возвращает true, если вызвана из параллельной области программы
int omp_in_parallel(void)
№13 слайд
Содержание слайда: Функции управления выполнением
Включить/выключить вложенный параллелизм
int omp_set_nested(int)
Вернуть, включен ли вложенный параллелизм
int omp_get_nested(void)
Возвращает true, если вызвана из параллельной области программы
int omp_in_parallel(void)
№14 слайд
Содержание слайда: Функции управления замками…
В качестве замков используются переменные типа omp_lock_t.
Инициализировать замок
void omp_init_lock(omp_lock_t *lock)
Удалить замок
void omp_destroy_lock(omp_lock_t *lock)
№15 слайд
Содержание слайда: Функции управления замками
Захватить замок, если он свободен, иначе ждать освобождения
void omp_set_lock(omp_lock_t *lock)
Освободить захваченный ранее замок
void omp_unset_lock(omp_lock_t *lock)
Попробовать захватить замок. Если замок занят, возвращает false
int omp_test_lock(omp_lock_t *lock)
№16 слайд
Содержание слайда: Переменные окружения
№17 слайд
Содержание слайда: Переменные окружения
OMP_SCHEDULE – определяет способ распределения итераций в цикле, если в директиве for использована клауза schedule(runtime)
OMP_NUM_THREADS – определяет число нитей для исполнения параллельных областей приложения
OMP_NESTED – разрешает или запрещает вложенный параллелизм
OMP_STACKSIZE – задать размер стека для потоков
Компилятор с поддержкой OpenMP определяет макрос “_OPENMP”, который может использоваться для условной компиляции отдельных блоков, характерных для параллельной версии программы
№18 слайд
Содержание слайда: Векторизация цикла
№19 слайд
Содержание слайда: Директива simd…
Директива simd – «просьба» компилятору векторизовать нижеследующий(-ие) цикл(-ы)
Формат директивы simd
#pragma omp simd [clause ...]
for_loops
Возможные параметры (clauses)
safelen(length)
simdlen(length)
aligned(list[ : alignment])
collapse(n)
...
№20 слайд
Содержание слайда: Директива simd
#pragma simd
#pragma omp parallel for private(d1, d2, erf1, erf2, invf)
for (i = 0; i < N; i++)
{
invf = invsqrtf(sig2 * pT[i]);
d1 = (logf(pS0[i]/pK[i])+(r+sig2*0.5f)*pT[i])/invf;
d2 = (logf(pS0[i]/pK[i])+(r-sig2*0.5f)*pT[i])/invf;
erf1 = 0.5f + 0.5f * erff(d1 * invsqrt2);
erf2 = 0.5f + 0.5f * erff(d2 * invsqrt2);
pC[i] = pS0[i]*erf1-pK[i]*expf((-1.0f)*r*pT[i])*erf2;
}
№21 слайд
Содержание слайда: Threadprivate данные
№22 слайд
Содержание слайда: Директива threadprivate
const int Size = 4;
int gmas[Size];
#pragma omp threadprivate(gmas)
void main()
{
int i;
for (i = 0; i < Size; i++)
gmas[i] = Size - i;
#pragma omp parallel
if (omp_get_thread_num() == 1)
{
printf("\n");
for (i = 0; i < Size; i++)
printf("gmas[%d] = %d\n", i, gmas[i]);
for (i = 0; i < Size; i++)
gmas[i] = i;
}
№23 слайд
Содержание слайда: Директива threadprivate
printf("\n");
for (i = 0; i < Size; i++)
printf("gmas[%d] = %d\n", i, gmas[i]);
#pragma omp parallel
if (omp_get_thread_num() == 1)
{
printf("\n");
for (i = 0; i < Size; i++)
printf("gmas[%d] = %d\n", i, gmas[i]);
}
#pragma omp parallel copyin(gmas)
if (omp_get_thread_num() == 1)
{
printf("\n");
for (i = 0; i < Size; i++)
printf("gmas[%d] = %d\n", i, gmas[i]);
}
}
№24 слайд
Содержание слайда: Привязка потоков
№25 слайд
Содержание слайда: Параметр proc_bind
У директивы parallel в стандарте 4.0 был добавлен параметр proc_bind, определяющий способы «привязки» потоков к исполнительным устройствам
Формат параметра proc_bind
#pragma omp parallel proc_bind(master | close | spread)
master
Назначить все потоки в команде на то же устройство, на котором исполняется master-поток
№26 слайд
Содержание слайда: Параметр proc_bind
close
Распределить потоки по устройствам в порядке «деление по модулю»
spread
Распределить потоки по устройствам «по блокам»
№27 слайд
Содержание слайда: Литература
Гергель В.П. Высокопроизводительные вычисления для многопроцессорных многоядерных систем. - М.: Изд-во Московского университета, 2010. – 544 с.
Дополнительная литература:
Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. – СПб.: БХВ-Петербург, 2002.
Гергель В.П. Теория и практика параллельных вычислений. - М.: Интернет-Университет, БИНОМ. Лаборатория знаний, 2007.
Гергель В.П. Новые языки и технологии параллельного программирования. - М.: Издательство Московского университета, 2012. – 434 с.
Гергель В.П., Баркалов К.А., Мееров И.Б., Сысоев А.В. и др. Параллельные вычисления. Технологии и численные методы. Учебное пособие в 4 томах. – Нижний Новгород: Изд-во Нижегородского госуниверситета, 2013. – 1394 с.