Версии с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 - - -