Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции - Чернышева.doc
Скачиваний:
8
Добавлен:
13.11.2019
Размер:
1.03 Mб
Скачать

Функция передачи данных с блокировкой

MPI_Send();

Int MPI_Send(void*buf, int count, MPI_Datatype datatype, int dest, int msgtag, MPI_Comm comm);

void*buf – адрес начала передаваемой информации;

int count – количество элементов передаваемой информации;

MPI_Datatype datatype – тип переменных передаваемой информации в терминологии MPI;

Int dest – номер процесса получателя;

Int msgtag – идентификатор сообщения;

MPI_Comm comm. – идентификатор коммуникатора группы, которому принадлежит процесс отправителя и процесс получателя.

Функция MPI_Send передает данные из buf процессу dest с блокировкой. Передаваемые данные должны последовательно находиться в buf.

Блокировка гарантирует корректность использования параметров после выхода из функции MPI_Send. Но возврат из функции MPI_Send не гарантирует нам реальной передачи данных.

Дополнительные функции

1) int MPI_Bsend (void* , int, MPI_Datatype, int, int, Mpi_Comm);

Функция MPI_Bsend помещает данные в буфер.

2) int MPI_Ssend (void* , int, MPI_Datatype, int, int, Mpi_Comm);

Возврат из функции MPI_Ssend произойдет только после реальной передачи данных..

3) int MPI_Rsend (void* , int, MPI_Datatype, int, int,Mpi_Comm);

Запуск функции MPI_Rsend возможен только при готовности к приему процесса получателя. Если процесс-получатель не готов к передаче, производится аварийное завершение и результат функции будет не определен.

Функции возвращают MPI_Success в случае удачи или код ошибки. Ошибка возможна при недостатке места в буфере.

Пример:

Пусть нулевой процесс пересылает всем остальным процессам:

  1. некоторое число;

  2. некоторый массив;

#include <iostream.h>

#include <mpi.h>

#define msgtag 77

void main (int argc, char**argv) {

MPI_Init (&argc, &argv);

Int rank, size;

MPI_Comm_size (MPI_COMM_WORLD, &size);

MPI_Comm_rank (MPI_COMM_WORLD, &rank);

1: MPI_Status status;

if (!rank) {

int m=5;

for (int i=0; i<size-1; i++)

MPI_Send(&m, 1, MPI_INT, i+1, msgtag, MPI_COMM_WORLD);

}

else {

int l=0;

MPI_Recv (&l, 1, MPI_INT, 0, msgtag, MPI_COMM_WORLD, &status);

}

MPI_Finalize();

}

Результат при size=3: rank=1 l=5

rank=2 l=5

2: const int n=10;

if (!rank) {

int m[n]={1, 2, 3, 4};

for (int i=0; i<size-1; i++)

MPI_Send(m, n, MPI_INT, i+1, msgtag, MPI_COMM_WORLD);

}

else {

int l[n];

MPI_Recv (l, n, MPI_INT, 0, msgtag, MPI_COMM_WORLD, &status);

}

MPI_Finalize();

}

Виды параллелизма Геометрический (распараллеливание по пространству)

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

При решении некоторых задач для обеспечения непрерывности вычислительного процесса необходимо вводить дополнительные точки на границах участков. Эти границы называются стыками.

Возникающие проблемы при обработке стыков:

  1. необходимо определять оптимальное число дополнительных точек;

  2. необходимо определять способ обработки стыков;

  3. необходимо чтобы точность вычисления на стыках соответствовала точности вычислений на всей расчетной области.

Достоинства:

  1. можно обсчитывать большие расчетные области;

  2. все процессы работают одновременно на своих участках, что дает заметное ускорение;

Недостатки:

  1. стыки и проблема их обработки;

  2. на стыках часто приходится передавать сообщения, что приводит к потере времени.

Область применения: решение уравнений в частных производных, задач линейной алгебры.