1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 16:53:09 +00:00

Implement yielding loop while waiting for input

Some MPI implementations use busy-wait pooling, which will turn MPI_Bcast into busy-wait loop, workaround with our own yielding loop.
This commit is contained in:
noobpwnftw 2018-07-16 04:27:44 +08:00 committed by Stéphane Nicolet
parent 80afeb0d3b
commit 0d6cdc0c6d

View file

@ -124,6 +124,23 @@ bool getline(std::istream& input, std::string& str) {
vec.assign(str.begin(), str.end());
size = vec.size();
}
// Some MPI implementations use busy-wait pooling, while we need yielding
static MPI_Request reqInput = MPI_REQUEST_NULL;
MPI_Ibarrier(InputComm, &reqInput);
if (is_root())
MPI_Wait(&reqInput, MPI_STATUS_IGNORE);
else {
while (true) {
static int flag;
MPI_Test(&reqInput, &flag, MPI_STATUS_IGNORE);
if (flag)
break;
else
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
MPI_Bcast(&size, 1, MPI_UNSIGNED_LONG, 0, InputComm);
if (!is_root())
vec.resize(size);