Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие по MPI (реферат).doc
Скачиваний:
58
Добавлен:
28.06.2014
Размер:
124.42 Кб
Скачать

Московский Энергетический Институт

(Технический Университет)

Кафедра Прикладной Математики

Реферат

на тему «Пособие по MPI»

Выполнил: Ясенков Е.М.

Группа: А-13-03

Москва 2007

1. Mpi_Init, mpi_Finalize, “Hello, World” с анализом результата mpi_Init

Функция MPI_Init() применяется для инициализации среды выполнения MPI-программы. Параметрами функции являются количество аргументов в командной строке и адрес указателя на массив символов текста самой командной строки.

Функция MPI_Finalize() применяется для завершения выполнения MPI-программы.

Как результат, можно отметить, что структура параллельной программы, разработанная с использованием MPI, должна иметь следующий вид:

#include "mpi.h"

int main(int argc, char *argv[])

{

// программный код без использования функций MPI

MPI_Init(&argc, &argv);

// программный код с использованием функций MPI

MPI_Finalize();

// программный код без использования функций MPI

return 0;

}

Все функции MPI (кроме MPI_Wtime и MPI_Wtick) возвращают в качестве своего значения код завершения. При успешном выполнении функции возвращаемый код равен MPI_SUCCESS. Другие значения кода завершения свидетельствуют об обнаружении тех или иных ошибочных ситуаций в ходе выполнения функций. Для выяснения типа обнаруженной ошибки используются предопределенные именованные константы, среди которых:

MPI_ERR_BUFFER — неправильный указатель на буфер;

MPI_ERR_TRUNCATE — сообщение превышает размер приемного буфера;

MPI_ERR_COMM — неправильный коммуникатор;

MPI_ERR_RANK — неправильный ранг процесса и др.

Далее следует пример программы “Hello,World” с анализом результатаMPI_Init():

#include "mpi.h"

int main(int argc, char* argv[])

{

int ProcRank, Error;

Error = MPI_Init(&argc, &argv);

MPI_Comm_rank(MPI_COMM_WORLD, &ProcRank);

printf("Hello, World! from process %2d... ", ProcRank);

if (Error == MPI_SUCCESS)

printf("Ошибок нет\n");

else if (Error == MPI_ERR_RANK)

printf("Ошибка - неправильный ранг процесса");

else if (Error == MPI_ERR_UNKNOWN)

printf("Неизвестная ошибка");

MPI_Finalize();

return 0;

}

Результат выполнения программы на 5 процессах:

Hello, World! from process 2... Ошибок нет

Hello, World! from process 3... Ошибок нет

Hello, World! from process 4... Ошибок нет

Hello, World! from process 0... Ошибок нет

Hello, World! from process 1... Ошибок нет

---------------------------------------------------------------------------

2. Mpi_Send, mpi_Recv, анализ структуры mpi_Status

Функция MPI_Sendприменяется для передачи сообщения:

int MPI_Send(void *buf, int count, MPI_Datatype type, int dest, int tag, MPI_Comm comm), где

  • buf — адрес буфера памяти, в котором располагаются данные отправляемого сообщения;

  • count — количество элементов данных в сообщении;

  • type — тип элементов данных пересылаемого сообщения;

  • dest — ранг процесса, которому отправляется сообщение;

  • tag — значение-тег, используемое для идентификации сообщения;

  • comm — коммуникатор, в рамках которого выполняется передача данных.

Функция MPI_Recvприменяется для получения сообщения:

int MPI_Recv(void *buf, int count, MPI_Datatype type, int source, int tag, MPI_Comm comm, MPI_Status *status), где

  • buf, count, type — буфер памяти для приема сообщения, назначение каждого отдельного параметра соответствует описанию в MPI_Send;

  • source — ранг процесса, от которого должен быть выполнен прием сообщения;

  • tag — тег сообщения, которое должно быть принято для процесса;

  • comm — коммуникатор, в рамках которого выполняется передача данных;

  • status – указатель на структуру данных с информацией о результате выполнения операции приема данных.

Структура MPI_Status(взято из файлаmpi.h):

typedef struct MPI_Status {

int count; // необязательное поле - количество элементов данных в сообщении

int cancelled; // необязательное поле

int MPI_SOURCE; // ранг процесса–отправителя принятого сообщения;

int MPI_TAG; // тэг принятого сообщения

int MPI_ERROR; // код ошибки

} MPI_Status;

В следующем примере процесс 0 посылает сообщение из 12 символов процессу 1 и тот также в ответ шлет сообщение процессу 0:

# include "mpi.h"

# include <stdio.h>

int main(int argc, char** argv)

{

int numtasks, rank, rc, dest, source, tag = 1;

char* outmsg1 = "Hello first\0";

char* outmsg2 = "Hello zero\0";

char inmsg[12];

MPI_Status stat;

MPI_Init(&argc, &argv);

MPI_Comm_size(MPI_COMM_WORLD, &numtasks);

MPI_Comm_rank(MPI_COMM_WORLD, &rank);

if(rank == 0){

dest = 1;

source = 1;

rc = MPI_Send(outmsg1, 12, MPI_CHAR, dest, tag, MPI_COMM_WORLD);

rc = MPI_Recv(inmsg, 12, MPI_CHAR, source, tag, MPI_COMM_WORLD, &stat);

printf("Process %d received message: \"%s\"\n", rank, inmsg);

}

else if(rank == 1){

dest = 0;

source = 0;

rc = MPI_Send(outmsg2, 12, MPI_CHAR, dest, tag, MPI_COMM_WORLD);

rc = MPI_Recv(inmsg, 12, MPI_CHAR, source, tag, MPI_COMM_WORLD, &stat);

printf("Process %d received message: \"%s\"\n", rank, inmsg);

}

MPI_Finalize();

return 0;

}

Результат выполнения программы на 2 процессах:

Process 1 received message: "Hello first"

Process 0 received message: "Hello zero"