Когда возникает гиперпоточность при использовании MPI, OpenMP и PBS Pro?

В системе с общей памятью под управлением Linux предположим, что у нее 4 процессора Intel Xeon-E5, и каждый процессор имеет 10 ядер. PBS Pro установлен. И, например, пользователи используют qsub -l select=1:ncpu=30 для запуска программ, если они хотят работать на 30 ядрах. Или сделал бы setenv OMP_NUM_THREADS 30 для другого ПО.

Мой вопрос в основном касается коммерческих программных пакетов, основанных на MPI. Не обращая внимания на PBS и qsub на мгновение, все, что вы делаете для запуска этих программ, - это либо выбираете количество ядер для запуска из раскрывающегося меню после его запуска, либо из приглашения при запуске с чем-то вроде ./cfd.exe -np 30, чтобы использовать 30 ядер.

в системе 4 физических сокета = 4 процессора; у каждого ЦП 10 ядер = всего 40 физических ядер; каждое ядро ​​имеет гиперпоточность, поэтому cat /proc/cpuinfo будет сообщать с 80 процессорами или ядрами с номерами от 0 до 79.

q1: Я не понимаю, когда и как происходит гиперпоточность, происходит ли это автоматически за кулисами или мне нужно каким-то образом вручную вызывать это, чтобы это произошло.

Для системы, имеющей много ядер, но я буду продолжать использовать приведенные выше числа для простоты, теперь, когда используются PBS Pro и qsub и пользователь делает qsub -l select=1:ncpu=20, им выделяются 10 физических ядер с номерами, скажем, 10..19, а также выделяются 10 виртуальных ядер. пронумерованы от 50..59. Это подводит меня к вопросу 2 ниже:

q2: Как правильно работать? Если / proc / cpuinfo возвращается с 80 процессорами, то могу ли я с уверенностью предположить, что я всегда могу сделать ./cfd.exe -np 80 или setenv OMP_NUM_THREADS 80 и убедиться, что каждое ядро ​​не работает на 50%? Или я никогда не должен делать больше, чем -np 40, и позволять системе справиться с этим?

Я использую программное обеспечение cfd в качестве примера, но я также спрашиваю об этом в отношении программного обеспечения, которое я и мои коллеги написали с использованием OpenMP и других параллельных директив.

q3: Правильно ли я полагаю, что если я запускаю программу и указываю ее для работы на 4 ядрах, или она жестко запрограммирована на поиск не более 4 ядер для параллельной работы, то если ЦП поддерживает ли гиперпоточность, будет ли гиперпоточность происходить за кулисами автоматически? Так что, если бы я отключил гиперпоточность на уровне BIOS или EFI, моя программа работала бы медленнее? Предположим, что программа и задача масштабируются линейно, и 8 ядер всегда должны быть в два раза быстрее, чем 4, 16 ядер всегда вдвое быстрее, чем 8 ядер, и так далее. Этот вопрос №3 мне больше всего интересно понять правильно.


person ron    schedule 08.03.2016    source источник


Ответы (1)


q1

Hyper-Threading (HT) означает, что есть два процессора *, которые совместно используют физическое ядро.

*: я использую термин процессор из терминологии Linux. С активированной Hyper-Threading процессор будет равен одному аппаратному потоку.

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

Как это обрабатывается системой пакетной обработки, зависит от конфигурации. По моему опыту, HT обычно отключен в общих пакетных системах, потому что это усложняет ситуацию, приводит к незначительным проблемам с производительностью и редко дает значительные преимущества в производительности для оптимизированных кодов. Есть интересная документация о том, как бороться с HT в PBS < / а>.

Я предлагаю вам попробовать и проверить, какие процессоры вы получаете от пакетной системы, выполнив следующее задание:

bash -c "taskset -p \$\$"

Обратите внимание, что экранированный \$\$ использует идентификатор процесса внутреннего bash, а не тот, который вызывает отправку задания. Результирующая шестнадцатеричная маска сродства сообщает вам, на каких процессорах выполняется задание. Например, 5 = 00000101 будет означать процессор 0 и 2.

q3

Я думаю, вы неправильно поняли HT. Это не дает вам двукратного ускорения только потому, что у вас в два раза больше доступных процессоров. Вы можете получить ускорение на 10% или ваше приложение может работать медленнее. Если ваша цель - производительность, вы всегда предпочтете использовать 4 процессора с отдельными ядрами, а не 4 процессора с двумя общими ядрами.

q2

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

Если ваше приложение не использует HT, выберите количество процессов / потоков, равное количеству физических ядер. Затем вы можете помочь планировщику, убедившись, что потокам вашего приложения разрешено использовать только один аппаратный поток на физическое ядро, например через PBS, taskset или KMP_AFFINITY.

person Zulan    schedule 09.03.2016