Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_ekzamen_Chernysheva.docx
Скачиваний:
7
Добавлен:
01.05.2025
Размер:
648.58 Кб
Скачать
  1. Функции работы с коммуникатором: mpi_Comm_size(), mpi_Comm_rank().

Функция определения общего числа процессов

int MPI_Comm_size(MPI_Comm comm, int *size);

MPI_Comm comm - идентификатор коммуникатора группы

int *size - адрес переменной целого типа, в которую будет записан размер группы

Процесс, обратившийся к данной функции по адресу size запишет размер группы с коммуникатором comm. Функция возвращает код ошибки или 0 в случае успешного завершения.

Функция определения уникального номера процесса

int MPI_Comm_rank(MPI_comm comm, int *rank);

MPI_comm comm - идентификатор коммуникатора группы

int *rank - указатель на переменную целого типа, в которую будет сохранен уникальный номер процесса.

Процесс, обратившийся к данной функции в переменную rank запишет свой собственный уникальный номер в группе с коммуникатором comm. Функция возвращает код ошибки или в случае успешного завершения.

Пример 1

Каждый процесс должен записать в свой файл свой номер и общее число процессов

#include <stdio.h> #include <mpi.h>

int main(int argc, char**argv)

{ int rank, size; if (MPI_Init(&argc, &argv)) return 1; if (MPI_Comm_size(MPI_COMM_WORLD, &size)){ MPI_Finalize(); return 2; } if (MPI_Comm_rank(MPI_COMM_WORLD, &rank)){ MPI_Finalize(); return 3; } char name[10]; sprintf(name, “rank%d.dat”, rank); FILE *f; f = fopen(name, “w”); fprintf(f, “size=%d rank=%d\n”, size, rank); fclose(f); MPI_Finalize(); return 0; }

  1. Функции коллективного взаимодействия процессов: mpi_Bcast(), mpi_Barrier(), mpi_Reduce(),mpi_Allreduce(),(), mpi_Scan(),. Коллективные операции.

Функция широковещательного обмена

int MPI_Bcast(void *buf, int count, MPI_Datatype type, int root, MPI_Comm comm);

void *buf - указатель на переменную или массив откуда будет считываться/куда будет записано сообщение

int count - количество элементов в передаваемом/принимаемом сообщении

MPI_Datatype type - тип элементов в передаваемом/принимаемом сообщении в терминологии MPI

int root - идентификатор процесса, который будет передавать сообщение

MPI_Comm comm - идентификатор коммуникатора группы

Функция указывается для всех процессов коммуникатора. Процесс, обратившийся к данной функции, сравнивает свой номер с параметром root, если root=rank, то этот процесс передает сообщение всем остальным процессам и себе тоже. Все остальные процессы, номер которых не совпал с root, принимают сообщение.

Функция синхронизации

int MPI_Barrier(MPI_Comm comm);

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

Функция выполнения глобальной операции

int MPI_Reduse(void *buf1, void *buf2, int count, MPI_Datatype type, MPI_Op op, int root,

MPI_Comm comm);

void *buf1 - адрес переменной, где хранится аргумент глобальной функции

void *buf2 - адрес переменной, где будет храниться результат действия глобальной функции

int count - количество аргументов на одном процессе

MPI_Datatype type - тип аргументов и результата в терминологии MPI

MPI_Op op - идентификатор глобальной операции

int root - идентификатор процесса, на котором будет записан результат глобальной операции

MPI_Comm comm - идентификатор коммуникатора группы, которой принадлежат процессы

Процесс, обратившийся к данной функции проверят свой rank с параметром root. Если совпадает, то он собирает со всех процессов переменную, находящуюся buf1, выполняет глобальную операцию op и записывает результат по адресу buf2. Собирает со всех и у себя тоже. Если идентификатор не совпадает с root, то процесс передает переменную, находящуюся по адресу buf1, количества count и типа type.

Если результат нужно сохранить на всех процессах, то пользуются функцией:

int MPI_Allreduse(void *, void *, int, MPI_Datatype,MPI_Op,MPI_Comm);

Обе функции возвращают 0 в результате успешного завершения.

Функция сбора данных в один массив

int MPI_Gather(void *bufr, int rcount, MPI_Datatype rtype, void *bufw, int wcount, MPI_Datatype wtype, int root, MPI_Comm comm); // r – откуда, w - куда

void *bufr - адрес переменной или массива, которая будет считываться

int rcount - количество принимаемой информации от каждого процесса

MPI_Datatype rtype - тип элементов в принимаемом сообщении

void *bufw - адрес массива, куда будет записана информация

int root - идентификатор где будет сохранен массив

Процесс с номером root получает последовательно от всех процессов и от себя тоже данные, находящиеся по адресу bufr и записывает по адресу bufw. Если необходимо собрать массив на всех процессах, то пользуются функцией:

MPI_Allgather(void*, int*, MPI_Datetype, void*, int*, MPI_Datatype, MPI_Comm);

Функции возвращают 0 в случае успешного завершения.

Функция рассылки частей массива на все процессы

int MPI_Scatter(void *bufr, int rcount, MPI_Datatype rtype, void *bufw, int wcount, MPI_Datatype wtype, int root, MPI_Comm comm);

Процесс root из массива по адресу bufr по rcount элемента типа rtype рассылает последовательно по номеру процесса и себе тоже. Все остальные процессы получают от root данные и записывают по адресу bufw, wcount элементов типа wtype, которые должны совпадать. Все процессы принадлежат группе с коммуникатором comm.

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