Передача больших данных MPI от всех ко всем

В моем приложении MPI есть некоторый процесс, который генерирует большие данные. Скажем, у нас есть процесс N+1 (один для главного управления, другие рабочие), каждый из рабочих процессов генерирует большие данные, которые теперь просто записываются в обычный файл с именем файл1, файл2, ..., файлN. Размер каждого файла может быть совершенно разным. Теперь мне нужно отправить все файлы M в процесс ранга M, чтобы выполнить следующую работу, так что это точно так же, как передача данных всем ко всем.

Моя проблема в том, как мне использовать MPI API для эффективной отправки этих файлов? Раньше я использовал общую папку Windows для их передачи, но я думаю, что это не очень хорошая идея.

Я думал о MPI_file и MPI_All_to_all, но эти функции не подходят для моего случая. Простые MPI_Send и MPI_Recv кажутся сложными для использования, потому что каждый процесс должен передавать большие данные, и я пока не хочу использовать распределенную файловую систему.


person csslayer    schedule 13.06.2010    source источник
comment
Вы в настоящее время записываете файлы N на диски, локальные для каждого процесса, или все они живут в одном месте? Я так понимаю, вы записываете данные на диск, так как они не помещаются в памяти?   -  person Andrew Walker    schedule 13.06.2010
comment
Я хочу запустить это приложение на кластере, поэтому мне нужно перенести эти данные на другую машину, и размер данных может не поместиться в памяти.   -  person csslayer    schedule 13.06.2010
comment
Что представляет собой большой объем данных? MPI_Send/Recv ограничены в размере сообщения аргументом MPI_Count, который является 32-битным значением. Сколько 32-битных (4 ГБ) фрагментов содержится в большом объеме данных? Сколько оперативной памяти доступно для каждого ранга? Сохраняются ли эти данные в памяти во время вычислений? Какая взаимосвязь между узлами? А какой интерконнект к файловой системе? Скорее всего, соединительная ткань будет быстрее, чем файловая система.   -  person Stan Graves    schedule 14.06.2010


Ответы (1)


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

  • Если ваши процессы генерируют большие наборы данных, вряд ли они будут делать это мгновенно. Вместо того, чтобы ждать, пока будет создан весь набор данных, вы можете подумать о его передаче по частям.
  • Я не думаю, что MPI_Send и _Recv (или их варианты) трудно использовать для больших объемов данных. Но вам нужно подумать о том, чтобы найти правильную сумму для передачи при каждом обмене данными между процессами. С MPI это не простой случай, когда есть время запуска сообщения плюс скорость передачи сообщения, которые применяются ко всем отправленным сообщениям. Некоторые реализации IBM, например, на некотором оборудовании имели разные задержки и пропускную способность для небольших и больших сообщений. Однако вы должны выяснить для себя, каковы компромиссы между пропускной способностью и задержкой для вашей платформы. Единственный общий совет, который я бы дал здесь, — это параметризовать размеры сообщений и экспериментировать, пока вы не максимизируете соотношение вычислений и связи.
  • Кроме того, один из тестов, который вы уже должны были провести, — это измерение скорости передачи сообщений для широкого диапазона размеров и шаблонов связи на вашей платформе. Это своего рода базовый пробный тест, когда вы начинаете работать с новой системой. Если у вас нет ничего более подходящего, вам поможет тест STREAMS.
  • Я думаю, что передача больших объемов данных от всех ко всем — необычный сценарий для программ, для которых обычно используется MPI. Возможно, вы захотите серьезно подумать о перепроектировании своего приложения, чтобы избежать таких переносов. Конечно, только вы знаете, осуществимо ли это или стоит ли. Из той небольшой информации, которую вы предоставляете, кажется, что вы можете реализовать какой-то конвейер; в таких случаях обычная схема связи — от процесса 0 к процессу 1, от процесса 1 к процессу 2, от 2 к процессу 3 и т. д.
  • Наконец, если вы работаете на компьютере с общей памятью (например, на многоядерном ПК), вы можете подумать об использовании подхода с общей памятью, такого как OpenMP, чтобы избежать передачи больших объемов данных.
person High Performance Mark    schedule 13.06.2010