Презентацию к данной лекции Вы можете скачать здесь.
Фоннеймановская архитектура последовательная, скалярная. В "классическом" фоннеймановском компьютере параллелизм отсутствует на всех уровнях.
Традиционная последовательная модель программирования, ориентированная на SISD архитектуры (по Флинну). Языки последовательного программирования.
Пользователю нужна производительность. Увеличение производительности позволяет:
Многие расширения фоннеймановской архитектуры используют параллелизм на разном уровне
Вычислительные системы с распределённой памятью (кластеры, MIMD по классификации Флинна) от небольших кластеров до суперкомпьютеров, занимающих первые позиции в рейтинге Top 500 Supercomputers.
Кластер - группа вычислительных узлов, объединённых высокоскоростной коммуникационной подсистемой и представляющая с точки зрения пользователя единый аппаратный ресурс.
Системные вызовы операционной системы (UNIX/Linux)
IPC (InterProcess Communications)
Клиент
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include "mesg.h"
main()
{
message message;
key_t key;
int msgid, length, n;
if ((key = ftok("server", 'A')) < 0){
printf("Невозможно получить ключ\n"); exit(1); }
message.mtype=1L;
if ((msgid = msgget(key, PERM | IPC_CREAT)) < 0){
printf("Невозможно создать очередь\n"); exit(1); }
n = msgrcv(msgid, message, sizeof(message), message.mtype, 0);
if (n > 0) {
if (write(1, message.buff, n) != n) {
printf("Ошибка вывода\n"); exit(1); }
}
else { printf("Ошибка чтения сообщения\n"); exit(1); }
exit(0);
Сервер
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include "mesg.h"
main()
{
Message message;
key_t key;
int msgid, length;
message.mtype = 1L;
if ((key = ftok("server", 'A')) < 0){
printf("Невозможно получить ключ\n"); exit(1); }
if ((msgid = msgget(key, 0)) < 0){
printf("Невозможно получить доступ к очереди\n"); exit(1); }
if ((length = sprintf(message.buff, "Здравствуй, Мир!\n")) < 0){
printf("Ошибка копирования в буфер\n"); exit(1); }
if (msgsnd(msgid, (void *) message, length, 0) !=0){
printf("Ошибка записи сообщения в очередь\n");
exit(1); }
if (msgctl(msgid, IPC_RMID, 0) < 0){
printf("Ошибка удаления очереди\n"); exit(1); }
exit(0);
Стандарт POSIX реализации потоков (нитей) выполнения, определяющий API для создания и управления ими.
POSIX.1c, Расширения потоков (IEEE Std 1003.1c-1995)
Реализации стандарта содержат:
#include <stdio.h>
#include "gettimeofday.h"
#include <pthread.h>
#define gNumThreads 1
#define N 100000000
double a[N + 1], b[N + 1], sum;
int i, j;
double start, stop;
const int gNumSteps = N;
double gVectorSum = 0;
void *threadFunction(void *arg)
{
int i;
int myNum = *((int *)arg);
double partialSum = 0; // локально по отношению к каждому потоку
for ( i = myNum; i < gNumSteps; i += gNumThreads ) // каждый gNumThreads-й шаг
{
partialSum += a[i] * b[i]; // параллельное вычисление сумм каждым потоком
}
gVectorSum += partialSum; // сложения частных сумм и получение результата
return 0;
}
int main()
{
pthread_t tid[gNumThreads];
int tNum[gNumThreads], i, j;
// инициализация вектора
for (j = 0; j < N; j++)
{
a[j] = 1.031; b[j] = 1.057;
}
printf("Computed value of vector sum: ");
start = wcgettimeofday();
for (i = 0; i < gNumThreads; i++)
{
tNum[i] = i;
pthread_create(tid[i], NULL, threadFunction, tNum[i]);
}
for (i = 0; i < gNumThreads; i++)
pthread_join(tid[i], NULL);
stop = wcgettimeofday();
printf("sum = %f\n", gVectorSum);
printf("time = %g\n", stop - start);
В Microsoft Windows имеется возможность разработки многопоточных приложений на C++ с помощью "стандартных" системных средств – прикладного программного интерфейса операционной системы Windows.
#include <windows.h>
#include <stdio.h>
#define N 100000000
double a[N + 1], b[N + 1], sum;
int i, j;
double start, stop;
const int gNumSteps = N;
const int gNumThreads = 1;
double gVectorSum = 0;
CRITICAL_SECTION gCS;
DWORD WINAPI threadFunction(LPVOID pArg)
{
int i;
int myNum = *((int *)pArg);
double partialSum = 0; // локально по отношению к каждому потоку
for(i=myNum*(gNumSteps/gNumThreads); i<(myNum+1)*(gNumSteps/gNumThreads); i++)
// используется каждый gNumThreads-й шаг
{
partialSum += a[i] * b[i]; // вычисление частных сумм каждым потоком
}
EnterCriticalSection(gCS);
gVectorSum += partialSum; // сложение частного результата с глобальным
LeaveCriticalSection(gCS);
return 0;
}
int main()
{
HANDLE threadHandles[gNumThreads];
int tNum[gNumThreads], i, j;
for (j = 0; j < N; j++)
{
a[j] = 1.031; b[j] = 1.057;
}
printf("Computed value of dot product: ");
InitializeCriticalSection(gCS);
for ( i = 0; i < gNumThreads; ++i )
{
tNum[i] = i;
threadHandles[i] = CreateThread( NULL, // атрибуты безопасности
0, // размер стека
threadFunction, // функция потока
(LPVOID)tNum[i],// данные для функции потока
0, // режим запуска потока
NULL); // возвращаемый идентификатор потока
}
WaitForMultipleObjects(gNumThreads, threadHandles, TRUE, INFINITE);
DeleteCriticalSection(gCS);
printf("sum = %f\n", gVectorSum);
OpenMP
Стандарт программного интерфейса приложений для параллельных систем с общей памятью. Поддерживает языки C, C++, Fortran.
Первая версия появилась в 1997 (Fortran) / 1998 (C/C++) годах. Последняя версия OpenMP 3.0 (2008 год). Готовится версия OpenMP 4.0 (2012 год). Разработкой стандарта занимается OpenMP ARB (Architecture Board).
#include <windows.h>
#include <stdio.h>
#define N 100000000
double a[N + 1], b[N + 1];
int i;
double start, stop;
double gDotProduct = 0;
int main()
{
// инициализация векторов
for (i = 0; i < N; i++)
{
a[i] = 1.034; b[i] = 1.057;
}
printf("Computed value of vector sum: ");
start = omp_get_wtime();
#pragma omp parallel for reduction(+:gDotProduct)
for ( i = 0; i < N; i++ )
{
gDotProduct += a[i] * b[i];
}
stop = omp_get_wtime();
printf("sum = %f\n", gDotProduct);
printf("time = %g\n", stop - start);
Message Passing Interface (MPI)
Интерфейс Передачи Сообщений, спецификация разработанная в 1993—1994 годах группой MPI Forum, в состав которой входили представители академических и промышленных кругов. Она стала первым стандартом систем передачи сообщений.
#include <mpi.h>
#include <stdio.h>
int main (int argc, char *argv[])
{
int ProcNum, ProcRank, tmp;
MPI_Status status;
MPI_Init (argc, argv);
MPI_Comm_size (MPI_COMM_WORLD, ProcNum);
MPI_Comm_rank (MPI_COMM_WORLD, ProcRank);
if(ProcRank == 0){
printf("Hello world from process %i \n", ProcRank);
for(int i = 1; i < ProcNum; i++){
MPI_Recv(tmp,1,MPI_INT,MPI_ANY_SOURCE,0,MPI_COMM_WORLD, status);
printf("Hello world from process %i \n", tmp);
}
}
else
{
MPI_Send(ProcRank,1,MPI_INT,0,0,MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
MPI CHameleon (MPICH)
Свободно распространяемая реализация MPI. Пакет доступен в исходных кодах, поэтому допускает гибкую настройку. Поддерживается работа в различных версиях ОС UNIX, Mac OS и в последних версиях Microsoft Windows.
MPICH соответствует спецификации MPI-2. Поддерживаются различные коммуникационные среды (в т.ч. 10 Gigabit Ethernet, InfiniBand, Myrinet, Quadrics). Пока не поддерживаются системы, гетерогенные по форматам хранения данных. Имеется версия с поддержкой пакета Globus.
LAM (Local Area Multicomputer) MPI
"Opensource" реализация MPI, соответствующая спецификации MPI-1 и, в значительной мере, спецификации MPI-2. LAM поддерживает гетерогенные конфигурации, поддерживает пакет Globus и удовлетворяет IMPI (Interoperable MPI). Поддерживаются различные коммуникационные системы (в т.ч. Myrinet).
IMPI – попытка создания стандарта, обеспечивающего интероперабельность различных реализаций MPI (http://impi.nist.gov/). В настоящее время IMPI поддерживается такими реализациями, как:
LAM может работать на метакластерных системах.
Intel ® MPI
Входит в состав Intel® Cluster Toolkit. Коммерческая реализация MPI, оптимизированная для архитектуры Intel. Построена на основе MPICH.
Сайт в Интернете:
http://www.intel.com
Входит в состав Compute Cluster Pack SDK.
Ориентирована на работу в среде ОС Microsoft Windows и доступна, в том числе, по лицензии MSDN Academic Alliance. Входит в состав Microsoft HPC Server 2008. Основана на MPICH2, включает дополнительные средства управления заданиями.
Поддерживается спецификация MPI-2.
"Opensource" реализация MPI-2, разрабатываемая консорциумом представителей академических, научных и индустриальных кругов.
Состав библиотеки:
Оптимизирована для архитектуры Intel ®
Библиотека готовых компонентов для разработки мультимедийных приложений для вычислительных платформ Intel.
Включает модули для обработки сигналов и выполнения векторных и матричных операций, функции сжатия и распаковки речи и статических/динамических изображений, средства шифрования и обработки аудиоданных и текстовых строк и другое.
Intel IPP обеспечивает прозрачное использование расширенных возможностей процессоров Intel, таких, как технология MMX, наборы команд Streaming SIMD Extensions. Библиотека Intel IPP оптимизирована для работы с процессорами компании Intel.
Библиотека Intel IPP поддерживает 32- и 64-битные операционные системы Windows и Linux, включая встраиваемые версии, такие как Windows Mobile.
Библиотека готовых шаблонов C++, упрощающая разработку многопоточных приложений, обеспечивая более высокий уровень абстракции при распараллеливании.
Многоплатформенность: Linux, Microsoft Windows, Mac OS.
Если код написан на языке C++, лучше Intel® TBB. Intel® TBB хорошо подходит, если код в значительной степени объектно-ориентирован и в нем широко используются шаблоны C++ и определяемые пользователем типы.
Если код написан на C или Fortran, лучше выбрать OpenMP, поскольку этот API лучше соответствует стилю структурного программирования.
При использовании C++, если в программе преобладают операции обработки массивов, OpenMP может оказаться удобнее с точки зрения сложности программирования.
Использование возможностей автоматической оптимизации компилятора может дать значительный выигрыш в производительности. Компиляторы Intel предоставляют большие возможности автоматической оптимизации приложений.
Intel ® VtuneTM Amplifier XE – программный инструмент, позволяющий выявить и локализовать проблемы производительности ПО.
Возможности:
Advisor
Выявление "кандидатов" на распараллеливание
Composer
Inspector
Выявление ошибок использования памяти (утечки памяти, переполнение буфера, указатели) и многопоточности (блокировки, гонки за данными и т.д.) на основе анализа выполнения программы.
Amplifier
Анализ производительности, профилирование и оптимизация параллельных приложений
Intel® CilkTM Plus
Средство разработки приложений для вычислительных систем с общей памятью.
OpenCL
Средство разработки приложений, использующих в качестве ускорителей вычислений графические процессоры общего назначения.
и другие
Презентацию к данной лекции Вы можете скачать здесь.
Фоннеймановская архитектура последовательная, скалярная. В "классическом" фоннеймановском компьютере параллелизм отсутствует на всех уровнях.
Традиционная последовательная модель программирования, ориентированная на SISD архитектуры (по Флинну). Языки последовательного программирования.
Пользователю нужна производительность. Увеличение производительности позволяет:
Многие расширения фоннеймановской архитектуры используют параллелизм на разном уровне
Вычислительные системы с распределённой памятью (кластеры, MIMD по классификации Флинна) от небольших кластеров до суперкомпьютеров, занимающих первые позиции в рейтинге Top 500 Supercomputers.
Кластер - группа вычислительных узлов, объединённых высокоскоростной коммуникационной подсистемой и представляющая с точки зрения пользователя единый аппаратный ресурс.
Системные вызовы операционной системы (UNIX/Linux)
IPC (InterProcess Communications)
Клиент
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include "mesg.h"
main()
{
message message;
key_t key;
int msgid, length, n;
if ((key = ftok("server", 'A')) < 0){
printf("Невозможно получить ключ\n"); exit(1); }
message.mtype=1L;
if ((msgid = msgget(key, PERM | IPC_CREAT)) < 0){
printf("Невозможно создать очередь\n"); exit(1); }
n = msgrcv(msgid, message, sizeof(message), message.mtype, 0);
if (n > 0) {
if (write(1, message.buff, n) != n) {
printf("Ошибка вывода\n"); exit(1); }
}
else { printf("Ошибка чтения сообщения\n"); exit(1); }
exit(0);
Сервер
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include "mesg.h"
main()
{
Message message;
key_t key;
int msgid, length;
message.mtype = 1L;
if ((key = ftok("server", 'A')) < 0){
printf("Невозможно получить ключ\n"); exit(1); }
if ((msgid = msgget(key, 0)) < 0){
printf("Невозможно получить доступ к очереди\n"); exit(1); }
if ((length = sprintf(message.buff, "Здравствуй, Мир!\n")) < 0){
printf("Ошибка копирования в буфер\n"); exit(1); }
if (msgsnd(msgid, (void *) message, length, 0) !=0){
printf("Ошибка записи сообщения в очередь\n");
exit(1); }
if (msgctl(msgid, IPC_RMID, 0) < 0){
printf("Ошибка удаления очереди\n"); exit(1); }
exit(0);
Стандарт POSIX реализации потоков (нитей) выполнения, определяющий API для создания и управления ими.
POSIX.1c, Расширения потоков (IEEE Std 1003.1c-1995)
Реализации стандарта содержат:
#include <stdio.h>
#include "gettimeofday.h"
#include <pthread.h>
#define gNumThreads 1
#define N 100000000
double a[N + 1], b[N + 1], sum;
int i, j;
double start, stop;
const int gNumSteps = N;
double gVectorSum = 0;
void *threadFunction(void *arg)
{
int i;
int myNum = *((int *)arg);
double partialSum = 0; // локально по отношению к каждому потоку
for ( i = myNum; i < gNumSteps; i += gNumThreads ) // каждый gNumThreads-й шаг
{
partialSum += a[i] * b[i]; // параллельное вычисление сумм каждым потоком
}
gVectorSum += partialSum; // сложения частных сумм и получение результата
return 0;
}
int main()
{
pthread_t tid[gNumThreads];
int tNum[gNumThreads], i, j;
// инициализация вектора
for (j = 0; j < N; j++)
{
a[j] = 1.031; b[j] = 1.057;
}
printf("Computed value of vector sum: ");
start = wcgettimeofday();
for (i = 0; i < gNumThreads; i++)
{
tNum[i] = i;
pthread_create(tid[i], NULL, threadFunction, tNum[i]);
}
for (i = 0; i < gNumThreads; i++)
pthread_join(tid[i], NULL);
stop = wcgettimeofday();
printf("sum = %f\n", gVectorSum);
printf("time = %g\n", stop - start);
В Microsoft Windows имеется возможность разработки многопоточных приложений на C++ с помощью "стандартных" системных средств – прикладного программного интерфейса операционной системы Windows.
#include <windows.h>
#include <stdio.h>
#define N 100000000
double a[N + 1], b[N + 1], sum;
int i, j;
double start, stop;
const int gNumSteps = N;
const int gNumThreads = 1;
double gVectorSum = 0;
CRITICAL_SECTION gCS;
DWORD WINAPI threadFunction(LPVOID pArg)
{
int i;
int myNum = *((int *)pArg);
double partialSum = 0; // локально по отношению к каждому потоку
for(i=myNum*(gNumSteps/gNumThreads); i<(myNum+1)*(gNumSteps/gNumThreads); i++)
// используется каждый gNumThreads-й шаг
{
partialSum += a[i] * b[i]; // вычисление частных сумм каждым потоком
}
EnterCriticalSection(gCS);
gVectorSum += partialSum; // сложение частного результата с глобальным
LeaveCriticalSection(gCS);
return 0;
}
int main()
{
HANDLE threadHandles[gNumThreads];
int tNum[gNumThreads], i, j;
for (j = 0; j < N; j++)
{
a[j] = 1.031; b[j] = 1.057;
}
printf("Computed value of dot product: ");
InitializeCriticalSection(gCS);
for ( i = 0; i < gNumThreads; ++i )
{
tNum[i] = i;
threadHandles[i] = CreateThread( NULL, // атрибуты безопасности
0, // размер стека
threadFunction, // функция потока
(LPVOID)tNum[i],// данные для функции потока
0, // режим запуска потока
NULL); // возвращаемый идентификатор потока
}
WaitForMultipleObjects(gNumThreads, threadHandles, TRUE, INFINITE);
DeleteCriticalSection(gCS);
printf("sum = %f\n", gVectorSum);
OpenMP
Стандарт программного интерфейса приложений для параллельных систем с общей памятью. Поддерживает языки C, C++, Fortran.
Первая версия появилась в 1997 (Fortran) / 1998 (C/C++) годах. Последняя версия OpenMP 3.0 (2008 год). Готовится версия OpenMP 4.0 (2012 год). Разработкой стандарта занимается OpenMP ARB (Architecture Board).
#include <windows.h>
#include <stdio.h>
#define N 100000000
double a[N + 1], b[N + 1];
int i;
double start, stop;
double gDotProduct = 0;
int main()
{
// инициализация векторов
for (i = 0; i < N; i++)
{
a[i] = 1.034; b[i] = 1.057;
}
printf("Computed value of vector sum: ");
start = omp_get_wtime();
#pragma omp parallel for reduction(+:gDotProduct)
for ( i = 0; i < N; i++ )
{
gDotProduct += a[i] * b[i];
}
stop = omp_get_wtime();
printf("sum = %f\n", gDotProduct);
printf("time = %g\n", stop - start);
Message Passing Interface (MPI)
Интерфейс Передачи Сообщений, спецификация разработанная в 1993—1994 годах группой MPI Forum, в состав которой входили представители академических и промышленных кругов. Она стала первым стандартом систем передачи сообщений.
#include <mpi.h>
#include <stdio.h>
int main (int argc, char *argv[])
{
int ProcNum, ProcRank, tmp;
MPI_Status status;
MPI_Init (argc, argv);
MPI_Comm_size (MPI_COMM_WORLD, ProcNum);
MPI_Comm_rank (MPI_COMM_WORLD, ProcRank);
if(ProcRank == 0){
printf("Hello world from process %i \n", ProcRank);
for(int i = 1; i < ProcNum; i++){
MPI_Recv(tmp,1,MPI_INT,MPI_ANY_SOURCE,0,MPI_COMM_WORLD, status);
printf("Hello world from process %i \n", tmp);
}
}
else
{
MPI_Send(ProcRank,1,MPI_INT,0,0,MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
MPI CHameleon (MPICH)
Свободно распространяемая реализация MPI. Пакет доступен в исходных кодах, поэтому допускает гибкую настройку. Поддерживается работа в различных версиях ОС UNIX, Mac OS и в последних версиях Microsoft Windows.
MPICH соответствует спецификации MPI-2. Поддерживаются различные коммуникационные среды (в т.ч. 10 Gigabit Ethernet, InfiniBand, Myrinet, Quadrics). Пока не поддерживаются системы, гетерогенные по форматам хранения данных. Имеется версия с поддержкой пакета Globus.
LAM (Local Area Multicomputer) MPI
"Opensource" реализация MPI, соответствующая спецификации MPI-1 и, в значительной мере, спецификации MPI-2. LAM поддерживает гетерогенные конфигурации, поддерживает пакет Globus и удовлетворяет IMPI (Interoperable MPI). Поддерживаются различные коммуникационные системы (в т.ч. Myrinet).
IMPI – попытка создания стандарта, обеспечивающего интероперабельность различных реализаций MPI (http://impi.nist.gov/). В настоящее время IMPI поддерживается такими реализациями, как:
LAM может работать на метакластерных системах.
Intel ® MPI
Входит в состав Intel® Cluster Toolkit. Коммерческая реализация MPI, оптимизированная для архитектуры Intel. Построена на основе MPICH.
Сайт в Интернете:
http://www.intel.com
Входит в состав Compute Cluster Pack SDK.
Ориентирована на работу в среде ОС Microsoft Windows и доступна, в том числе, по лицензии MSDN Academic Alliance. Входит в состав Microsoft HPC Server 2008. Основана на MPICH2, включает дополнительные средства управления заданиями.
Поддерживается спецификация MPI-2.
"Opensource" реализация MPI-2, разрабатываемая консорциумом представителей академических, научных и индустриальных кругов.
Состав библиотеки:
Оптимизирована для архитектуры Intel ®
Библиотека готовых компонентов для разработки мультимедийных приложений для вычислительных платформ Intel.
Включает модули для обработки сигналов и выполнения векторных и матричных операций, функции сжатия и распаковки речи и статических/динамических изображений, средства шифрования и обработки аудиоданных и текстовых строк и другое.
Intel IPP обеспечивает прозрачное использование расширенных возможностей процессоров Intel, таких, как технология MMX, наборы команд Streaming SIMD Extensions. Библиотека Intel IPP оптимизирована для работы с процессорами компании Intel.
Библиотека Intel IPP поддерживает 32- и 64-битные операционные системы Windows и Linux, включая встраиваемые версии, такие как Windows Mobile.
Библиотека готовых шаблонов C++, упрощающая разработку многопоточных приложений, обеспечивая более высокий уровень абстракции при распараллеливании.
Многоплатформенность: Linux, Microsoft Windows, Mac OS.
Если код написан на языке C++, лучше Intel® TBB. Intel® TBB хорошо подходит, если код в значительной степени объектно-ориентирован и в нем широко используются шаблоны C++ и определяемые пользователем типы.
Если код написан на C или Fortran, лучше выбрать OpenMP, поскольку этот API лучше соответствует стилю структурного программирования.
При использовании C++, если в программе преобладают операции обработки массивов, OpenMP может оказаться удобнее с точки зрения сложности программирования.
Использование возможностей автоматической оптимизации компилятора может дать значительный выигрыш в производительности. Компиляторы Intel предоставляют большие возможности автоматической оптимизации приложений.
Intel ® VtuneTM Amplifier XE – программный инструмент, позволяющий выявить и локализовать проблемы производительности ПО.
Возможности:
Advisor
Выявление "кандидатов" на распараллеливание
Composer
Inspector
Выявление ошибок использования памяти (утечки памяти, переполнение буфера, указатели) и многопоточности (блокировки, гонки за данными и т.д.) на основе анализа выполнения программы.
Amplifier
Анализ производительности, профилирование и оптимизация параллельных приложений
Intel® CilkTM Plus
Средство разработки приложений для вычислительных систем с общей памятью.
OpenCL
Средство разработки приложений, использующих в качестве ускорителей вычислений графические процессоры общего назначения.
и другие
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.