Программирование MPI для реализации сбора больших данных от многих работников - PullRequest
1 голос
/ 03 января 2011

Теперь у меня есть приложение, состоящее из одного мастера и множества рабочих. Требования к приложению очень просты: рабочие завершают некоторые задания и отправляют данные в мастер, а мастер хранят эти данные в файлах по отдельности. Я могу просто использовать MPI_Send на рабочей стороне для отправки данных мастеру. Но мастер не знает последовательность отправки данных. Некоторые рабочие идут быстро, а некоторые - медленно. Более конкретно, предположим, что есть 5 рабочих, тогда последовательность отправки данных может быть 1,3,4,5,2 или 2,5,4,1,3. Если я просто напишу цикл for (i = от 1 до 5) на стороне мастера с MPI_Recv для получения данных, мастер и какой-то более быстрый работник должны ждать долго. Я знаю, что MPI_Gather может реализовать это. Но я не уверен, что MPI_Gather работает параллельно или просто некоторые последовательные вызовы MPI_Recv? Другая проблема заключается в том, что мои данные чрезвычайно велики, для отправки мастеру требуется более 1 ГБ данных. Если я разделю данные на соединительные линии, это может сделать их более сложными. Я не думаю, что MPI_Gather может работать. Я также пытался думать о программировании сокетов, но я не думаю, что это хорошая практика. Не могли бы вы дать мне предложение, пожалуйста?

Ответы [ 2 ]

2 голосов
/ 06 января 2011

Если я правильно понимаю ваш вопрос, вы хотите получить данные обратно в мастер, но, поскольку для выполнения каждой задачи требуется разное количество времени, вы не хотите зацикливаться на всех процессорах, чтобы Receive для процесса 5 (если он завершен) не ожидает получения от процесса 3 (который все еще выполняется).

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

0 голосов
/ 06 января 2011

Могут ли рабочие выписать файлы вместо отправки данных мастеру? когда работник заканчивает работу, он может отправить мастеру сообщение «Я сделал». мастер, в свою очередь, может отправить следующий кусок работы этому работнику. когда не осталось работы для раздачи, пусть мастер отправит сообщение «больше нет работы» работнику, который затем сможет вызвать MPI Finalize.

...