Эта запись прежде всего является дополнением к записи про установку 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 задания, и тоже все будет нормально.