привязка mpirun к l3cache или не используется с OMP_PLACES и OMP_PROC_BIND

#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).