Эта запись прежде всего является дополнением к записи про установку GAMESS, а не(!) про запуск. Путаница может возникнуть потому что в самом GAMESS есть скрипт rungms, и я написал для своего кластера скрипт rungms. Сейчас запись про первый:)
Небольшая особенность того, как я исправил. GAMESS-ом у меня будет считать всего один пользователь и запуск будет осуществляться на небольшом количестве процессоров <=32. Но думаю, что идея того, как это будет сделано может быть проэкстраполирована на другие случаи.
Вначале, если при конфигурации было указано, что будет использован MPI, то в rungms нужно это дело вписать
set TARGET=mpi
А также указать директорию, где будут создаваться временные файлы. Желательно указать то место, куда есть доступ у пользователей, поэтому я сделал чтобы папка scr располагалась в директории у пользователя
set SCR=/home/user/work/scr
Далее доходим до строчки setenv AUXDATA
setenv AUXDATA /share/soft/gamess/auxdata
И затем пути для всех файлов, которые начинались на ~$USER заменить на $SCR
setenv MAKEFP $SCR/$JOB.efp
setenv GAMMA $SCR/$JOB.gamma
setenv TRAJECT $SCR/$JOB.trj
setenv RESTART $SCR/$JOB.rst
setenv INPUT $SCR/$JOB.F05
setenv PUNCH $SCR/$JOB.dat
setenv AOINTS $SCR/$JOB.F08
...
Затем вставляем строчку
set GDDIjob=true
перед set ngddi=`grep -i '^ \$GDDI' $SCR/$JOB.F05 | grep -iv 'NGROUP=0 ' | wc -l`
Если честно, не уверен, что это нужно, но, на всякий случай, пусть будет :)
Важный момент, находим строчку
if ($TARGET == sockets) then
Если у нас изначально выбрано TARGET=mpi, то начиная с этого и до конца ничего не меняем, а ищем
if ($TARGET == mpi) then
Далее находим строчки с if ($NCPUS == 1) then и меняем все условие следующим образом:
if ($NCPUS >= 1) then
echo `hostname` >> $HOSTFILE
set NNODES=1
Остальное я за комментировал, т.к. запуск я планировал осуществлять без планировщика заданий и на одном(!) узле.
# else
# # Parallel run gets node names from schedular's assigned list:
# if ($SCHED == SGE) then
# uniq $TMPDIR/machines $HOSTFILE
# set NNODES=`wc -l $HOSTFILE`
# set NNODES=$NNODES[1]
# endif
# if ($SCHED == PBS) then
# uniq $PBS_NODEFILE $HOSTFILE
# set NNODES=`wc -l $HOSTFILE`
# set NNODES=$NNODES[1]
# endif
endif
В принципе строки
if ($SCHED == PBS) then
uniq $PBS_NODEFILE $HOSTFILE
set NNODES=`wc -l $HOSTFILE`
set NNODES=$NNODES[1]
endif
можно и не комментировать, потому что в них все будет работать, если планируется использование планировщика типа TORQUE.
Далее переходим к строке
case hydra:
if ($NNODES == 1) then
Здесь все нормально, только мне пришлось сменить
@ PPN2 = $PPN + $PPN
на
set PPN2 = $PPN + $PPN
потому что при запуске появлялась ошибка @: unexpected syntax. В программировании на C# я не силен, не очень знаю что это обозначает, поэтому решил заменить таким образом. Главное, что работает, и правильно :)
Далее идем ниже и ниже, до тех пока пока не найдем
case hydra:
set echo
setenv I_MPI_HYDRA_ENV all
setenv I_MPI_PERHOST $PPN2
mpiexec.hydra -f $PROCFILE -n $NCPUS \
/share/soft/gamess/gamess.$VERNO.x < /dev/null
unset echo
breaksw
Здесь просто нужно заменить путь для запуска GAMESS на нужный.
Вот, собственно и все.
Некоторые замечания.
Для того, чтобы работать можно было ни на одном узле, а на нескольких, то можно просто вручную определять NNODES и сделать несколько скриптов для rungms для различных ресурсов, или же написать более хитрые условия (если без планировщика). Если будет использован планировщик, то думаю, что NNODES будет определяться из условия запуска PBS задания, и тоже все будет нормально.
Небольшая особенность того, как я исправил. GAMESS-ом у меня будет считать всего один пользователь и запуск будет осуществляться на небольшом количестве процессоров <=32. Но думаю, что идея того, как это будет сделано может быть проэкстраполирована на другие случаи.
Вначале, если при конфигурации было указано, что будет использован MPI, то в rungms нужно это дело вписать
set TARGET=mpi
А также указать директорию, где будут создаваться временные файлы. Желательно указать то место, куда есть доступ у пользователей, поэтому я сделал чтобы папка scr располагалась в директории у пользователя
set SCR=/home/user/work/scr
Далее доходим до строчки setenv AUXDATA
setenv AUXDATA /share/soft/gamess/auxdata
И затем пути для всех файлов, которые начинались на ~$USER заменить на $SCR
setenv MAKEFP $SCR/$JOB.efp
setenv GAMMA $SCR/$JOB.gamma
setenv TRAJECT $SCR/$JOB.trj
setenv RESTART $SCR/$JOB.rst
setenv INPUT $SCR/$JOB.F05
setenv PUNCH $SCR/$JOB.dat
setenv AOINTS $SCR/$JOB.F08
...
Затем вставляем строчку
set GDDIjob=true
перед set ngddi=`grep -i '^ \$GDDI' $SCR/$JOB.F05 | grep -iv 'NGROUP=0 ' | wc -l`
Если честно, не уверен, что это нужно, но, на всякий случай, пусть будет :)
Важный момент, находим строчку
if ($TARGET == sockets) then
Если у нас изначально выбрано TARGET=mpi, то начиная с этого и до конца ничего не меняем, а ищем
if ($TARGET == mpi) then
Далее находим строчки с if ($NCPUS == 1) then и меняем все условие следующим образом:
if ($NCPUS >= 1) then
echo `hostname` >> $HOSTFILE
set NNODES=1
Остальное я за комментировал, т.к. запуск я планировал осуществлять без планировщика заданий и на одном(!) узле.
# else
# # Parallel run gets node names from schedular's assigned list:
# if ($SCHED == SGE) then
# uniq $TMPDIR/machines $HOSTFILE
# set NNODES=`wc -l $HOSTFILE`
# set NNODES=$NNODES[1]
# endif
# if ($SCHED == PBS) then
# uniq $PBS_NODEFILE $HOSTFILE
# set NNODES=`wc -l $HOSTFILE`
# set NNODES=$NNODES[1]
# endif
endif
В принципе строки
if ($SCHED == PBS) then
uniq $PBS_NODEFILE $HOSTFILE
set NNODES=`wc -l $HOSTFILE`
set NNODES=$NNODES[1]
endif
можно и не комментировать, потому что в них все будет работать, если планируется использование планировщика типа TORQUE.
Далее переходим к строке
case hydra:
if ($NNODES == 1) then
Здесь все нормально, только мне пришлось сменить
@ PPN2 = $PPN + $PPN
на
set PPN2 = $PPN + $PPN
потому что при запуске появлялась ошибка @: unexpected syntax. В программировании на C# я не силен, не очень знаю что это обозначает, поэтому решил заменить таким образом. Главное, что работает, и правильно :)
Далее идем ниже и ниже, до тех пока пока не найдем
case hydra:
set echo
setenv I_MPI_HYDRA_ENV all
setenv I_MPI_PERHOST $PPN2
mpiexec.hydra -f $PROCFILE -n $NCPUS \
/share/soft/gamess/gamess.$VERNO.x < /dev/null
unset echo
breaksw
Здесь просто нужно заменить путь для запуска GAMESS на нужный.
Вот, собственно и все.
Некоторые замечания.
Для того, чтобы работать можно было ни на одном узле, а на нескольких, то можно просто вручную определять NNODES и сделать несколько скриптов для rungms для различных ресурсов, или же написать более хитрые условия (если без планировщика). Если будет использован планировщик, то думаю, что NNODES будет определяться из условия запуска PBS задания, и тоже все будет нормально.
Я правил только (socket версия 2012)
ОтветитьУдалитьset SCR=/tmp
set GMSPATH=~/gamess
set USERSCR=~$USER/scr
и потом меня еще 3 раза /u1/mike/gamess на ~/gamess ( строки 916, 995, 1013)
запускался только на одном ядре, иначе вылетал с ошибкой, правил так
# if ($NCPUS = 1) then | закоминтил
set NNODES=1
set HOSTLIST=(`hostname`:cpus=$NCPUS)
# endif | тоже
и еще закоминтил
# echo I do not know how to run this node in parallel.
# exit 20
теперь пашет на всех ядрах
Следующий этап попробывать скомпилить mpi версию на боевом железе
Тут, на сколько я понял, важны больше не условия того что будет, если будет столько то ядер запущено или еще что-то, а важно то, чему будут равны переменные, которые важны для запуска программы, а именно
ОтветитьУдалитьddikick.x $JOB $GMSPATH gamess.$VERNO.x $SCR $NCPUS $HOSTLIST < /dev/null
нужно просто грамотно определить $GMSPATH, $SCR, $NCPUS и $HOSTLIST и тогда все заработает. Тоже самое и для mpi