2016-05-05 5 views
0

MPI запускает мою программу с несколькими процессами.Могу ли я использовать `std :: this_thread :: sleep_for()` с процессом MPI?

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

std::this_thread::sleep_for() выглядит так, как я хочу, но этот thread бит выглядит немного отрывочным в этом контексте.

Это нормально?

+0

Большинство реализаций MPI начинаются с каждого ранга в отдельном процессе. Каждый процесс имеет по крайней мере один поток. Поэтому использование 'this_thread' - это прекрасно, но помните, что MPI часто порождает дополнительные потоки для внутреннего использования, и вы не должны с ними общаться (что на самом деле трудно сделать с помощью интерфейса C++). –

+0

@HristoIliev: Я бы поддержал это как ответ. – Richard

ответ

1

Это нормально делать - ничто не должно падать или зависать в результате этого.

Однако ваш «так, что он использует минимальный процессор» немного беспокоит. У вас больше процессов MPI, чем у вас есть аппаратные потоки для их выполнения? Такой вид переподписки вообще ужасен для производительности, и его следует избегать. Наилучшая производительность часто наблюдается с одним меньшим количеством процессов на один аппаратный узел, чем количество аппаратных потоков, которые оно предлагает, чтобы позволить системным процессам работать где-то без предварительной защиты приложения.

В случае, если это может быть оправдано (на котором я только что опубликовал a paper), если у вас есть раздел вашей программы, где у вас меньше параллелизма, чем у вас есть процессы. Если вы работаете на процессорах Intel с Turbo Boost, то, когда фактически запущенные процессы простоя могут позволить ядру (ядрам) работать с рабочими процессами, чтобы работать с более высокой тактовой частотой.

+0

Спасибо. Я ограничиваю количество активных процессов MPI равными аппаратными потоками, но очень удобно иметь (много) больше процессов, которые не работают, но могут удержаться на промежуточных результатах вычислений. Я установил неактивные процессы для обработки пары 'MPI_Iprobe' +' sleep_for (50ms) '. – Richard

+0

@ Richard, почему бы вам просто не использовать блокирующий «MPI_Probe» и сообщить библиотеке MPI не использовать циклы занятости во время опроса сетевых интерфейсов? Или вы выполняете дополнительную работу в цикле 'MPI_Iprobe + sleep'? –

+0

@HristoIliev: OpenMPI, похоже, не узнал опцию 'mca', которую я ее отправил. Неясно, ответили ли Intel MPI на переменную среды. Я задал новый и славный вопрос об этом [здесь] (http://stackoverflow.com/q/37078753/752843). – Richard