| 267 | |
| 268 | |
| 269 | void receiveArray(qcomp* dest, qindex numElems, int pairRank) { |
| 270 | #if COMPILE_MPI |
| 271 | |
| 272 | // expect the data in multiple messages |
| 273 | auto [messageSize, numMessages] = dividePow2PayloadIntoMessages(numElems); |
| 274 | |
| 275 | // create a request for each asynch receive below |
| 276 | vector<MPI_Request> requests(numMessages, MPI_REQUEST_NULL); |
| 277 | |
| 278 | // listen to receive each uniquely-tagged message asynchronously (as per arxiv.org/abs/2308.07402) |
| 279 | for (qindex m=0; m<numMessages; m++) { |
| 280 | int tag = static_cast<int>(m); // gauranteed int, but m*messageSize needs qindex |
| 281 | MPI_Irecv(&dest[m*messageSize], messageSize, MPI_QCOMP, pairRank, tag, MPI_COMM_WORLD, &requests[m]); |
| 282 | } |
| 283 | |
| 284 | // receivers wait for all messages to be received (while sender asynch proceeds) |
| 285 | MPI_Waitall(requests.size(), requests.data(), MPI_STATUSES_IGNORE); |
| 286 | |
| 287 | #else |
| 288 | error_commButEnvNotDistributed(); |
| 289 | #endif |
| 290 | } |
| 291 | |
| 292 | |
| 293 |
no test coverage detected