Здавалка
Главная | Обратная связь

MPI_Testsome(incount, array_of_requests, outcount, array_of_indices, array_of_statuses)



IN incountдлина массива запросов (целое)

IN OUT array_of_requestsмассив запросов (массив дескрипторов)

OUT outcountчисло завершенных запросов (целое)

OUT array_of_indicesмассив индексов завершенных операций (массив целых)

OUT array_of_statuses(массив статусов)

 

MPI_Testsomeнеблокирует работу процесса, выполняется аналогичноMPI_Waitsome. Если ни одной операции на момент вызова функции не завершено, outcount = 0.

MPI_Waitsomeбудет выполняться, если в списке содержится хотя бы один активный дескриптор. Функции завершения обменов требуют однозначности операций приема-передачи. Например, если запрос на окончание приема выполнен, должен быть выполнен и запрос на окончание соответствующей передачи. Только в этом случае обмен будет завершен успешно.

 

/////// MPI_Isend process 0 -> MPI_Irecv all process ///////////

/////// program run : mpirun -np 4 file_name.exe ///////////

 

#include <iostream.h>

#include <mpi.h>

#define NumProcForPrintResult 1

 

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

int proc, size;

int i, j=0;

double a[10], b[10];

 

MPI_Status *stat;

MPI_Request *req;

 

MPI_Init( &argc, &argv);

MPI_Comm_rank( MPI_COMM_WORLD, &proc);

MPI_Comm_size( MPI_COMM_WORLD, &size);

 

if (proc == 0) { /* код для proc=0 */

stat=new MPI_Status [6];

req=new MPI_Request [6];

 

for(i=0; i<10; i++)

a[i]=(double)i+1.2;

MPI_Irecv(&a[0], 10, MPI_DOUBLE, 0, 99, MPI_COMM_WORLD, &req[0]);

/* MPI_Wait(&req[0],&stat[0]); //ошибка!!!!! блокировка */

/* for(i=0; i<10; i++) //возможна ошибка, передача, возможно

cout<<b[i])<<” “; // не закончилась принимающие массивы без значение

*/

for(i=0,j=1; i<size; i++,j++)

MPI_Isend(&a[0], 10, MPI_DOUBLE, i, 99, MPI_COMM_WORLD, &req[j]);

MPI_Waitall(5,req,stat);

}

else { /* код для остальных процессов */

stat=new MPI_Status [2];

req=new MPI_Request [2];

 

MPI_Irecv(&b[0], 10, MPI_DOUBLE, 0, 99, MPI_COMM_WORLD, &req[0]);

MPI_Wait(&req[0],&stat[0]);

}

if(proc==NumProcForPrintResult) {

for(i=0; i<10; i++)

cou<<b[i]<<” “;

cout<<endl;

}

MPI_Finalize();

}

 

Семантика не блокирующих коммуникаций

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







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.