#multithreading #parallel-processing #mpi #openmp #cpu
Вопрос:
Я хочу запустить свое приложение в 32 MPI-процессах, каждый из которых охватывает 8 потоков OpenMP. Я провожу сравнительный анализ различных вариантов привязки ядра
Я проверил сначала
export OMP_NUM_THREADS=8
mpirun --bind-to l3cache --use-hwthread-cpus -np 32 myapp_mpi apprun -s benchdata.tpr -v -noconfout -g res.txt
Я не знаю точно, как тогда распределяются процессы и потоки. Есть ли какое-то правило ?
Затем я установил
export OMP_PLACES=”thread(8)”
export OMP_PROC_BIND=true
Я не знаю , следует ли мне затем использовать mpirun
привязку к none
, потому что два предыдущих параметра OpenMP все равно управляют привязкой, или если я должен --bind-to l3cache
(один блок l3cache «имеет» 8 ядер).
mpirun --bind-to l3cache --use-hwthread-cpus -np 32 myapp_mpi apprun -s benchData.tpr -v -noconfout -g res.txt
Какие еще стратегии вы используете для эффективной привязки процессов и потоков ?
Комментарии:
1. Я бы не стал переусердствовать. Если у вас L3 8 ядер, то одной спецификации MPI может быть уже достаточно. Запустите кучу тестов и засеките их время. Я предполагаю, что ваши потоки OpenMP «видят» только ядра процесса MPI, так
OMP_PROC_BIND=true
что, возможно, этого достаточно, чтобы потоки не блуждали. Если, конечно, ваше приложение не является динамическим (или вы не используете динамическое планирование; обратите внимание, что вы ничего не сказали о своем приложении? Это действительно важно….) и вы действительно хотите, чтобы они могли передвигаться.2. Это танго из двух шагов: свяжите каждую задачу MPI с набором из 8 ядер, а затем попросите среду выполнения OpenMP связать потоки (в наборе из 8 ядер). Ваша команда mpirun выглядит хорошо, и ее использование
OMP_PROC_BIND=true
само по себе должно помочь.3. Спасибо, дополнительный вопрос, на который вы можете дать ответ на все, пример приложений для научных вычислений, где точное закрепление ядра обеспечивает значительно лучшую производительность.
4. Если вы не уверены в отображении, вы можете воспроизвести отображение с помощью
OMP_DISPLAY_ENV=VERBOSE
иKMP_AFFINITY=verbose
. Кроме того, вы можете использовать отличныйhw-loc
инструмент для контроля и отслеживания проблем с привязанностью. Что касается аппаратного обеспечения, использованиеnumactl
также может помочь (обычно в системах NUMA).