2013-05-06 2 views
0

преамбула:Как выполнить неловко параллельную задачу (цикл FOR) БЕЗ MPI-IO?

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

Я использовал MPI-IO для распространения по всем узлам: на моем диске есть общий .dat-файл, каждая копия MPI считывает этот файл (в качестве источника для интеграции), выполняет интеграцию и снова записывает этот общий файл. Эта процедура повторяется снова и снова. Он работает нормально. Самая трудоемкая часть - интеграция, и чтение файлов было незначительным.

Текущей проблема:

Сейчас я переехал в (16x64 CPU) HPC кластер, и теперь я сталкиваюсь с противоположной проблемой: время расчета пренебрежимо мало для чтения-запись процесса !!!

Я попытался уменьшить количество процессов MPI: я использую только 16 MPI-процессов (для распространения по узлам) + 64 потока с OpenMP для параллелизации моих вычислений внутри каждого узла.

Снова, процесс чтения и записи является наиболее трудоемкой частью сейчас.

Вопрос

Как я должен изменить свою программу, чтобы использовать полную мощность 1024 процессоров с минимальными потерями?

Важным моментом является то, что я не могу перейти к следующему шагу без завершения всего массива 1D.

Мои мысли:

Вместо чтения-записи, я могу задать свой ранг = 0 (мастер ранга), чтобы отправить-получить весь массив ко всем узлам (MPI_Bcast). Таким образом, вместо каждого узла будет I/O, только один узел сделает это.

Заранее благодарен!

+0

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

+0

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

+0

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

ответ

2

Я бы посмотрел here и here. Код FORTRAN для второго сайта - here, а код C - here.

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

Кроме того, вы правы, чтобы экономить ваши вычисления на диске так часто. И мне нравится MPI-IO для этого. Я думаю, что это путь. Но коды в ссылках позволят вам работать без чтения каждый раз. И, за мои деньги, выписывая данные каждый раз является излишним.

+0

Отлично! Благодаря! Я изучу это! –

+0

Нет проблем. Было бы оценено преимущество или согласие. Благодаря! –

+0

Еще одна вещь: на самом деле я очень впечатлен тем, что вы смогли решить MPI-IO, не зная некоторых из более простых вещей MPI. Я бы сказал, что вы, вероятно, добьетесь успеха в этом проекте. –

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