15 static vector< vector< double > >
recvBuf;
23 ret[i] = i + numCalls;
30 static double doWork(
double* work);
32 int main(
int argc,
char **argv)
38 tc * ( ( ne * (ne - 1.0) )/2.0 ) +
39 ne * ( tc * (tc - 1.0) )/2.0;
45 MPI_Init(&argc, &argv);
49 MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
50 MPI_Comm_size(MPI_COMM_WORLD, &numNodes);
55 recvReq[i] = sendReq[i] = 0;
56 vector< double > temp(
numEntries * numNodes, 0.0 );
57 recvBuf.resize( numNodes, temp );
61 int begin = myrank * numCallsPerNode;
62 int end = begin + numCallsPerNode;
65 for (
int i = 0; i <
numNodes; ++i ) {
78 for (
int i = 0; i < numCallsPerNode; ++i ) {
81 if ( targetNode == myrank ) {
102 if ( targetNode == numNodes - 1 ) {
104 while ( numDone < numNodes )
105 numDone +=
clearPending( numNodes, myrank, recvReq, tot );
112 for (
int i = 0; i <
numNodes; ++i ) {
113 if ( i == myrank )
continue;
124 while ( numDone < numNodes )
125 numDone +=
clearPending( numNodes, myrank, recvReq, tot );
127 cout << myrank <<
": Tot = " << tot <<
128 ", expected = " << expectedTot <<
129 ", subtot = " << work[0] << endl;
144 for (
int i = 0; i <
numNodes; ++i ) {
146 MPI_Status &ds = doneStatus[i];
147 ds.MPI_SOURCE = ds.MPI_TAG = ds.MPI_ERROR = ds._count = ds._cancelled = 0;
150 int numDone = MPI_Testsome( numNodes - 1, recvReq, &done,
151 doneIndices, doneStatus );
153 if ( done == MPI_UNDEFINED )
155 for (
unsigned int i = 0; i < done; ++i ) {
156 int recvNode = doneIndices[i];
157 if ( recvNode >= myrank )
159 double* work = &(
recvBuf[recvNode][0]);
169 &recvReq[doneIndices[i]]);
static int clearPending(int numNodes, int myrank, MPI_Request *recvReq, double &tot)
static double doWork(double *work)
int main(int argc, char **argv)
static unsigned int numNodes
static double * get_next_work_item(int numCalls)
static vector< vector< double > > recvBuf