1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
// SPDX-License-Identifier: BSD-3-Clause
// .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 <cassert>
// MPI
#include <vtk_mpi.h>
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;
}
|