Параллельное программирование

advertisement
Версии сompute capability CUDA
Поддерживаемые возможности (не
указанные здесь возможности
поддерживаются во всех версиях)
Версия CC
1.0 1.1 1.2 1.3 2.x 3.0 3.5
Целочисленные атомарные функции над 32разрядными словами в глобальной памяти
Атомарные обменные операции над 32битными числами с плавающей точкой в
глобальной памяти
Нет
Да
Целочисленные атомарные функции над 32разрядными словами в разделяемой памяти
Атомарные обменные операции над 32битными числами с плавающей точкой в
разделяемой памяти
Нет
Да
Целочисленные атомарные функции над 64разрядными словами в глобальной памяти
Warp-функции голосования
Операции с плавающей точкой двойной
точности
1
Нет
Да
Версии сompute capability CUDA
Поддерживаемые возможности
2
Версия CUDA
1.0 1.1 1.2 1.3 2.x 3.0 3.5
Целочисленные атомарные-функции над 64разрядными словами в разделяемой памяти
Атомарные операции типа сложения над 32битными числами с плавающей точкой в
глобальной и разделяемой памяти
Функция _ballot()
Нет
Да
Набор функций _threadfence_system()
Функции _syncthreads_count(),
syncthreads_and(), _syncthreads_or()
Поверхностные функции
3-мерная сетка блоков потоков
Функции перемешивания warp'ов
Сдвиги воронкой
Динамический параллелизм
Нет
Нет
Да
Да
Технические характеристики
Технические спецификации
1
Версия CC
1.0 1.1 1.2 1.3 2.x 3.0
3.5
Максимальная размерность сетки
блоков потоков
2
3
Максимальные x-, y- или zразмерности сетки блоков
65535
231-1
Максимальная размерность блока
потоков
Максимальные x- или y-размерности
блока
3
512
Максимальная z-размерность блока
Максимальное количество потоков в
блоке
64
512
Размер warp’a (количество потоков)
Максимальное количество
резидентных блоков в
мультипроцессоре
1024
1024
32
8
16
Технические характеристики
2
Версия
Технические спецификации
1.0 1.1 1.2 1.3
2.x
3.0 3.5
Максимальное количество резидентных
warp’ов в мультипроцессоре
24
32
48
64
Максимальное количество резидентных
потоков в мультипроцессоре
768
1024
1536
2048
Количество 32-битных регистров в
мультипроцессоре
8K
16 K
32 K
64 K
Максимальное количество 32-битных
регистров на поток
Максимальный объем разделяемой
памяти на мультипроцессор
Количество банков разделяемой памяти
Объем локальной памяти на поток
Максимальное количество инструкций
на ядро
128
63
255
16 KB
48 KB
16
32
16 KB
512 KB
2 миллиона
512 миллионов
MPI
Аббревиатура MPI расшифровывается так:
Message passing interface (интерфейс передачи сообщений).
Этот интерфейс (библиотека) в настоящее время в
параллельном программировании для вычислительных систем
с распределенной памятью является стандартом де-факто.
Он поддерживается Аргоннской национальной лабораторией
США и развивается форумом разработчиков MPIForum.
Известны и популярны две основные версии стандарта –
1.1 и 2.0, для которых существует довольно большое
количество реализаций интерфейса MPI для различных
платформ (Linux, Windows, …), с открытым кодом, свободно
распространяемых или коммерческих и т.д.:
 MPICH (MPI Chameleon для Linux, Mac OS и Windows, Open
Source)
 Intel MPI (Входит в состав Intel® Cluster Toolkit.
Коммерческая реализация MPI, оптимизированная для
архитектуры Intel. Построена на основе MPICH)
 LAM MPI (Local Area Multicomputer, Open Source)
 OpenMPI (Open Source, консорциум академических,
научных и индустриальных кругов)
 …
Реализация MPICH интерфейса MPI
Реализация интерфейса MPICH (буквы CH являются
сокращением от слова chameleon, которым разработчики
обозначили многоплатформенность) включает в себя
следующие составные части:
 Spmd - демон (в терминах *NIX), служба (в терминах
Windows). Постоянно работает на каждом узле, на котором
возможен запуск/выполнение параллельных MPI-программ.
Обслуживает запросы на запуск/останов этих программ и
запросы от их ветвей на взаимодействие.
 Библиотека функций MPI – обеспечивает интерфейс между
ветвью параллельной программы и демоном/службой spmd.
 Утилиты, с помощью которых осуществляется запуск
параллельных программ, настройка среды и собственно MPI.
 Библиотека функций MPE – сбор, обработка и
