У меня есть программа MPI, состоящая из одного главного процесса, который передает команды группе подчиненных процессов. Получив команду, ведомое устройство просто вызывает для этого system(). Пока ведомые устройства ожидают команды, они потребляют 100% своих соответствующих ЦП. Похоже, что Probe() находится в жестком цикле, но это только предположение. Как вы думаете, что может быть причиной этого, и что я могу сделать, чтобы это исправить?
Вот код подчиненного процесса, ожидающего команды. Одновременный просмотр журнала и команды top позволяет предположить, что, когда ведомые устройства потребляют свои ЦП, они находятся внутри этой функции.
MpiMessage
Mpi::BlockingRecv() {
LOG(8, "BlockingRecv");
MpiMessage result;
MPI::Status status;
MPI::COMM_WORLD.Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, status);
result.source = status.Get_source();
result.tag = status.Get_tag();
int num_elems = status.Get_count(MPI_CHAR);
char buf[num_elems + 1];
MPI::COMM_WORLD.Recv(
buf, num_elems, MPI_CHAR, result.source, result.tag
);
result.data = buf;
LOG(7, "BlockingRecv about to return (%d, %d)", result.source, result.tag);
return result;
}
fork()
в системах с интерконнектом OpenFabrics (InfiniBand или iWARP). - person Hristo Iliev   schedule 28.01.2013