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

Начнем рассмотрение средства взаимодействия в MPI с так называемых точечных обменов. Это название происходит от английского “point-to-point communications”, которое означает, что у взаимодействия есть две точки: процесс-отправитель и процесс-получатель сообщения. Точечные, так же как и обмены других типов, всегда производятся в пределах одного коммуникатора, который указывается в качестве параметра в вызовах функций обмена. Ранги процессов, принимающих участие в обменах, вычисляются по отношению к указанному коммуникатору.

Связь "точка-точка" это самый простой тип связи между задачами: одна ветвь вызывает функцию передачи данных, а другая - функцию приема. В MPI это выглядит, например, так:

Задача 1 передает:

int buf[10];

MPI_Send( buf, 5, MPI_INT, 1, 0, MPI_COMM_WORLD );

Задача 2 принимает:

int buf[10];

MPI_Status status;

MPI_Recv( buf, 10, MPI_INT, 0, 0, MPI_COMM_WORLD, &status );

Аргументы функций:

Адрес буфера, из которого в задаче 1 берутся, а в задаче 2 помещаются данные. Помните, что наборы данных у каждой задачи свои, поэтому, например, используя одно и то же имя массива в нескольких задачах, Вы указываете не одну и ту же область памяти, а разные, никак друг с другом не связанные.

Размер буфера. Задается не в байтах, а в количестве ячеек. Для MPI_Send указывает, сколько ячеек требуется передать (в примере передаются 5 чисел). В MPI_Recv означает максимальную емкость приемного буфера. Если фактическая длина пришедшего сообщения меньше - последние ячейки буфера останутся нетронутыми, если больше - произойдет ошибка времени выполнения.

Тип ячейки буфера. MPI_Send и MPI_Recv оперируют массивами однотипных данных. Для описания базовых типов Си в MPI определены константы MPI_INT, MPI_CHAR, MPI_DOUBLE и так далее, имеющие тип MPI_Datatype. Их названия образуются префиксом "MPI_" и именем соответствующего типа (int, char, double, ...), записанным заглавными буквами. Пользователь может "регистрировать" в MPI свои собственные типы данных, например, структуры, после чего MPI сможет обрабатывать их наравне с базовыми. Процесс регистрации описывается в главе "Типы данных".

Номер задачи, с которой происходит обмен данными. Все задачи внутри созданной MPI группы автоматически нумеруются от 0 до (размер группы-1). В примере задача 0 передает задаче 1, задача 1 принимает от задачи 0.

Идентификатор сообщения. Это целое число от 0 до 32767, которое пользователь выбирает сам. Оно служит той же цели, что и, например, расширение файла - задача-приемник:

по идентификатору определяет смысл принятой информации ;

сообщения, пришедшие в неизвестном порядке, может извлекать из общего входного потока в нужном алгоритму порядке. Хорошим тоном является обозначение идентификаторов символьными именами посредством операторов "#define" или "const int".

Описатель области связи (коммуникатор). Обязан быть одинаковым для MPI_Send и MPI_Recv.

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

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