Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Answers.docx
Скачиваний:
11
Добавлен:
01.03.2025
Размер:
523 Кб
Скачать
☆
    1. 29. Библиотека mpi. Производные типы данных и передача упакованных данных

      1. Механизмы эффективной пересылки данные разных типов:

  • создание производных типов для использования в коммуникационных операциях вместо предопределенных типов MPI;

  • пересылка упакованных данных (процесс-отправитель упаковывает пересылаемые данные перед их отправкой, а процесс-получатель распаковывает их после получения);

      1. Производные типы данных:

  • Производный тип строится из предопределенных типов MPI и ранее определенных производных типов с помощью специальных функций-конструкторов MPI_Type_contiguous, MPI_Type_vector, MPI_Type_hvector, MPI_Type_indexed, MPI_Type_hindexed, MPI_Type_struct;

  • регистрируются вызовом функции MPI_Type_commit;

  • ненужные типы уничтожаются функцией MPI_Type_free;

  • Предопределенные типы MPI считаются зарегистрированными.

      1. Характеристики типов:

  • Протяженность типа – сколько байт переменная данного типа занимает в памяти (адрес последней ячейки данных - адрес первой ячейки данных + длина последней ячейки данных);

  • int MPI_Type_extent(MPI_Datatype datatype, MPI_Aint *extent);

  • размер типа определяет количество реально передаваемых байт в коммуникационных операциях;

  • Эта величина равна сумме длин всех базовых элементов определяемого типа опрашивается подпрограммой

  • int MPI_Type_size(MPI_Datatype datatype, int *size);

  • int MPI_Type_commit(MPI_Datatype *datatype);

  • int MPI_Type_free(MPI_Datatype *datatype);

  • Функция MPI_Type_free устанавливает описатель типа в состояние MPI_DATATYPE_NULL.

      1. Передача упакованных данных:

int MPI_Pack(void* inbuf, int incount, MPI_Datatype datatype, void *outbuf, int outsize, int *position, MPI_Comm comm);

int MPI_Pack_size(int incount, MPI_Datatype datatype, MPI_Comm comm, int *size);

int MPI_Unpack(void* inbuf, int insize, int *position, void *outbuf, int outcount, MPI_Datatype datatype, MPI_Comm comm).

/* Упаковка данных */

if (myrank == 0) {position = 0;

MPI_Pack(&x, 1, MPI_DOUBLE, buff, 100, &position, MPI_COMM_WORLD);

MPI_Pack(&y, 1, MPI_DOUBLE, buff, 100, &position, MPI_COMM_WORLD);

MPI_Pack(a, 2, MPI_INT, buff, 100, &position, MPI_COMM_WORLD);

}

/* Рассылка упакованного сообщения */

MPI_Bcast(buff, position, MPI_PACKED, 0, MPI_COMM_WORLD);

/* Распаковка сообщения во всех процессах */

if (myrank != 0) {position = 0;

MPI_Unpack(buff, 100, &position, &x, 1, MPI_DOUBLE, MPI_COMM_WORLD);

MPI_Unpack(buff, 100, &position, &y, 1, MPI_DOUBLE, MPI_COMM_WORLD);

MPI_Unpack(buff, 100, &position, a, 2, MPI_INT, MPI_COMM_WORLD);}

  1. Технология OpenMp. Стратегия подхода.

OpenMP - это интерфейс прикладного программирования для создания многопоточных приложений, предназначенных в основном для параллельных вычислительных систем с общей памятью. Разработчики стандарта ARB (Architecture Board).

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

Интерфейс OpenMP служит основой для формирования новой технологии параллельного программирования для систем с общей памятью (shared-memory programming).

Положительные стороны:

  • Поэтапное (инкрементальное) распараллеливание

Можно распараллеливать программы поэтапно, не меняя их структуру

  • Единственность разрабатываемого кода

Нет необходимости поддерживать последовательный и параллельный вариант программы, т.к. директивы игнорируются обычным компилятором

  • Эффективность

Учет и использование возможностей систем с общей памятью

  • Стандартизованность (переносимость), поддержка в наиболее

распространенных языках (C, Fortran) и платформах (Windows, Unix)

Принцип организации параллелизма:

  • Использование потоков (общее адресное пространство)

  • Пульсирующий («вилочный», fork-join) параллелизм

  • При выполнении обычного кода (вне параллельных областей) программа выполняется одним потоком (master thread)

  • При выполнении директивы #parallel происходит создание «команды» (team) потоков для параллельного выполнения вычислений

  • После выхода из области действия директивы #parallel происходит синхронизация, все потоки, кроме master, уничтожаются

  • Продолжается последовательное выполнение кода (до следующей директивы #parallel)

Структура:

  • Набор директив компилятора

  • Библиотека функций

  • Набор переменных окружения

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]