Как сделать, чтобы программа, запускаемая через MPI, имела параметр соответствия процессов (How to set CPUs affinity for MPI executable program?)

Здравствуйте,
Не знаю как корректно задать вопрос. Не являюсь по настоящему опытным пользователем ПК и искал форум, где мне смогут подсказать.
ОС: windows 10

Собрал компьютер с Али с двумя процессорами и большим количеством ядер для выполнения квантово-химических вычислений, но обнаружил, что расчеты не очень эффективно используют ядра, если запускаю два расчета, то они начинают мешать друг другу и другим программам. В итоге оказалось, что эффективней самостоятельно указывать какие ядра/процессор использовать с помощью “диспетчера задач → подробности → задать сходство”. Это нужно сделать для каждого процесса и при следующем запуске оно сбросится.
Чтобы задать сходство заранее перед запуском, нужно создать ярлык и в объекте прописать, что-то вроде:

cmd.exe /c start "Program name" /affinity FFFFFFF0000000 C:\Program Files (x86)\program.exe Где FFFFFFF0000000 - шестнадцатеричное число, указывающее какие ядра использовать (через двоичное число), в моём случае 14ядер/28 потоков первого процессора.

Я протестировал на квантово-химической программе Firefly. 32-битная с простой сборкой (почему-то использующая не больше 20 потоков, но это другой вопрос). Она имеет один exe-файл и для него я сделал простой bat-файл со строкой:

start /affinity FFFFFFF0000000 C:\Firefly\Firefly820.exe -i .\BG.inp -o .\BG.out -t .\TEMP\ -np 20

Задумка была параллельно запустить ещё один расчет, который бы не мешал первому:

start /affinity 0000000FFFFFFF C:\Firefly\Firefly820.exe -i .\BG.inp -o .\BG.out -t .\TEMP\ -np 20

И вроде всё работало как надо.

Ещё одна программа GAMESS US 64-битная и требует установки и запуска через intel MPI. Она также запускается через bat-файл, но тут уже целая цепочка исполнителей и примкнуть ярлык никуда не получается.

Там есть исполняемый файл: gamess.2022.R2.intel.exe. Чтобы его запустить, нужно через командную строку запустить rungms.bat с параметрами:

  • [input] [version] [ncups] [logfile].

Как я понял этот bat-файл обращается к MPI, которая и запускает gamess.2022.R2.intel.exe. И тут я поплыл, ни вставить где-нибудь ярлык, ни прописать в rungms.bat команду start у меня не получилось. Кажется, что нужно что-то изменить в этом куске bat файла (я взял чуть больше текста) (убрал все символы @):

REM  At this point we are ready to run!
REM
ECHO Microsoft MPI ^(MS-MPI^) will be running GAMESS on 1 node^(s^).
ECHO The binary will be kicked off by 'mpiexec' is gamess.%VERSION%.exe
ECHO MS-MPI will run %NCPUS% compute process^(es^) and %NCPUS% data server^(s^).
ECHO.
REM
IF %GDDIJOB%==TRUE (
  ECHO.
  ECHO This is a GDDI run the output will be dumped to this screen when
  ECHO the run has completed which may be a while. But since this is
  ECHO running on the current computer you can tail the progress of
  ECHO the following file:
  ECHO.
  ECHO %SCRATCHDIR%\%JOB%.F06
  ECHO.
)
REM
EM Source Intel MPI environment
REM
CALL C:\PROGRA~2\Intel\oneAPI\mpi\latest\env\vars.bat
IF %REDIRECTION%==TRUE (
  mpiexec -configfile %PROCFILE% >%LOGFILE%
) ELSE (
  mpiexec -configfile %PROCFILE%
)
REM
REM We stall for 5 seconds. Hopefully this is enough time for
REM mpiexec to release hold on %LOGFILE%
REM
REM PING -n 5 127.0.0.1 > NUL
REM
REM Tidy up some GDDI stuff
REM

Либо нужно что-то делать с MPI, вот туда я даже не рискнул лезть.

Что я могу с этим сделать?
Если нужна дополнительная информация, то спрашивайте.

Правильно понял, что аргументы запуска для батника ([input] [version] [ncups] [logfile]), Вы хотите добавить в сам скрипт?

Скорее я хочу узнать, кто запускает основную исполнительную программу (а это наверно MPI) и прописать туда "start /affinity ".
Либо какой-то другой способ.

Решил вот такими изменениями:

@CALL C:\PROGRA~2\Intel\oneAPI\mpi\latest\env\vars.bat
IF %REDIRECTION%==TRUE (
  @mpiexec -env I_MPI_PIN_PROCESSOR_LIST 1-27 -configfile %PROCFILE% >%LOGFILE%
) ELSE (
  @mpiexec -env I_MPI_PIN_PROCESSOR_LIST 1-27 -configfile %PROCFILE%

Т.е. добавлением переменной I_MPI_PIN_PROCESSOR_LIST.
Для другого CPU вроде нужно ещё добавить:
-host host2
Но пока не тестировал.

1 Like

Класс, спасибо.