В системе с общей памятью под управлением 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 мне больше всего интересно понять правильно.