визуализация результатов обработки статистики
взаимодействий параллельных ветвей.
Взаимодействие пользователя,
программы, MPI и системы
Простейший пример MPI-программы
#include <stdio.h>
#include "mpi.h"
int main( int argc, char *argv[ ] )
{
int rank, size;
MPI_Init( argc, argv );
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
MPI_Comm_size( MPI_COMM_WORLD, &size );
printf( "Hello world from process %d of %d\n", rank, size );
MPI_Finalize();
return 0;
}
Если запустить эту программу на 2-х машинах, то на
консоли той машины, на которой выполнялась утилита
MPIRun, появятся два сообщения:
Hello world from process 0 of 2
Hello world from process 1 of 2
Схема жизненного цикла MPIпроцессов
Основные понятия
Процессом или ветвью называется один запущенный
на исполнение экземпляр параллельной программы.
Название «процесс» унаследовано из *NIXоперационных систем, в Windows этому термину
соответствует понятие задачи.
 Один узел (ядро) параллельной системы может
исполнять несколько ветвей (процессов).
 Для организации взаимодействия ветвей как по
данным, так и по управлению, интерфейс MPI
предоставляет множество функций, которые
относятся к нескольким разным категориям:
 блокирующие;
 неблокирующие;
 локальные (индивидуальные);
 коллективные;
 существуют и функции, не имеющие прямого
отношения к межпроцессным взаимодействиям.

Основные понятия.
Коммуникаторы.
 Коммуникатор
– это дескриптор или номер
коллектива параллельных ветвей – группы в
терминологии MPI. Имена коммуникаторов обычно
начинаются с MPI_COMM_.
 Коммуникатор определяет область действия любой
функции MPI, имеющей отношение к взаимодействию
ветвей.
 Коммуникатор коллектива, который включает в себя
все ветви параллельного приложения, создается
автоматически при выполнении функции MPI_Iint и
называется MPI_COMM_WORLD.
В этот момент создаются также:
 коммуникатор MPI_COMM_SELF. В эту группу
входит единственная ветвь, вызвавшая функцию
MPI_Init().
 коммуникатор MPI_COMM_NULL. Использование
этого коммуникатора в любой функции MPI
приведет к аварийному завершению и вызвавшего
ее процесса и всего приложения.
Основные понятия.
Тэги.
Тэг – это целочисленный идентификатор,
используемый для установления соответствия
внутри потоков сообщений, передаваемых от одной
ветви другой ветви.
 С помощью тэгов решается такая проблема: если
ветвь A асинхронно (без синхронизации с
получателем) отправляет 2 (или более) сообщения
одинакового размера, адресованных ветви B, то в
общем случае нет гарантии, что сообщение,
отправленное первым, будет первым и доставлено.
По самым разным причинам может оказаться, что
второе сообщение будет доставлено раньше
первого. Если оно будет обработано ветвью B как
первое, то результаты работы параллельной
программы в целом будут неверны.
 Указание разных тэгов для этих сообщений как на
передающей, так и на приемной стороне позволяет
избежать путаницы при доставке сообщений.

Основные понятия.
Буфер данных.
Во многих функциях MPI указывается буфер,
содержащий передаваемые данные или
предназначенный для принимаемых от других
ветвей данных.
 Каждый буфер определяется тройкой параметров:
1. Адрес (указатель на первый байт буфера).
2. Длина (размер буфера в единицах длины типа,
заданного третьим параметром).
3. Тип данных (в MPI предопределен ряд типов
данных, указываемых с помощью символических
имен; существует возможность определять и
использовать производные типы данных;
производные типы не обязательно должны
занимать непрерывные области памяти).

Предопределенные
типы данных MPI
1
Тип данных MPI
Язык C
Язык C++
Язык
Fortran
MPI_CHAR
signed char
signed char
Character(1)
MPI_WCHAR
wchar_t
wchar_t
Character(1)
MPI_SHORT
signed short int
signed short int
Integer * 2
MPI_INT
signed int
signed int
Integer * 4
MPI_LONG
signed long int
signed long int
Integer * 4
MPI_UNSIGNED_CHAR
unsigned char
unsigned char
Character
MPI_UNSIGNED_SHORT unsigned short int unsigned short int Integer * 2
MPI_UNSIGNED
unsigned int
unsigned int
MPI_UNSIGNED_LONG
unsigned long int unsigned long int Integer * 4
MPI_BOOL
(MPI_LOGICAL)
signed int
bool
Integer * 4
Logical
Предопределенные
типы данных MPI
2
Тип данных MPI
Язык C
Язык C++
Язык Fortran
MPI_FLOAT
float
float
Real * 4
MPI_DOUBLE
double
double
Double precision
(Real * 8)
MPI_LONG_DOUBLE
long double long double
Double precision
(Real * 8)
MPI_COMPLEX
-
Complex
Complex<float>
MPI_DOUBLE_COMPLEX -
Complex<double> Double complex
MPI_LONG_DOUBLE_
COMPLEX
-
Complex<long
double>
-
MPI_BYTE
(8-битный байт)
-
-
-
MPI_PACKED
-
-
-
Download