2016-07-27 2 views
2

Это почти вопрос. Я имею в виду, я знаю, что mpi_file_write_all - это «коллективная» версия, но я считаю, что mpi_file_write будет вызываться несколькими процессами одновременно, так что какова фактическая разница в их работе? Благодарю.Как mpi_file_write отличается от mpi_file_write_all?

ответ

5

Функционально в большинстве практических ситуаций мало различий. Если ваш IO работает правильно с mpi_file_write_all(), он должен корректно работать с mpi_file_write(), если вы не делаете что-то очень сложное. Обратное не строго верно, но в большинстве реальных ситуаций, которые я видел, когда все процессы выполняют простые обычные шаблоны ввода-вывода в одно и то же время, mpi_file_write_all() работает, если mpi_file_write().

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

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

Для простых обычных образцов, например. большой трехмерный массив, распределенный по трехмерной сетке процессов, я видел огромные различия между коллективными и не коллективными подходами на Cray с файловой системой Luster. Разница может составлять гигабайт/сек против десятков мегабайт в секунду.

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

+0

Да, шаблон представляет собой много процессов, записывающих общий файл. Спасибо за объяснение. Я определенно вижу большие успехи в производительности с помощью write_all. Приятно понять, почему. Является ли это общедоступным? Не мог найти ничего. –

+1

Мое объяснение в значительной степени основано на выполнении некоторых простых тестов (см. «Производительность параллельного ввода-вывода на ARCHER» по адресу http://www.archer.ac.uk/documentation/white-papers/), затем поговорить с местным персоналом Cray, чтобы попытаться понять, что происходит. В нижней части этой страницы есть куча полезных ссылок: https://www.rc.colorado.edu/support/examples-and-tutorials/parallel-io-on-janus-lustre.html –

+0

Спасибо за ссылки ! –

Смежные вопросы