/*========================================================================= Program: Visualization Toolkit Module: TestNonBlockingCommunication.cxx Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ // .NAME TestNonBlockingCommunication.cxx -- Tests non-blocking MPI comm. // // .SECTION Description // This test performs a non-blocking communication between 2 processes using // the following pattern where: // (1) Each process posts its receives // (2) The posts its sends // (3) Does a wait-all // VTK includes #include "vtkMPIController.h" #include "vtkMathUtilities.h" // C++ includes #include // MPI #include void FillArray( const int rank, const int size, double array[] ) { for( int i=0; i < size; ++i ) { array[ i ] = (rank+1)*(i+1); } // END for } //------------------------------------------------------------------------------ int TestNonBlockingCommunication( int argc, char *argv[] ) { vtkMPIController *myController = vtkMPIController::New(); myController->Initialize( &argc, &argv, 0); double sndarray[10]; double rcvarray[10]; double expected[10]; vtkMPICommunicator::Request requests[2]; int N = myController->GetNumberOfProcesses(); int Rank = myController->GetLocalProcessId(); int SendRank = (Rank==0)? 1 : 0; if( N != 2 ) { cerr << "This test must be run with 2 MPI processes!\n"; myController->Finalize(); myController->Delete(); return(-1); } assert("pre: N must be 2" && (N==2)); assert("pre: Rank is out-of-bounds" && (Rank >= 0) && (Rank < N) ); cout << "Filling arrays..."; cout.flush(); FillArray( Rank, 10, sndarray ); FillArray( SendRank, 10, expected ); cout << "[DONE]\n"; cout.flush(); // Post receives cout << "Posting receives....\n"; cout.flush(); myController->NoBlockReceive( rcvarray, 10, SendRank, 0, requests[0] ); // Post sends cout << "Posting sends...\n"; cout.flush(); myController->NoBlockSend( sndarray, 10, SendRank, 0, requests[1] ); // Wait all cout << "Do a wait all!\n"; cout.flush(); myController->WaitAll(2,requests); bool arraysMatch = true; for( int i=0; i < 10; ++i ) { if( !vtkMathUtilities::FuzzyCompare(rcvarray[i],expected[i]) ) { arraysMatch = false; break; } } if( arraysMatch ) { cout << "RcvArray matches expected data!\n"; cout.flush(); } else { cout << "ERROR: rcvarray does not match expected data!\n"; cout.flush(); } myController->Barrier(); myController->Finalize(); myController->Delete(); return 0; }