Оптимальные размеры данных для отправки и получения в MPI - PullRequest
2 голосов
/ 09 марта 2011

Я пишу параллельное приложение с MPI, в котором мастер-процесс имеет данные размером примерно в кэш (4 МБ на платформе, над которой я работаю) для отправки каждому процессу. Так как 4 МБ может быть слишком большим для отправки мастером за раз, необходимо, чтобы он разбивал все данные на более мелкие куски определенного размера, подходящие для отправки и получения.

У меня вопрос: есть ли какие-нибудь предложения относительно того, какой должен быть оптимальный размер для отправки и получения каждого меньшего куска, учитывая размер всех данных?

Спасибо.

1 Ответ

2 голосов
/ 09 марта 2011

4MB не будет проблемой для любой реализации MPI; Я не уверен, что вы подразумеваете под "слишком большим".

Практическое правило заключается в том, что, если вы можете легко отправить все данные в одном сообщении, это обычно происходит быстрее - причина в том, что для отправки и получения любого одного сообщения требуется некоторое конечное время ( задержка ), возникающая при вызовах функций, вызовах транспортного уровня и т. Д. Кроме того, для отправки любого дополнительного байта данных требуется некоторое время, обычно близкое к фиксированному ( который равен одному из полосы пропускания .) Это только очень грубое приближение к реальной сложности отправки сообщений (особенно больших сообщений) между процессорами, но это очень полезное приближение. В этой модели, чем меньше сообщений вы отправляете, тем лучше, потому что вы несете издержки задержки меньше раз.

Вышеуказанное почти всегда верно, если вы планируете отправлять много маленьких сообщений; однако, если вы говорите об отправке (скажем) 4 1 МБ сообщений против 1 4 МБ сообщений, даже в этой модели разница может быть небольшой и может быть перегружена другими эффектами, специфичными для вашего транспорта. Если вы хотите получить более точную оценку того, как много времени занимает ваша платформа, вам не заменит эмпирическое измерение того, сколько времени на самом деле . Лучшим способом было бы просто попробовать его в своем коде несколькими способами и посмотреть, что лучше. Это действительно единственный окончательный ответ. Второй способ - взглянуть на «микробенчмарки» MPI:

оба из вышеперечисленных включают в себя критерии того, сколько времени занимает отправка и получение сообщений различного размера; Вы компилируете вышеупомянутое с вашим MPI и можете просто считать, сколько времени занимает отправка / получение (скажем) сообщения 4 МБ против сообщений 4 x 1 МБ, и это может дать вам некоторые подсказки относительно того, как действовать.

...