📄 dupic.c
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* * * (C) 2003 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. */#include "mpi.h"#include <stdio.h>#include "mpitest.h"int main( int argc, char *argv[] ){ int errs = 0; MPI_Comm comm, dupcomm, dupcomm2; MPI_Request rreq[2]; int count; int indicies[2]; int r1buf, r2buf, s1buf, s2buf; int rank, isLeft; MTest_Init( &argc, &argv ); while (MTestGetIntercomm( &comm, &isLeft, 2 )) { if (comm == MPI_COMM_NULL) continue; MPI_Comm_dup( comm, &dupcomm ); /* Check that there are separate contexts. We do this by setting up nonblocking received on both communicators, and then sending to them. If the contexts are different, tests on the unsatisfied communicator should indicate no available message */ MPI_Comm_rank( comm, &rank ); if (rank == 0) { s1buf = 456; s2buf = 17; r1buf = r2buf = -1; /* These are send/receives to the process with rank zero in the other group (these are intercommunicators) */ MPI_Irecv( &r1buf, 1, MPI_INT, 0, 0, dupcomm, &rreq[0] ); MPI_Irecv( &r2buf, 1, MPI_INT, 0, 0, comm, &rreq[1] ); MPI_Send( &s2buf, 1, MPI_INT, 0, 0, comm ); MPI_Waitsome(2, rreq, &count, indicies, MPI_STATUSES_IGNORE); if (count != 1 || indicies[0] != 1) { /* The only valid return is that exactly one message has been received */ errs++; if (count == 1 && indicies[0] != 1) { printf( "Error in context values for intercomm\n" ); } else if (count == 2) { printf( "Error: two messages received!\n" ); } else { int i; printf( "Error: count = %d", count ); for (i=0; i<count; i++) { printf( " indicies[%d] = %d", i, indicies[i] ); } printf( "\n" ); } } /* Make sure that we do not send the next message until the other process (rank zero in the other group) has also completed the first step */ MPI_Sendrecv( MPI_BOTTOM, 0, MPI_BYTE, 0, 37, MPI_BOTTOM, 0, MPI_BYTE, 0, 37, comm, MPI_STATUS_IGNORE ); /* Complete the receive on dupcomm */ MPI_Send( &s1buf, 1, MPI_INT, 0, 0, dupcomm ); MPI_Wait( &rreq[0], MPI_STATUS_IGNORE ); if (r1buf != s1buf) { errs++; printf( "Wrong value in communication on dupcomm %d != %d\n", r1buf, s1buf ); } if (r2buf != s2buf) { errs++; printf( "Wrong value in communication on comm %d != %d\n", r2buf, s2buf ); } } /* Try to duplicate a duplicated intercomm. (This caused problems with some MPIs) */ MPI_Comm_dup( dupcomm, &dupcomm2 ); MPI_Comm_free( &dupcomm2 ); MPI_Comm_free( &dupcomm ); MTestFreeComm( &comm ); } MTest_Finalize( errs ); MPI_Finalize(); return 0; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -