2015-07-29 1 views
2

У меня есть простой DO-loop (Fortran 90), в котором отдельные итерации независимы друг от друга и только данные ввода/вывода с/на жесткий диск (процессы не обменивайтесь сообщениями/MPI между собой), которые я распараллеливал с использованием MPI. В последовательном запуске одна итерация цикла занимает около одного дня. Если я запускаю 29 таких итераций параллельно, это занимает около 2,5 дней. Он находится на одном узле суперкомпьютера (т. Е. Нет межсетевой связи).Ускорение MPI с тривиально параллелизуемой DO-петлей (F90)

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

Вопрос: Это ускорение выглядит хорошо для вас?

Большое спасибо.

+0

Сколько ядер у вас на вашем вычислительном узле? Сколько процессоров вы запрашиваете при запуске?Каково время выполнения последовательной части вашего кода? – innoSPG

+0

Runtime последовательной части пренебрежимо мало, это просто простая обработка POST. – Boki

+0

На каждый узел HPC имеется 32 ядра. Я проверил цикл с 29 итерациями на 29 ядрах, поэтому одна итерация на ядро. – Boki

ответ

1

Поскольку у вас есть независимые итерации, время выполнения для 29 итераций на 29 ядрах не должно быть связано с временем выполнения одной итерации на одном ядре. Вы должны быть близки к примерно одному дню, если не применяются одно или несколько из следующих условий:

  • у вас недостаточно памяти на вашем вычислительном узле для всех процессов и их данных, чтобы они вписывались в память;
  • расчеты не сбалансированы между итерациями;
  • есть много дисков ввода/вывода, которые создают гонку на доступ к диску.
  • и, возможно, некоторые другие, что я не имею в виду.
+0

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

+1

Я превратил это в ответ. –

+0

Спасибо за ответ. Этот случай с 29 итерациями использовал менее 90 ГБ из 256 ГБ на узле. Итак, хватило памяти. – Boki

1

Таким образом, вы работаете примерно на половину быстрее, чем вы надеялись, при масштабировании до 29 параллельных копий кода?

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

Давайте используем кодирование видео как конкретный пример того, что может быть «одна итерация». Например, кодирование 29 видео параллельно аналогично тому, что предлагает OP. Имея x264, используйте 32 ядра для кодирования одного видео, а затем повторяя, что для следующих 28 vids использует намного меньше полной ОЗУ и лучше кэширует.

На практике, возможно, 2 или 3 видео в параллель, каждый из которых использует от 10 до 16 потоков, был бы хорош, так как существует ограничение на то, сколько параллелизма может найти x264.

Это зависит от алгоритма, и насколько он масштабируется с несколькими потоками. Если это совсем не так, или у вас нет времени, чтобы закодировать его, тогда грубая сила полностью. Фактор более 10 ускорений - это ничто, чтобы чихать в основном без усилий. (например, запуск однопоточной программы на разных наборах данных с помощью make -j29 или GNU parallel или в вашем случае с использованием нескольких потоков в одной программе. :)

Пока ваш код работает, вы можете проверить использование ЦП, чтобы сделать убедитесь, что вы держите 29 ядер процессора занятыми, как вы пытаетесь. Вы также можете использовать инструмент профилирования (например, Linux perf) для исследования эффектов кеша. Если параллельный запуск имеет намного больше, чем в 29 раз меньше промахов кэша данных однопоточного запуска, это начнет объяснять вещи.

+0

Спасибо за ответ. В моем случае индивидуальная итерация решает собственные значения/собственные векторы гигантской матрицы, а затем записывает некоторые из них в файл на HD. Для eigensolver я использую хорошо развитую и настроенную (консервированную) функцию, которую я не могу распараллелить. – Boki

+0

@Boki: Хорошо, поэтому, возможно, ограничения пропускной способности памяти/ограничения размера кеша. Или, если вы используете так много памяти, что система исчерпала ОЗУ и должна перейти на диск, вы можете получить ускорение, работая меньше параллельно. –

+2

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

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