- •Тема 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.
Тема 6 Технология cuda.
Основные термины: концепция simd, мультипроцессор, устройство (device), хост (host), ядро (kernel). Организация потоков.
Технология CUDA — это программно-аппаратная вычислительная архитектура NVIDIA, основанная на расширении языка Си, которая даёт возможность организации доступа к набору инструкций графического ускорителя и управления его памятью при организации параллельных вычислений. CUDA помогает реализовывать алгоритмы, выполнимые на графических процессорах видеоускорителей GeForce восьмого поколения и старше (серии GeForce 8, GeForce 9, GeForce 200), а также Quadro и Tesla. Вычислительная архитектура CUDA реализована на концепции SIMD - один поток команд и множественный поток данных. То есть одна инструкция позволяет обрабатывать множество данных.
Понятие мультипроцессора. Мультипроцессор - многоядерный SIMD-процессор, позволяющий в каждый определенный момент времени обрабатывать, выполнять на всех ядрах одну инструкцию.
Устройство (device) - видеоадаптер, поддерживающий драйвер CUDA, либо другое специализированное устройство, предназначенное для выполнения инструкций CUDA (например NVidia Tesla)
Будем рассматривать GPU только как логическое устройство, не вдаваясь в подробности реализации, то есть устройство можно представить как набор мультипроцессоров и драйвер CUDA.
Хост (host) - обычная программа в оперативной памяти, использующую CPU и выполняющую управляющие функции по работе с device, то есть та часть программы, которая выполняется на CPU - хост, а на GPU - device.
Организация потоков
Пусть необходимо выполнить некоторую процедуру на N потоках, в CUDA эта процедура называется ядром (kernel). Для CUDA характерна блочно-сеточная архитектура, при этом драйвер CUDA сам распределяет ресурсы устройства между потоками.
В
се
потоки, выполняющим kernel1, которые
объединены блоки, которые объединены
в решетку grid1. Каждый блок в свою очередь
состоит из потоков. Все индексы потоков
двухмерные, в CUDA можно работа с 1-3мерными
индексами, все определяется спецификацией
решаемой задачи. В CUDA можно использовать
одномерный-трехмерные индексы. Индексы
представляют собой трехмерные векторы,
каждый поток знает индекс потока внутри
блока threadIdx: threadIdx.x threadIdx.y и знает индекс
блока внутри сетки blockIdx: blockIdx.x blockIdx.y.
При запуске программы на device все потоки
в grid отличаются только индексами, именно
через индексы можно управлять потоками,
указывая какая часть данных обрабатывается
тем или иным потоком. Код задачи
выполняется на мультипроцессоре
определенными частями (пулами, warp'ами).
Архитектура устройства, виды памяти.
Модель программирования в CUDA предполагает группирование потоков. Потоки объединяются в блоки потоков (thread block) — одномерные или двумерные сетки потоков, взаимодействующих между собой при помощи разделяемой памяти и точек синхронизации.
П
рограмма
(ядро, kernel) исполняется над сеткой (grid)
блоков потоков (thread blocks). Верхний уровень
ядра GPU состоит из блоков, которые
группируются в сетку или грид (grid)
размерностью N1 * N2 * N3. Это можно изобразить
следующим образом:
Рис. 1. Вычислительное устройство GPU. Рис. 2. Устройство блока GPU.
Любой блок в свою очередь состоит из нитей (threads), которые являются непосредственными исполнителями вычислений. Нити в блоке сформированы в виде трехмерного массива (рис. 2).
GPU может читать из константной памяти и из текстурной памяти. CPU может читать и записывать в константную, текстурную память и глобальную память. Каждый из процессоров нутри блока может читать и писать в shared memory, в регистры, в локальную память и в глобальную память.
Основные ограничения CUDA:
отсутствие поддержки рекурсии для выполняемых функций;
минимальная ширина блока в 32 потока;
закрытая архитектура CUDA, принадлежащая NVIDIA
Регистровая память - самая быстрая из всех видов памяти, компилятор старается разместить все локальные переменные в регистрах, если регистров не хватает, то располагает в локальный памяти.
Локальная память - достаточно быстрая память, но ее трудно контролировать и разработчики CUDA советуют ее не использовать.
Глобальная память - самый большой объём памяти, доступный для всех мультипроцессоров на видеочипе, размер составляет от 256 мегабайт до 1.5 гигабайт на текущих решениях (и до 4 Гбайт на Tesla). Обладает высокой пропускной способностью, более 100 гигабайт/с для топовых решений NVIDIA, но очень большими задержками в несколько сот тактов. Не кэшируется, поддерживает обобщённые инструкции load и store, и обычные указатели на память. Дает возможность читать из любой ячейки и писать в любую ячейку. Разработчики CUDA рекомендуют сохранять в глобальной памяти результаты вычислений, перед тем как их отправить на хост. То, что будет храниться в глобальной памяти имеют спецификатор:__global__. В глобальной памяти можно выделять память динамически с помощью функции cudaMalloc().
Константная память - кэшируется, в константную память с хоста можно записывать с помощью функции cudaMemcpyToSymbol(). Если константа хранится в глобальной памяти, то для нее существует спецификатор: __constant__. С device в константную память нельзя ничего писать.
Разделяемая память - не кэшируется, но работает очень быстро. На один микропроцессор доступно только 16кб разделяемой памяти. При размещении данных указывается спецификатор: __shared__.
Текстурная память - кэшируется, она сохранилась благодаря первоначальному назначению видеоадаптера, физически текстурная память не отделена от глобальной. С device в текстурную память писать нельзя.
