MPI.NET, как заставить процессы отправлять данные в произвольном порядке? - PullRequest
0 голосов
/ 11 февраля 2012

Я использую mpi.net. Я хочу, чтобы каждый процессор (кроме proc 0) отправлял данные для обработки 0 в произвольном порядке. Вот упрощенный фрагмент кода:

            if (rank == 0)
            {
                int all = nTasks-1; //wich is the number of processes -1

                while (all > 0)
                {
                     Communicator.world.Receive<Pixelator>(Communicator.anySource, 1, out pixelus);
                     if (pixelus.x == -1)
                     {
                         all--;
                     }
                }
            }
            else
            {                    
                for (int i = 0; i < 5; i++)
                {
                    Communicator.world.Send<Pixelator>(some_data, 0, 1);
                }                    
                Communicator.world.Send<Pixelator>(-1, 0, 1);
            }

Проблема в том, что процесс 0 получает всю информацию от другого процесса одновременно, а затем продвигается вперед при получении данных от другого процесса. Например, процесс 0 получает 1 1 1 1 1 2 2 2 2 2 5 5 5 5 5 4 4 4 4 4 3 3 3 3 3 (это ряды процессов, отправляющих данные). И я хочу, чтобы это было 1 5 2 3 1 1 4 3 ... или любой произвольный порядок ... пожалуйста, дайте мне предложение. извините за мой английский

1 Ответ

0 голосов
/ 18 августа 2012

Взгляните на здесь .Существует способ заблокировать процессы от дальнейших действий, когда они достигают некоторой точки вычисления, пока все другие процессы не достигнут той же самой точки.Надеюсь, это будет чем-то полезным.Ваш код, скорее всего, будет выглядеть так:

if (rank == 0)
{
    int all = nTasks-1; //wich is the number of processes -1

    while (all > 0)
    {
         Communicator.world.Receive<Pixelator>(Communicator.anySource, 1, out pixelus);
         if (pixelus.x == -1)
         {
             all--;
         }
    }
}
else
{                    
    for (int i = 0; i < 5; i++)
    {
        Communicator.world.Send<Pixelator>(some_data, 0, 1);
        //Here's the barrier
        Communicator.Barrier();
    }                    
    Communicator.world.Send<Pixelator>(-1, 0, 1);
}

Он определенно предоставит что-то вроде вашего вывода.Но если барьеры не устраивают, у меня нет других догадок, кроме как дать больше работы процессам, чтобы у них было меньше времени для общения друг с другом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...