From bd93a6ec2a3cef76e6e98d830766067221a4e69a Mon Sep 17 00:00:00 2001 From: Paul Heinzlreiter Date: Fri, 30 Sep 2016 12:49:08 +0200 Subject: [PATCH] * fixed receive blocking --- bh_tree_mpi/simulation/MpiSimulation.cpp | 85 +++++++++++++++++++++--- 1 file changed, 75 insertions(+), 10 deletions(-) diff --git a/bh_tree_mpi/simulation/MpiSimulation.cpp b/bh_tree_mpi/simulation/MpiSimulation.cpp index 2658243..fdca115 100644 --- a/bh_tree_mpi/simulation/MpiSimulation.cpp +++ b/bh_tree_mpi/simulation/MpiSimulation.cpp @@ -178,7 +178,6 @@ namespace nbody { } SendStore* MpiSimulation::availableSendStore(int numElems) { - /* vector::iterator it = this->sendStores.begin(); while (it != this->sendStores.end()) { @@ -194,7 +193,6 @@ namespace nbody { it++; } } - */ SendStore store; store.bodies = new Body[numElems]; store.size = numElems; @@ -204,33 +202,100 @@ namespace nbody { void MpiSimulation::distributeLETs() { //send out locally essential trees (local bodies needed by remote simulations) + vector > sendRefinements; + MPI_Request* sendRequests = new MPI_Request[this->parallelSize]; + for (int i = 0; i < this->parallelSize; i++) { if (i != this->parallelRank) { - //printBB(this->parallelRank, this->domains[i]); - vector refinements = this->tree->copyRefinements(this->domains[i]); + sendRefinements.push_back(this->tree->copyRefinements(this->domains[i])); + MPI_Isend(&sendRefinements[i], (int) sendRefinements[i].size(), this->bodyType, i, 0, MPI_COMM_WORLD, &sendRequests[i]); + } else { + sendRefinements.push_back(vector()); + } + } + + int received = 0; + Body** data = new Body*[this->parallelSize]; + MPI_Request* recvRequests = new MPI_Request[this->parallelSize]; - this->send(refinements, i); - cout << "refS: " << this->parallelRank << " -> " << i << ": " << refinements.size() << endl; + for (int i = 0; i < this->parallelSize; i++) { + data[i] = NULL; + } + while (received < this->parallelSize - 1) { + for (int i = 0; i < this->parallelSize; i++) { + if (i != this->parallelRank && data[i] == NULL) { + int ready; + MPI_Status probeStatus; + + MPI_Iprobe(i, 0, MPI_COMM_WORLD, &ready, &probeStatus); + if (ready) { + int count; + + MPI_Get_count(&probeStatus, this->bodyType, &count); + data[i] = new Body[count]; + MPI_Irecv(&data[i][0], count, this->bodyType, i, 0, MPI_COMM_WORLD, &recvRequests[i]); + } + } else if (i != this->parallelRank && data[i] != NULL) { + int done; + MPI_Status status; + + MPI_Test(&recvRequests[i], &done, &status); + if (done) { + cout << this->parallelRank << " received " << i << endl; + received++; + } + } } } + delete[] sendRequests; + delete[] recvRequests; + for (int i = 0; i < this->parallelSize; i++) { + delete[] data[i]; + } + delete[] data; + /* + int* lengths = new int[this->parallelSize]; + + for (int i = 0; i < this->parallelSize; i++) { + if (i != this->parallelRank) { + refinements.push_back(this->tree->copyRefinements(this->domains[i])); + } else { + refinements.push_back(vector()); + } + lengths[i] = refinements.back().size(); + } + MPI_Alltoall(lengths, 1, MPI_INT, lengths, 1, MPI_INT, MPI_COMM_WORLD); + for (int i = 0; i < this->parallelSize; i++) { + if (i != this->parallelRank) { + MPI_Send(&(refinements[i][0]), (int) refinements[i].size(), this->bodyType, i, 0, MPI_COMM_WORLD); + } + } + for (int i = 0; i < this->parallelSize; i++) { + if (i != this->parallelRank) { + MPI_Recv() + } + } + delete[] lengths; + */ //receive bodies and integrate them into local tree for simulation + + /* int received = 0; while (received < this->parallelSize - 1) { vector refinements; - int source = this->recv(refinements); - cout << "refR: " << this->parallelRank << " <- " << source << ": " << refinements.size() << endl; + //int source = this->recv(refinements); + //cout << "refR: " << this->parallelRank << " <- " << source << ": " << refinements.size() << endl; //this->tree->mergeLET(refinements); - /* //integrate bodies in order of arrival to do communication/computation overlapping this->comms[0].recvBlocking(MPI_ANY_SOURCE, refinements); this->tree->mergeLET(refinements); //this->tree.getRootBB().print(); - */ received++; } + */ if (!this->tree->isCorrect()) { cout << "WRONG" << endl; } -- GitLab