
- •Тема 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.
Тема 3. Система программирования OpenMp
Система программирования OpenMp. Понятие нити. Структура OpenMp-программы. Схема fork/join. Понятие директивы, клаузы. Классы переменных.
OpenMP(Open Multi-Processing) - стандарт для написания параллельных программ для многопроцессорных вычислительных систем с общей памятью (SMP-систем). Реализуется чередование последовательных и параллельных секций. Программа представляется как набор нитей (threads), объединённых общей памятью.
Подключается #include <omp.h>.
Thread (нить, легковесный процесс) – код, выполняющийся на одном процессоре.
При старте выполняется последовательная секция, которую выполняет master thread(нить-мастер).
В точке fork образуются дополнительные n-1 нити, нить-мастер продолжает работу в параллельной секции и имеет номер 0.
В точке Join нить-мастер дожидается завершения работы всех нитей и продолжает работу одна в последовательной секции.
Чередований Fork/Join может быть столько, сколько необходимо.
Директивы и клаузы
Значительная часть функциональности OpenMP реализуется при помощи директив компилятору. Они должны быть явно вставлены пользователем, что позволит выполнять программу в параллельном режиме. В C/C++ директивы OpenMP определяются конструкциями #pragma. Использование специальной ключевой директивы “omp” указывает на то, что команды относятся к OpenMP и для того, чтобы исключить случайные совпадения имён директив OpenMP с другими именами. Таким образом директивы #pragma для работы с OpenMP имеют следующий формат:
#pragma omp <директива> [<clause>]
{ …. } //Блок, на который действует директива
Clause(опция) - это необязательный модификатор директивы, влияющий на ее поведение. Списки опций, поддерживаемые каждой директивой, различаются, а пять директив (master, critical, flush, ordered и atomic) вообще не поддерживают опции.
Объектом действия большинства директив является один оператор или блок, перед которым расположена директива в исходном тексте программы.
Классы переменных
В параллельной секции существует 2 класса переменных:
Общие (shared)
Локальные (private)
Общая переменная всегда существует лишь в одном экземпляре для всей программы и доступна всем нитям под одним и тем же именем. Объявление же локальной переменной вызывает порождение своего экземпляра данной переменной для каждой нити. Изменение нитью значения своей локальной переменной, естественно, никак не влияет на изменение значения этой же локальной переменной в других нитях.
Программист сам определяет класс переменной.
Директива OpenMp определения параллельной области. Клаузы.
Директива parallel создает параллельную область для следующего за ней структурированного блока, параллельная область задаётся при помощи записи:
#pragma omp parallel [<clause>]
{…} Возможные опции(clause):
if (условие) – выполнение параллельной области по условию. Вхождение в параллельную область осуществляется только при выполнении некоторого условия. Если условие не выполнено, то директива не срабатывает и продолжается обработка программы в прежнем режиме;
num_threads (целочисленное выражение) – явное задание количества нитей, которые будут выполнять параллельную область; по умолчанию выбирается последнее значение, установленное с помощью функции omp_set_num_threads(), или значение переменной OMP_NUM_THREADS;
default(shared|none) – всем переменным в параллельной области, которым явно не назначен класс, будет назначен класс shared; none означает, что всем переменным в параллельной области класс должен быть назначен явно;
private (список) – задаёт список переменных, для которых порождается локальная копия в каждой нити; начальное значение локальных копий переменных из списка не определено;
firstprivate (список) – задаёт список переменных, для которых порождается локальная копия в каждой нити; локальные копии переменных инициализируются значениями этих переменных в нити-мастере;
shared (список) – задаёт список переменных, общих для всех нитей;
copyin (список) – задаёт список переменных, объявленных как threadprivate, которые при входе в параллельную область инициализируются значениями соответствующих переменных в нити-мастере;
reduction (оператор:список) – задаёт оператор и список общих переменных; для каждой переменной создаются локальные копии в каждой нити; локальные копии инициализируются соответственно типу оператора (для аддитивных операций – 0 или его аналоги, для мультипликативных операций – 1 или её аналоги); над локальными копиями переменных после выполнения всех операторов параллельной области выполняется заданный оператор; оператор это: +, *, -, &, |, ^, &&, ||; порядок выполнения операторов не определён, поэтому результат может отличаться от запуска к запуску.
Если один из потоков параллельной области встречает другую директиву parallel, то он создает новую группу потоков, согласно правилам, и становится основной нитью новой группы.
Если выполнение потока аварийно прерывается внутри параллельной области, то также прерывается выполнение всех потоков во всех группах.