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 Все права принадлежат авторам размещенных материалов.
|