Введение в программирование на кластерах

Обзор средств разработки высокопроизводительных приложений

Разбить на страницы
Показывать лекцию целиком

Презентацию к данной лекции Вы можете скачать здесь.

8 способов достижения высокой производительности:

  • Выбор вычислительной системы
  • Выбор модели (если задача решается методом математического моделирования
  • Использование эффективных вычислительных алгоритмов
  • Использование приёмов написания оптимального кода
  • Использование оптимизированных библиотек
  • Оптимизация при компиляции
  • Оптимизация готовой программы на основе анализа её выполнения
  • Параллельное программирование
  • параллелизм данных (OpenMP, Cilk Plus)
  • параллелизм задач (MPI)
  • Эволюция вычислительных технологий

    От фоннеймановской архитектуры к архитектуре параллельной

  • Фоннеймановская архитектура
  • Как эволюционировала архитектура вычислительных систем
  • Эволюция программных технологий
  • Фоннеймановская архитектура последовательная, скалярная. В "классическом" фоннеймановском компьютере параллелизм отсутствует на всех уровнях.

    Традиционная последовательная модель программирования, ориентированная на SISD архитектуры (по Флинну). Языки последовательного программирования.

    Пользователю нужна производительность. Увеличение производительности позволяет:

  • решать новые, более сложные задачи;
  • решать старые задачи, но быстрее;
  • решать старые задачи, но с более высокой точностью.
  • Многие расширения фоннеймановской архитектуры используют параллелизм на разном уровне

    Вычислительные системы с распределённой памятью (кластеры, MIMD по классификации Флинна) от небольших кластеров до суперкомпьютеров, занимающих первые позиции в рейтинге Top 500 Supercomputers.

    Кластер - группа вычислительных узлов, объединённых высокоскоростной коммуникационной подсистемой и представляющая с точки зрения пользователя единый аппаратный ресурс.

    Программные инструменты разработки высокопроизводительных приложений

    Низкоуровневые средства

    Системные вызовы операционной системы (UNIX/Linux)

    IPC (InterProcess Communications)

  • именованные каналы;
  • общая память;
  • сообщения;
  • семафоры.
  • IPC. Сообщения. Пример

    Клиент

    #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 Threads

    Стандарт POSIX реализации потоков (нитей) выполнения, определяющий API для создания и управления ими.

    POSIX.1c, Расширения потоков (IEEE Std 1003.1c-1995)

  • Создание, управление и завершение выполнения потоков
  • Планировщик потоков
  • Синхронизация потоков
  • Обработка сигналов
  • Реализации стандарта содержат:

  • функции управления потоками
  • функции синхронизации потоков
  • POSIX Threads. Пример

    #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); 
    
    
    

    Windows API

    В Microsoft Windows имеется возможность разработки многопоточных приложений на C++ с помощью "стандартных" системных средств – прикладного программного интерфейса операционной системы Windows.

    Windows API. Пример

    #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);   
    
    

    Open Multi-Processing (OpenMP)

    OpenMP

    Стандарт программного интерфейса приложений для параллельных систем с общей памятью. Поддерживает языки C, C++, Fortran.

    Первая версия появилась в 1997 (Fortran) / 1998 (C/C++) годах. Последняя версия OpenMP 3.0 (2008 год). Готовится версия OpenMP 4.0 (2012 год). Разработкой стандарта занимается OpenMP ARB (Architecture Board).

    OpenMP. Пример

    #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)

    Message Passing Interface (MPI)

    Интерфейс Передачи Сообщений, спецификация разработанная в 1993—1994 годах группой MPI Forum, в состав которой входили представители академических и промышленных кругов. Она стала первым стандартом систем передачи сообщений.

    MPI. Пример

    #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

    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/MPI
  • MPI/Pro
  • Hewlett-Packard MPI (от версии 1.7)
  • GridMPI
  • LAM может работать на метакластерных системах.

    Intel ® MPI

    Входит в состав Intel® Cluster Toolkit. Коммерческая реализация MPI, оптимизированная для архитектуры Intel. Построена на основе MPICH.

    Сайт в Интернете:

    http://www.intel.com

    Microsoft MPI

    Входит в состав Compute Cluster Pack SDK.

    Ориентирована на работу в среде ОС Microsoft Windows и доступна, в том числе, по лицензии MSDN Academic Alliance. Входит в состав Microsoft HPC Server 2008. Основана на MPICH2, включает дополнительные средства управления заданиями.

    Поддерживается спецификация MPI-2.

    OpenMPI

    "Opensource" реализация MPI-2, разрабатываемая консорциумом представителей академических, научных и индустриальных кругов.

  • Полное соответствие спецификации MPI-2.
  • Поддержка различных ОС.
  • Поддержка различных коммуникационных сред.
  • Инструменты Intel

    Библиотека Intel ® Math Kernel Library (MKL)

    Состав библиотеки:

  • BLAS (3 уровня + расширение – уровень 1 для разреженных векторов)
  • LAPACK – вычислительная алгебра, в том числе решение спектральных задач
  • DFT (дискретное преобразование Фурье) – в том числе многомерное. Многопоточная реализация
  • Vector Mathematical Library – математические функции
  • Vector Statistical Library – набор векторизованных генераторов случайных чисел
  • Солверы, предобуславливатели, средства поддержки численного решения дифференциальных уравнений и др.
  • Оптимизирована для архитектуры Intel ®

    Intel ® Integrated Performance Primitives (IPP)

    Библиотека готовых компонентов для разработки мультимедийных приложений для вычислительных платформ Intel.

    Включает модули для обработки сигналов и выполнения векторных и матричных операций, функции сжатия и распаковки речи и статических/динамических изображений, средства шифрования и обработки аудиоданных и текстовых строк и другое.

    Intel IPP обеспечивает прозрачное использование расширенных возможностей процессоров Intel, таких, как технология MMX, наборы команд Streaming SIMD Extensions. Библиотека Intel IPP оптимизирована для работы с процессорами компании Intel.

    Библиотека Intel IPP поддерживает 32- и 64-битные операционные системы Windows и Linux, включая встраиваемые версии, такие как Windows Mobile.

    Intel ® Threading Building Blocks (TBB)

    Библиотека готовых шаблонов C++, упрощающая разработку многопоточных приложений, обеспечивая более высокий уровень абстракции при распараллеливании.

    Многоплатформенность: Linux, Microsoft Windows, Mac OS.

    Если код написан на языке C++, лучше Intel® TBB. Intel® TBB хорошо подходит, если код в значительной степени объектно-ориентирован и в нем широко используются шаблоны C++ и определяемые пользователем типы.

    Если код написан на C или Fortran, лучше выбрать OpenMP, поскольку этот API лучше соответствует стилю структурного программирования.

    При использовании C++, если в программе преобладают операции обработки массивов, OpenMP может оказаться удобнее с точки зрения сложности программирования.

    Компиляторы

    Использование возможностей автоматической оптимизации компилятора может дать значительный выигрыш в производительности. Компиляторы Intel предоставляют большие возможности автоматической оптимизации приложений.

    Intel® VtuneTM Amplifier XE

    Intel ® VtuneTM Amplifier XE – программный инструмент, позволяющий выявить и локализовать проблемы производительности ПО.

    Возможности:

  • сбор различных показателей производительности;
  • отображение данных в различных режимах (system-wide, исходный код и процессорные инструкции);
  • выявление потенциальных проблем производительности и создание рекомендаций по их разрешению.
  • Intel® Cluster Studio XE

  • Intel® Composer XE – компиляторы C/C++ и Fortran.
  • Intel® Trace Analyzer and Collector – анализ параллельных приложений.
  • Intel® MPI Library – реализация MPI.
  • Intel® MPI Benchmarks – тесты производительности MPI.
  • Intel® VTuneTM Amplifier XE – анализатор производительности.
  • Intel® Inspector XE – инструмент поиска ошибок работы с памятью, реализации многопоточности для приложений C/C++, Fortran, C#.NET.
  • Intel® Parallel Studio

    Advisor

    Выявление "кандидатов" на распараллеливание

    Composer

  • Intel® C++ Compiler, Intel® Threading Building
  • Blocks, Intel® Integrated Performance Primitives,
  • and Intel® Parallel Debugger Extension.
  • Inspector

    Выявление ошибок использования памяти (утечки памяти, переполнение буфера, указатели) и многопоточности (блокировки, гонки за данными и т.д.) на основе анализа выполнения программы.

    Amplifier

    Анализ производительности, профилирование и оптимизация параллельных приложений

    Другие инструменты

    Intel® CilkTM Plus

    Средство разработки приложений для вычислительных систем с общей памятью.

    OpenCL

    Средство разработки приложений, использующих в качестве ускорителей вычислений графические процессоры общего назначения.

    и другие

    Страницы:

    Презентацию к данной лекции Вы можете скачать здесь.

    8 способов достижения высокой производительности:

  • Выбор вычислительной системы
  • Выбор модели (если задача решается методом математического моделирования
  • Использование эффективных вычислительных алгоритмов
  • Использование приёмов написания оптимального кода
  • Использование оптимизированных библиотек
  • Оптимизация при компиляции
  • Оптимизация готовой программы на основе анализа её выполнения
  • Параллельное программирование
  • параллелизм данных (OpenMP, Cilk Plus)
  • параллелизм задач (MPI)
  • Эволюция вычислительных технологий

    От фоннеймановской архитектуры к архитектуре параллельной

  • Фоннеймановская архитектура
  • Как эволюционировала архитектура вычислительных систем
  • Эволюция программных технологий
  • Фоннеймановская архитектура последовательная, скалярная. В "классическом" фоннеймановском компьютере параллелизм отсутствует на всех уровнях.

    Традиционная последовательная модель программирования, ориентированная на SISD архитектуры (по Флинну). Языки последовательного программирования.

    Пользователю нужна производительность. Увеличение производительности позволяет:

  • решать новые, более сложные задачи;
  • решать старые задачи, но быстрее;
  • решать старые задачи, но с более высокой точностью.
  • Многие расширения фоннеймановской архитектуры используют параллелизм на разном уровне

    Вычислительные системы с распределённой памятью (кластеры, MIMD по классификации Флинна) от небольших кластеров до суперкомпьютеров, занимающих первые позиции в рейтинге Top 500 Supercomputers.

    Кластер - группа вычислительных узлов, объединённых высокоскоростной коммуникационной подсистемой и представляющая с точки зрения пользователя единый аппаратный ресурс.

    Программные инструменты разработки высокопроизводительных приложений

    Низкоуровневые средства

    Системные вызовы операционной системы (UNIX/Linux)

    IPC (InterProcess Communications)

  • именованные каналы;
  • общая память;
  • сообщения;
  • семафоры.
  • IPC. Сообщения. Пример

    Клиент

    #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 Threads

    Стандарт POSIX реализации потоков (нитей) выполнения, определяющий API для создания и управления ими.

    POSIX.1c, Расширения потоков (IEEE Std 1003.1c-1995)

  • Создание, управление и завершение выполнения потоков
  • Планировщик потоков
  • Синхронизация потоков
  • Обработка сигналов
  • Реализации стандарта содержат:

  • функции управления потоками
  • функции синхронизации потоков
  • POSIX Threads. Пример

    #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); 
    
    
    

    Windows API

    В Microsoft Windows имеется возможность разработки многопоточных приложений на C++ с помощью "стандартных" системных средств – прикладного программного интерфейса операционной системы Windows.

    Windows API. Пример

    #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);   
    
    

    Open Multi-Processing (OpenMP)

    OpenMP

    Стандарт программного интерфейса приложений для параллельных систем с общей памятью. Поддерживает языки C, C++, Fortran.

    Первая версия появилась в 1997 (Fortran) / 1998 (C/C++) годах. Последняя версия OpenMP 3.0 (2008 год). Готовится версия OpenMP 4.0 (2012 год). Разработкой стандарта занимается OpenMP ARB (Architecture Board).

    OpenMP. Пример

    #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)

    Message Passing Interface (MPI)

    Интерфейс Передачи Сообщений, спецификация разработанная в 1993—1994 годах группой MPI Forum, в состав которой входили представители академических и промышленных кругов. Она стала первым стандартом систем передачи сообщений.

    MPI. Пример

    #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

    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/MPI
  • MPI/Pro
  • Hewlett-Packard MPI (от версии 1.7)
  • GridMPI
  • LAM может работать на метакластерных системах.

    Intel ® MPI

    Входит в состав Intel® Cluster Toolkit. Коммерческая реализация MPI, оптимизированная для архитектуры Intel. Построена на основе MPICH.

    Сайт в Интернете:

    http://www.intel.com

    Microsoft MPI

    Входит в состав Compute Cluster Pack SDK.

    Ориентирована на работу в среде ОС Microsoft Windows и доступна, в том числе, по лицензии MSDN Academic Alliance. Входит в состав Microsoft HPC Server 2008. Основана на MPICH2, включает дополнительные средства управления заданиями.

    Поддерживается спецификация MPI-2.

    OpenMPI

    "Opensource" реализация MPI-2, разрабатываемая консорциумом представителей академических, научных и индустриальных кругов.

  • Полное соответствие спецификации MPI-2.
  • Поддержка различных ОС.
  • Поддержка различных коммуникационных сред.
  • Инструменты Intel

    Библиотека Intel ® Math Kernel Library (MKL)

    Состав библиотеки:

  • BLAS (3 уровня + расширение – уровень 1 для разреженных векторов)
  • LAPACK – вычислительная алгебра, в том числе решение спектральных задач
  • DFT (дискретное преобразование Фурье) – в том числе многомерное. Многопоточная реализация
  • Vector Mathematical Library – математические функции
  • Vector Statistical Library – набор векторизованных генераторов случайных чисел
  • Солверы, предобуславливатели, средства поддержки численного решения дифференциальных уравнений и др.
  • Оптимизирована для архитектуры Intel ®

    Intel ® Integrated Performance Primitives (IPP)

    Библиотека готовых компонентов для разработки мультимедийных приложений для вычислительных платформ Intel.

    Включает модули для обработки сигналов и выполнения векторных и матричных операций, функции сжатия и распаковки речи и статических/динамических изображений, средства шифрования и обработки аудиоданных и текстовых строк и другое.

    Intel IPP обеспечивает прозрачное использование расширенных возможностей процессоров Intel, таких, как технология MMX, наборы команд Streaming SIMD Extensions. Библиотека Intel IPP оптимизирована для работы с процессорами компании Intel.

    Библиотека Intel IPP поддерживает 32- и 64-битные операционные системы Windows и Linux, включая встраиваемые версии, такие как Windows Mobile.

    Intel ® Threading Building Blocks (TBB)

    Библиотека готовых шаблонов C++, упрощающая разработку многопоточных приложений, обеспечивая более высокий уровень абстракции при распараллеливании.

    Многоплатформенность: Linux, Microsoft Windows, Mac OS.

    Если код написан на языке C++, лучше Intel® TBB. Intel® TBB хорошо подходит, если код в значительной степени объектно-ориентирован и в нем широко используются шаблоны C++ и определяемые пользователем типы.

    Если код написан на C или Fortran, лучше выбрать OpenMP, поскольку этот API лучше соответствует стилю структурного программирования.

    При использовании C++, если в программе преобладают операции обработки массивов, OpenMP может оказаться удобнее с точки зрения сложности программирования.

    Компиляторы

    Использование возможностей автоматической оптимизации компилятора может дать значительный выигрыш в производительности. Компиляторы Intel предоставляют большие возможности автоматической оптимизации приложений.

    Intel® VtuneTM Amplifier XE

    Intel ® VtuneTM Amplifier XE – программный инструмент, позволяющий выявить и локализовать проблемы производительности ПО.

    Возможности:

  • сбор различных показателей производительности;
  • отображение данных в различных режимах (system-wide, исходный код и процессорные инструкции);
  • выявление потенциальных проблем производительности и создание рекомендаций по их разрешению.
  • Intel® Cluster Studio XE

  • Intel® Composer XE – компиляторы C/C++ и Fortran.
  • Intel® Trace Analyzer and Collector – анализ параллельных приложений.
  • Intel® MPI Library – реализация MPI.
  • Intel® MPI Benchmarks – тесты производительности MPI.
  • Intel® VTuneTM Amplifier XE – анализатор производительности.
  • Intel® Inspector XE – инструмент поиска ошибок работы с памятью, реализации многопоточности для приложений C/C++, Fortran, C#.NET.
  • Intel® Parallel Studio

    Advisor

    Выявление "кандидатов" на распараллеливание

    Composer

  • Intel® C++ Compiler, Intel® Threading Building
  • Blocks, Intel® Integrated Performance Primitives,
  • and Intel® Parallel Debugger Extension.
  • Inspector

    Выявление ошибок использования памяти (утечки памяти, переполнение буфера, указатели) и многопоточности (блокировки, гонки за данными и т.д.) на основе анализа выполнения программы.

    Amplifier

    Анализ производительности, профилирование и оптимизация параллельных приложений

    Другие инструменты

    Intel® CilkTM Plus

    Средство разработки приложений для вычислительных систем с общей памятью.

    OpenCL

    Средство разработки приложений, использующих в качестве ускорителей вычислений графические процессоры общего назначения.

    и другие

    Вернуться к учебному плану