- •Тема 1. Введение в архитектуру многопроцессорных вычислительных систем
- •Необходимость введение классификации параллельных вычислительных систем. Требования, которым должна удовлетворять классификации.
- •Классификация м. Флинна. Достоинства и недостатки.
- •Компьютеры с разделенной памятью: mpp-системы. Принципиальная схема. Примеры mpp-систем.
- •Компьютеры с общей памятью: smp-системы. Многоядерные системы. Принципиальная схема. Примеры smp-систем.
- •Системы с неоднородным доступом к памяти: ccNuma-системы. Принципиальная схема.
- •Кластерные системы. Кластер игэу. Схема кластера. Основные характеристики.
- •Тема 2. Система программирования mpi
- •Mpi. Характеристика системы. Основные понятия mpi.
- •Константы. Типы. Сообщения, атрибуты сообщения. Структура mpi_Status.
- •Основные функции mpi: mpi_Init(), mpi_Finalize(), mpi_Wtime().
- •Функции работы с коммуникатором: mpi_Comm_size(), mpi_Comm_rank().
- •Функции коллективного взаимодействия процессов: mpi_Bcast(), mpi_Barrier(), mpi_Reduce(),mpi_Allreduce(),(), mpi_Scan(),. Коллективные операции.
- •Функции обмена с блокировкой: mpi_Send(), mpi_Recv(), mpi_Ssent(),mpi_Bsend(), mpi_Rsend(), mpi_Buffer_attach(), mpi_Buffer_detach().
- •Тема 3. Система программирования OpenMp
- •Система программирования OpenMp. Понятие нити. Структура OpenMp-программы. Схема fork/join. Понятие директивы, клаузы. Классы переменных.
- •Директива OpenMp определения параллельной области. Клаузы.
- •Директива для параллельного выполнения циклов. Клаузы.
- •Директива для однократного выполнения участка кода. Клаузы.
- •Директива для параллельного выполнения независимых фрагментов программы. Клаузы.
- •Директива синхронизации.
- •Директива выполнения блока программы нитью-«мастер».
- •Атомарная директива.
- •Директива создания критической секции. Именованная критическая секция.
- •Директивы flush, ordered, threadprivate.
- •Функции OpenMp.
- •Тема 4. Нейрокомпьютерные системы
- •Обучение простейшего персептрона распознаванию двух образов.
- •Отображение
- •Реакция на образ
- •Блок подготовки
- •Блок обучения
- •Блок проверки
- •Функции активации.
- •Топологии нейронных сетей.
- •Алгоритмы обучения. Методы Хебба.
- •Ассоциативная память нейронных сетей.
- •Тема 5. Параллельные вычисления
- •Виды параллелизма.
- •Ускорение вычислений. Основной закон Амдала. Закон Густавсона-Барсиса.
- •Сетевой закон Амдала. Недостатки закона Амдала.
- •Решение уравнения теплопроводности на мвс. Постановка задачи. Расчетные формулы. Параллельный алгоритм. Распределение точек по процессам. Обработка стыков. Ускорение и точность вычислений.
- •Тема 6 Технология cuda.
- •Основные термины: концепция simd, мультипроцессор, устройство (device), хост (host), ядро (kernel). Организация потоков.
- •Архитектура устройства, виды памяти.
- •Расширения языка с. Спецификаторы функций, спецификаторы переменных, добавленные типы.
- •Функции cuda: функция вызова ядра, функции работы с памятью.
- •Функции определения времени вычислений.
- •Пример программы на cuda: решение системы обыкновенных дифференциальных уравнений методом Рунге-Кутта 4.
Функции работы с коммуникатором: mpi_Comm_size(), mpi_Comm_rank().
Функция определения общего числа процессов
int MPI_Comm_size(MPI_Comm comm, int *size);
MPI_Comm comm - идентификатор коммуникатора группы
int *size - адрес переменной целого типа, в которую будет записан размер группы
Процесс, обратившийся к данной функции по адресу size запишет размер группы с коммуникатором comm. Функция возвращает код ошибки или 0 в случае успешного завершения.
Функция определения уникального номера процесса
int MPI_Comm_rank(MPI_comm comm, int *rank);
MPI_comm comm - идентификатор коммуникатора группы
int *rank - указатель на переменную целого типа, в которую будет сохранен уникальный номер процесса.
Процесс, обратившийся к данной функции в переменную rank запишет свой собственный уникальный номер в группе с коммуникатором comm. Функция возвращает код ошибки или в случае успешного завершения.
Пример 1
Каждый процесс должен записать в свой файл свой номер и общее число процессов
#include <stdio.h> #include <mpi.h>
int main(int argc, char**argv)
{ int rank, size; if (MPI_Init(&argc, &argv)) return 1; if (MPI_Comm_size(MPI_COMM_WORLD, &size)){ MPI_Finalize(); return 2; } if (MPI_Comm_rank(MPI_COMM_WORLD, &rank)){ MPI_Finalize(); return 3; } char name[10]; sprintf(name, “rank%d.dat”, rank); FILE *f; f = fopen(name, “w”); fprintf(f, “size=%d rank=%d\n”, size, rank); fclose(f); MPI_Finalize(); return 0; }
Функции коллективного взаимодействия процессов: mpi_Bcast(), mpi_Barrier(), mpi_Reduce(),mpi_Allreduce(),(), mpi_Scan(),. Коллективные операции.
Функция широковещательного обмена
int MPI_Bcast(void *buf, int count, MPI_Datatype type, int root, MPI_Comm comm);
void *buf - указатель на переменную или массив откуда будет считываться/куда будет записано сообщение
int count - количество элементов в передаваемом/принимаемом сообщении
MPI_Datatype type - тип элементов в передаваемом/принимаемом сообщении в терминологии MPI
int root - идентификатор процесса, который будет передавать сообщение
MPI_Comm comm - идентификатор коммуникатора группы
Функция указывается для всех процессов коммуникатора. Процесс, обратившийся к данной функции, сравнивает свой номер с параметром root, если root=rank, то этот процесс передает сообщение всем остальным процессам и себе тоже. Все остальные процессы, номер которых не совпал с root, принимают сообщение.
Функция синхронизации
int MPI_Barrier(MPI_Comm comm);
Процесс, обратившийся к данной функции, ждет барьер, пока все процессы группы с коммуникатором comm не обратятся к данной функции. После этого действие функции заканчивается, то есть все процессы обращаются в один и тот же момент времени к функции,
Функция выполнения глобальной операции
int MPI_Reduse(void *buf1, void *buf2, int count, MPI_Datatype type, MPI_Op op, int root,
MPI_Comm comm);
void *buf1 - адрес переменной, где хранится аргумент глобальной функции
void *buf2 - адрес переменной, где будет храниться результат действия глобальной функции
int count - количество аргументов на одном процессе
MPI_Datatype type - тип аргументов и результата в терминологии MPI
MPI_Op op - идентификатор глобальной операции
int root - идентификатор процесса, на котором будет записан результат глобальной операции
MPI_Comm comm - идентификатор коммуникатора группы, которой принадлежат процессы
Процесс, обратившийся к данной функции проверят свой rank с параметром root. Если совпадает, то он собирает со всех процессов переменную, находящуюся buf1, выполняет глобальную операцию op и записывает результат по адресу buf2. Собирает со всех и у себя тоже. Если идентификатор не совпадает с root, то процесс передает переменную, находящуюся по адресу buf1, количества count и типа type.
Если результат нужно сохранить на всех процессах, то пользуются функцией:
int MPI_Allreduse(void *, void *, int, MPI_Datatype,MPI_Op,MPI_Comm);
Обе функции возвращают 0 в результате успешного завершения.
Функция сбора данных в один массив
int MPI_Gather(void *bufr, int rcount, MPI_Datatype rtype, void *bufw, int wcount, MPI_Datatype wtype, int root, MPI_Comm comm); // r – откуда, w - куда
void *bufr - адрес переменной или массива, которая будет считываться
int rcount - количество принимаемой информации от каждого процесса
MPI_Datatype rtype - тип элементов в принимаемом сообщении
void *bufw - адрес массива, куда будет записана информация
int root - идентификатор где будет сохранен массив
Процесс с номером root получает последовательно от всех процессов и от себя тоже данные, находящиеся по адресу bufr и записывает по адресу bufw. Если необходимо собрать массив на всех процессах, то пользуются функцией:
MPI_Allgather(void*, int*, MPI_Datetype, void*, int*, MPI_Datatype, MPI_Comm);
Функции возвращают 0 в случае успешного завершения.
Функция рассылки частей массива на все процессы
int MPI_Scatter(void *bufr, int rcount, MPI_Datatype rtype, void *bufw, int wcount, MPI_Datatype wtype, int root, MPI_Comm comm);
Процесс root из массива по адресу bufr по rcount элемента типа rtype рассылает последовательно по номеру процесса и себе тоже. Все остальные процессы получают от root данные и записывают по адресу bufw, wcount элементов типа wtype, которые должны совпадать. Все процессы принадлежат группе с коммуникатором comm.
