- •Моделирование и анализ параллельных вычислений.
- •Модель вычислений в виде графа "операции – операнды".
- •Описание схемы выполнения параллельного алгоритма (модель: «операции – операнды»).
- •Определение времени выполнения параллельного алгоритма.
- •Правила разработки алгоритмов.
- •Программирование параллельных алгоритмов.
- •Технология mpi.
- •Введение в библиотеку mpich.
- •Передача/прием сообщений между отдельными процессами.
- •Структура параллельной программы с использованием mpi:
- •Использование модульной структуры.
- •Определение времени выполнения программ.
- •Контроль выполнения программ.
- •Передача данных от одного процесса всем процессам программы.
- •Передача данных от всех процессов одному процессу. Операция редукции.
- •Пример коллективного вызова (без обмена)- коллективная синхронизация.
- •Аварийное завершение параллельной программы
- •Оценка коммуникационных затрат для кластерных систем.
- •Режимы передачи данных mpi.
- •Организация неблокирующих обменов данными между процессами.
- •Одновременное выполнение передачи и приема.
- •Группа процессоров и коммутаторов.
- •Управление группами.
- •Управление коммуникаторами.
- •Показатели эффективности в параллельных алгоритмах.
- •Модельная задача – вычисление частных сумм последовательности числовых значений.
- •Последовательный алгоритм суммирования
- •Каскадная схема суммирования.
- •Каскадная схема с асимптотически ненулевой эффективностью.
- •Построение частичных сумм.
- •Оценка максимального параллелизма.
- •Закон Амдаля
- •Закон Густавсона-Барсиса
- •Анализ масштабируемости параллельных вычислений.
- •Верхняя граница времени выполнения параллельного алгоритма.
- •Факторы, влияющие на производительность, и способы ее повышения.
- •Принципы разработка параллельных алгоритмов.
- •Моделирование (использование моделей) при проектировании параллельных алгоритмов.
- •Этапы разработки параллельных алгоритмов.
- •Разделение вычислительной схемы на независимые части, на основе ее анализа.
- •Определение информационных зависимостей.
- •Масштабирование набора подзадач.
- •Распределение подзадач между процессорами.
- •Умножение матриц при ленточной схеме разделения данных.
- •Определение подзадач.
- •Выделение информационных зависимостей
- •Масштабирование и распределение подзадач по процессорам
- •Анализ эффективности
- •Параллельное решение систем линейных уравнений Алгоритм решения систем линейных уравнений методом Гаусса.
- •Итерация прямого хода алгоритма Гаусса
- •Построение параллельного алгоритма
- •Масштабирование и распределение подзадач по процессорам.
- •Анализ эффективности.
- •Параллельные методы сортировки
- •Принципы распараллеливания
- •Масштабирование параллельных вычислений
- •Пузырьковая сортировка
- •Алгоритм чет-нечетной перестановки
- •Определение подзадач и выделение информационных зависимостей
- •Масштабирование и распределение подзадач по процессорам
- •Анализ эффективности
- •Параллельные вычисления при решении задач на графах.
- •Программная реализация параллельного алгоритма Флойда:
- •Определение подзадач.
- •Анализ эффективности
- •Результаты вычислительных экспериментов для параллельного алгоритма Флойда
- •Работа pvm
- •Структура идентификатора td
- •Модель передачи сообщений
- •Настройка pvm
- •Структура каталога pvm:
- •Наиболее распространенные проблемы
- •Пример простейшей программы
- •Структура программы pvm.
- •Выводы по pvm:
- •Классификация вычислительных систем
- •Алгоритмы предварительного распределения данных (графы)
- •Режимы параллельных вычислений с общей памятью
- •Основные обозначения псевдокода
- •Распределение данных в erew
- •Параллельное программирование с использованием общей памяти
- •Многопоточное программирование
- •Спецификация posix Threads
- •Пример программы с использованием posix Threads
- •Механизмы синхронизации потоков
- •Среда Open mp
- •Основные правила:
- •Синхронизация
- •Обзор средств параллельного и распределенного программирования.
- •Литература:
Многопоточное программирование
Идея многопоточного программирования появилась раньше многоядерных процессоров. Межпоточное взаимодействие быстрее, чем между процессами, так как они находятся в одном адресном пространстве.
Взаимодействие между потомками реализуется с помощью сообщений.
Технология MPI также используется в системах с общей памятью, но работают медленнее.
К общим данным относятся:
Глобальные переменные.
Данные, объявленные в статической памяти.
Данные, объявленные в динамической памяти.
Индивидуальные данные – те, которые доступны в одном потоке – локальные переменные.
Планирование потоков используется во всех современных системах. В результате потоки выполняются параллельно.
Если одному потоку приложения соответствует один поток ядра – одноуровневая схема.
Если нескольким потокам приложения соответствует одни поток ядра – многоуровневая схема.
Спецификация posix Threads
Разработана сообществом разработчиков программного обеспечения.
Предназначена для управления потоками.
IEEE's POSIX Threads Model:
• Модель программирования потоков для UNIX platform
• pthreads включает международные стандарты ISO/IEC9945-1
Программная модель pthreads определяет:
• Создание и завершение потоков
• Управление исполнением потоков
• Управление разделяемыми ресурсами процесса
Создание потока:
int pthread_ create( pthread_ t * thread, pthread_ attr_ t * attr, void*(*thread_function)(void * ), void * arg ),
thread –указатель на идентификатор созданного потока
attr – атрибуты потока
third argument – функция, которую поток будет исполнять
arg – аргументы функции (обычно структура)
Функция возвращает 0 при успехе.
Ожидание завершения потока:
int pthread_ join( pthread_ t thread, void * * thread_ return )
Основной поток дожидается завершения потока с идентификатором thread.
Второй аргумент – значение возвращаемое потоком
Функция возвращает 0 при успехе.
Следует всегда дожидаться завершения потока.
Пример программы с использованием posix Threads
#include <pthread.h>
#include <stdio.h>
#include <string.h>
void *potok(void *arg)
{
printf(“Работает поток%s\n”, (char*)arg);
return 0;
}
main(int argc, char *argv[])
{
int r, rc;
pthread_t threads;
if (argc>1)
{
threads=(pthread_t *)malloc((argc-1)*sizeof(pthread_t));
for(i=1; i<argc; i++)
{
rc=pthread_create(&(threads[i-1]),NULL, potok, argv[i]);
if (rc!=0) exit(-1);
}
for(i=1; i<argc; i++)
{
rc=pthread_join(threads[i-1]),NULL);
if (rc!=0) exit(-2);
}
}
}
Механизмы синхронизации потоков
Выполнение потоков по одной и той же функции может занимать разное время.
mynumber = counter;
counter++;
Рис. 17
Критические секции выполняются строго одним процессором.
Для POSIX – это любая последовательность операторов, которая должна выполняться, не прерываясь, на одном процессоре.
Взаимное иключение (mutex):
Ограничивает доступ множества потоков к одному ресурсу в разделяемой памяти
Обеспечивает locking/unlocking критического участка кода, где разделяемый ресурс модифицируется.
Каждый поток ждет пока mutex будет разблокирован (потоком, который его блокировал) прежде чем войти в критическую секцию.
Базовые функции:
int pthread_ mutex_ init(pthread_ mutex_ t * mutex, const pthread_ mutexattr_ t * mutexattr);
int pthread_ mutex_ lock(pthread_ mutex_ t * mutex);
int pthread_ mutex_ unlock(pthread_ mutex_ t * mutex);
int pthread_ mutex_ destroy(pthread_ mutex_ t * mutex);
При попытке захвата уже захваченного mutex’а поток приостанавливается до освобождения mutex’а. Освободить его может тот поток, который его захватил.
Семафоры:
Ограничивает количество потоков, исполняющих блок кода.
Аналогичен mutex-ам
Основные функции:
Создание: int sem_ init(sem_ t * sem, int pshared, unsigned int value);
pshared - значение 0 означает, что семафор локален для процесса
Начальное значение для семафора устанавливается в value.
Уничтожение: int sem_ destroy(sem_ t * sem);
Результат действий с использованием уничтоженного семофора не определен.
Управление семафором:
int sem_ post(sem_ t * sem) - а увеличивает значение семафора на 1 ;
int sem_ wait(sem_ t * sem) - уменьшает значение семафора на 1; предварительно дождавшись пока значение не станет больше 0;
Условные переменные.
Лекция 14
