- •Тема 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.
Расширения языка с. Спецификаторы функций, спецификаторы переменных, добавленные типы.
Расширения
Перед функциями в .cu файле могут стоять следующие «модификаторы»:
__device__ — это означает, что функция выполняется только на видеокарте. Из программы выполняющейся на обычном процессоре(host) её вызвать нельзя.
__global__ — Эта функция — начало вашего вычислительного ядра. Выполняется на видеокарте, но запускается только с хоста.
__host__ — Выполняется и запускается только с хоста (т.е. обычная функция C++). Если вы перед функцией укажите например __host__ и __device__ — то будут скомпилированы 2 версии функции (не все комбинации допустимы).
Спецификаторы размещения переменных в памяти GPU:
__device__ - переменная помещается в глобальной памяти устройства, например: __device__ float a;
__constant__ - переменная располагается в константной памяти. Записывать значение можно только с CPU, с помощью функции cudaMemcpyToSymbol();
__shared__ - переменная помещается в разделяемую память. Нельзя при объявлении переменной инициализировать её.
Добавленные типы:
1,2,3,4-мерные векторы, построенные из базовых типов. Например: char1, char2, char3, char4, int#, uint#, float#
Для задания размерности используется тип dim3, построенный на основе uint3 с конструктором, инициализирующим незаданные поля единицами.
Добавленные переменные:
dim3 gridDim – размер грида
dim3 blockDim – размер блока
uint3 blockIdx – индекс текущего блока в гриде
uint3 threadIdx – индекс текущего потока в блоке
int warpSize – размер варпа.
Для получения технической информации об имеющихся в компьютере адаптерах предлагается использовать Си-функцию CUDA API cudaGetDeviceProperties:
maxGridSize – размерность сетки блоков. К примеру, на GeForce 9600M GS размерность сетки блоков: 65535*65535*1, то есть сетка блоков двумерная (полученные данные удовлетворяют Compute Capability v.1.1).
maxThreadsDim – размерность массива нитей в блоке.
Типичный, но не обязательный шаблон решения задач:
задача разбивается на подзадачи;
входные данные делятся на блоки, которые вмещаются в разделяемую память;
каждый блок обрабатывается блоком потоков;
подблок подгружается в разделяемую память из глобальной;
над данными в разделяемой памяти проводятся соответствующие вычисления;
результаты копируются из разделяемой памяти обратно в глобальную.
Функции cuda: функция вызова ядра, функции работы с памятью.
Каждая функция CUDA, кроме вызова ядра, возвращает переменную типа cudaError_t. В случае удачного завершения равна cudasuccess, иначе коду ошибки.
Функция вызова ядра:
__global__ void Kernel<<<dim3 grdim, dim3 bldim, size_t Ns, cudaStream_t S>>>(arg);
dim3 grdim - размер грида в блоках
dim3 bldim - размер блока в потоках
size_t Ns - размер дополнительно выделяемой shared памяти к уже имеющейся
cudaStream_t S - номер потока, в котором будет происходить вызов функции, по умолчанию номер потока равен 0.
Два последних параметра являются необязательными, их можно не указывать.
arg - аргументы функции, выполняемой на устройстве.
Функция Kernel вызывается на хосте.
Функция работы с памятью
Для выделения и освобождения памяти на GPU используются функции:
cudaMalloc() cudaFree()
Функция выделения памяти:
cudaError_t cudaMalloc((void**)&devPtr,int size);
где
(void**)&devPtr - адрес переменной или массива, для которой выделяется память на устройстве
int size - размер выделяемой памяти в байтах
Функция освобождения памяти на устройстве:
cudaError_t cudaFree(devPtr);
В параметрах указывается адрес переменной, для которой была выделена память на устройстве.
Функция синхронизации
cudaError_t __syncthreads();
При обращении к данной функции все нити будут ждать до тех пор, пока все нити блока необратятся к этой функции, после этого действие ее прекращается.
Функция копирования памяти
Функция malloc выделяет память на GPU, к которой CPU не имеет непосредственного отношения.
Функция cudaMemcpy позволяет копировать память с CPU на GPU и обратно и внутри GPU.
cudaError_t cudaMemcpy(void *dst, const void *src, size_t size, enum cudaMemcpyKind kind);
void *dst - адрес куда необходимо скопировать память
const void *src - адрес откуда необходимо скопировать память
size_t size - объем переписываемой памяти в байтах
enum cudaMemcpyKind kind - задает способ записи памяти, может принимать следующие значения:
cudaMemcpyHostToHost
cudaMemcpyHostToDevice
cudaMemcpyDeviceToHost
cudaMemcpyDeviceToDevice
