У меня есть код fortran, который я использую, чтобы рассчитать некоторые количества, связанные с работой, которую я делаю. Сам код включает несколько вложенных циклов и требует очень небольшого ввода-вывода. Всякий раз, когда код изменяется, я запускаю его из набора нескольких входных файлов (чтобы убедиться, что он работает правильно).Последовательная программа работает медленнее с несколькими экземплярами или параллельно
Чтобы сделать длинный рассказ короче, последнее обновление увеличило время работы программы примерно в четыре раза и запустило каждый входной файл поочередно с одним процессором занимает около 45 минут (долго ждать, просто посмотреть, что-то сломалось). Следовательно, я хотел бы запускать каждый из входных файлов параллельно по 4 cpus в системе. Я пытаюсь реализовать параллелизм с помощью сценария bash.
Интересная вещь, которую я заметил, состоит в том, что, когда на машине работает только один экземпляр программы, требуется около трех с половиной минут, чтобы прокрутить один из входных файлов. Когда четыре экземпляра программы запущены, требуется одиннадцать с половиной минут, чтобы прокрутить один входной файл (при этом мое общее время работы сократилось примерно с 45 минут до 36 минут - улучшение, да, но не совсем то, что у меня было надеялся).
Я попытался реализовать параллелизм, используя gnu parallel, xargs, wait и даже просто запустить четыре экземпляра программы в фоновом режиме из командной строки. Независимо от того, как запускаются экземпляры, я вижу, что это замедляется. Следовательно, я уверен, что это не артефакт скриптов оболочки, а что-то происходит с самой программой.
Я попытался восстановить программу с отключенными символами отладки, а также использовать статические ссылки. Ни у одного из них не было заметного влияния. В настоящее время я создаю программу со следующими параметрами:
$ gfortran -Wall -g -O3 -fbacktrace -ffpe-trap = недействительный, ноль, переполнение, нижний поток, denormal -fbounds-check -finit-real = nan -finit-integer = nan -o [название программы] {источники}
Любая помощь или руководство будут высоко оценены!
Вы уверены, что используете GNU Parallel Shell? Если нет, проверьте описание тегов и используйте только те, которые применяются. Кроме того, действительно ли имеет значение bash? Возможно, потребуется какой-то код. –
Да, я попытался использовать GNU параллельно в качестве решения. Я также пытался использовать xargs, ждать и просто запускать несколько экземпляров в фоновом режиме. –
У вас есть четыре аппаратных ядра? Тяжелая пропускная способность вашей программной памяти? Предоставьте более подробную информацию о вашем оборудовании и примерной программе. – IanH