MPI Busy ждет ответа

У меня было что-то вроде

while(j<nOSlaves)
{
//Iterate through all the slaves.
for(int i=1;i<nOSlaves && j<nOSlaves;i++)
{
//Create a taskMessage which contains length and distance.
MPI_Status st;
MPI_Recv(&buffer, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &st);

if (buffer > 0)
{ //Handle the message.... }
}
}

Теперь проблема в том, что я должен ждать всех, пока не придет сообщение, я хотел его быстрее и попробовал асинхронно.

MPI_Irecv(&buffer, 1, MPI_INT, i, 0, MPI_COMM_WORLD, &rq);

int flag = 0;
MPI_Test(&rq, &flag, &st);

//If the asynchronous message has been received advance, else try again later.
if (flag)
{ //Handle the message.... }

Но после каждой итерации for я потеряю запрос.
Есть ли способ перебрать всех «рабов» и посмотреть, если некоторые уже ответили?

0

Решение

С этой ошибкой у вас есть какой-то блок. Ваши отправки и получения не происходят одновременно.

Так MPI_Irecv это неблокирующая функция при получении MPI_Recv является функцией блокировки. Поскольку вы не включили свои функции отправки, трудно сказать, что вызывает блокировку здесь (но, учитывая это сообщение об ошибке, это, вероятно, имеет место). Предлагаю посмотреть на Христо Илиев‘s (он, кажется, активен здесь) учебные пособия. Одна из самых сложных вещей в MPI — это блокировка. Способ, которым вы могли бы убедиться, что все захвачено, это использовать MPI_Barrier хотя я в основном использую это для отладки. Если вы беспокоитесь о скорости, то передача одного целого числа не очень хорошая идея, если только вы не используете его для индексации. Вы также можете использовать MPI_Scatterv если вы хотите, чтобы отсылались неровные куски. Если вы отправляете тот же раздел buffer, который выглядит так, как вы, вы можете попробовать MPI_Bcast,

Я считаю, что это помогает записать некоторые части кода, чтобы убедиться, что они не блокируют друг друга.

0

Другие решения

Других решений пока нет …