Эффективный способ выполнить последовательную часть (большое количество операций + запись файла) параллельного кода? - PullRequest
3 голосов
/ 28 июля 2011

У меня есть код C ++, использующий mpi, который выполняется последовательно-параллельно-последовательным образом. Вышеуказанный шаблон повторяется во временном цикле. При проверке кода с помощью последовательного кода, я мог бы получить сокращение во времени для параллельной части, и на самом деле это сокращение почти линейно без числа процессоров.

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

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

Заранее спасибо.

1 Ответ

0 голосов
/ 28 июля 2011

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

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

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

[EDIT]

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

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

Кстати, какую реализацию MPI вы используете?

Описание вашей проблемы слишком высокого уровня, предоставьте псевдокод или что-то в этом роде, это может помочь нам помочь вам.

...