Академический Документы
Профессиональный Документы
Культура Документы
1
Основным способом взаимодействия и синхронизации процессов является посылка
сообщения. Сообщение – это набор данных некоторого типа. В MPI для передачи данных
определены свои типы - аналоги типов для каждого языка привязки и реализованы их
соотношение друг к другу.
Примеры:
MPI_INT – int,
MPI_LONG – long int,
MPI_DOUBLE – double,
MPI_CHAR – char,
MPI_UNSIGNED_CHAR – unsigned char.
Кроме этого определены типы MPI_BYTE и MPI_PACKED.
Каждое сообщение имеет несколько атрибутов, в частности номер процесса отправителя, номер
процесса получателя, тег сообщения и коммуникатор. Эти атрибуты позволяют однозначно
идентифицировать сообщение в рамках коммуникатора.
Большинство функций MPI возвращают информацию об успешности выполнения.
Признак успеха – предопределенное в mpi.h значение MPI_SUCCESS.
#include <mpi.h>
int main (int argc, char **argv)
{
…….
MPI_Init (&argc, &argv);
/*Параллельная часть программы*/
MPI_Finalize ();
……..
}
3) Проверка инициализации MPI
int MPI_Initialized (int *flag);
Функция позволяет проверить инициализирован ли MPI вызовом функции MPI_Init. Это
единственная функция, которая может быть вызвана до MPI_Init.
4) Прерывание программы с помощью MPI_Abort
2
int MPI_Abort (MPI_Comm comm, int error);
Функция совершает по возможности корректное прерывание и завершение параллельной
части программы. Стандарт MPI предполагает реализацию этой функции для
коммуникатора MPI_COMM_WORLD. Поведение функции в случае пользовательских
коммуникаторов определяется реализацией MPI.
5) Таймер
double MPI_Wtime (void);
Функция возвращает на вызвавшем процессе время в секундах, прошедшее с некоторого
момента в прошлом. Возвращаемое время локально по отношению к процессору на
котором выполняется процесс. Соотношение к временам, получаемым в процессах,
отображенных на другие процессоры, определяется тем, синхронизированы ли они или
нет.
6) Точность таймера
double MPI_Wtick (void);
Возвращает точность функции-таймера MPI_Wtime.
7) Определение процессора, но который отобразился процесс
int MPI_Get_processor_name (char *name, int *resultlen);
Функция возвращает имя процессора, на котором выполняется процесс. Область памяти
name должна содержать достаточно места для вывода имени
(MPI_MAX_PROCESSOR_NAME). Таким образом функция позволяет определить как
произошло отображение параллельных процессов программы на физическую сеть
процессоров.
8) Определение размера коммуникатора
int MPI_Comm_size (MPI_Comm comm, int *size);
Функция возвращает размер (кол-во процессов) size коммуникатора comm.
9) Идентификация процесса
int MPI_Com_rank (MPI_Comm comm, int *rank);
Функция возвращает номер процесса (его ранг) rank в коммуникаторе comm.
Примеры
#include <mpi.h>
int main (int argc, char **argv)
{
int myrank = 0;
int p = 0;
3
#include <mpi.h>
int main (int argc, char **argv)
{
int source = 0;
int dest = 0;
int tag = 55;
char message[100];
int myrank = 0;
int p = 0;
MPI_Status status;
MPI_Finalize ();
return 0;
}
#include <mpi.h>
int main (int argc, char **argv)
{
int n = 1000;
double *array = NULL;
double *block = NULL;
double *pa;
double subsum = 0.0;
double sum = 0.0;
int myrank = 0;
int p = 0;
4
MPI_Init (&argc, &argv);
MPI_Comm_size (MPI_COMM_WORLD, &p);
MPI_Comm_rank (MPI_COMM_WORLD, &myrank);
if (!myrank)
{
array = (double*) malloc (n*sizeof(double));
f = fopen(“data”, “r”);
for (pa=array; pa != array+n; pa++ ) fscanf (f, “%e”, pa);
}
if (array!=NULL) free(array);
free (block);
MPI_Finalize ();
return 0;
}