ClusterCompiling

Материал из theor
Перейти к: навигация, поиск

Что нужно знать всем пользователям

Рабочая папка /mpihome/"login"!

Если Вас не устраивает интерпретатор /bin/sh

(Узнать, какой интерпретатор используется, можно так:

echo $SHELL

) Если есть необходимость - желание перенастроить интерпретатор с /bin/sh на /bin/bash, вставьте в начало файла в домашней директории .profile

if [ $SHELL = "/bin/sh" ]; then
  if [ -f /bin/bash ]; then
    SHELL=/bin/bash
    export SHELL
    exec /bin/bash --login
  fi
fi

Заработает после перезапуска консоли.

Простейший запуск программы: скомпилировал->запустил->вывод на экран:

  • Выполнить (fortran/С соответственно) (если вы не хотите каждый раз при входе на кластер выполнять какую-либо команду, например, эту, впишите её в файл .bashrc в своей домашней директории, и она будет выполняться автоматически при входе)
source /opt/intel/Compiler/11.0/074/bin/ifortvars.sh intel64
source /opt/intel/Compiler/11.0/074/bin/iccvars.sh intel64
  • Скомпилировать программу на фортране90 (компилятор = intel, test.f заменить на свою программу)
mpif77 -fc=ifort test.f
  • Скомпилировать программу на фортране90 (компилятор = gfortran, test.f заменить на свою программу)
mpif77 -fc=gfortran test.f
  • Скомпилировать программу на С/С++ (компилятор = intel, test.cpp заменить на свою программу)
mpiсс -fc=iсс test.cpp
  • Скомпилировать программу на С/С++ (компилятор = g++, test.cpp заменить на свою программу)
mpiсс -fc=g++ test.cpp
  • Запуск на NN процессорах
srun -n NN ./a.out

Запуск задачи с выключением сессии

Используйте утилиту "screen": [http://help.ubuntu.ru/wiki/screen] : Открываете "screen", запускаете как обычно (srun -n ...), закрываете screen.

Запуск задачи в фоновом режиме (аналогично запуску с выключением сессии)

После команды запуска добавьте "&", например,

srun -n 20 sleep 1000 &  

Запуск задачи с выводом в файл (в этом случае не требуется оставлять включённую сессию):

Используется планировщик задач "SLURM", см. [https://computing.llnl.gov/linux/slurm/]

Создаём в рабочей директории файл-скрипт e.g. mytask следующего содержания

#!/bin/sh

#SBATCH -o my.stdout # файл вывода данных, заменяющий вывод на экран

#SBATCH -n14 # запуск на 14 процессорах

#SBATCH -w "blade[1-2]" # использовать 1 и 2 блейды

srun a.out # собственно запуск

Ставим задачу в очередь

$sbatch mytask

Проверяем статус задачи

$squeue

Запуск задачи с большим объёмом выходных данных

Если расчёты генерируют большой объём выходных данных, выполнять их лучше без использования сети для сохранения данных во время вычисления, то есть сохранять данные на локальных вычислительных блейдах. Для того, чтобы это сделать, можно использовать файл следующего содержания:

DIRSIM=your_program_directory
EXEC=/mpihome/your_user_name/exe
DIRIN=/mpihome/your_user_name/from_where_you_want_to_run
BLADES=blade[n1,n2,n3]
NAME=input_file.in
NPROCS=24
#
if [ -d ./output_directory ]
then   echo 'directory output_directory exists.' 
else   mkdir ./output_directory
fi
#
#copy files nesessary for the calculation to local directories on blades
cp -R $DIRIN/$DIRSIM /home/calc/$DIRSIM
srun -w $BLADES cp -R $DIRIN/$DIRSIM /home/calc/$DIRSIM
#
#go to the calculation directory
cd /home/calc/$DIRSIM/
#
#run the code
srun -n $NPROCS -w $BLADES $EXEC/executable_program < /home/calc/$DIRSIM/$NAME
#
#go up one level and zip data files 
cd /home/calc/
srun -w $BLADES gzip -r /home/calc/$DIRSIM/
#
#copy the compressed data to NFS /mpihome... directory
srun -w $BLADES cp -r  $DIRSIM $DIRIN
#
#unzip data files in NFS /mpihome... directory
srun -w $BLADES gunzip -rvf $DIRIN/$DIRSIM
#
#change directory
cd $DIRIN
#
#zip calculated data to one compressed file (to download, for example)
zip -r $DIRSIM.zip  $DIRSIM
#
#change directory
cd $DIRIN/$DIRSIM
#
#remove data from local blades
srun -w $BLADES rm -rf /home/calc/$DIRSIM
rm -rf /home/calc/$DIRSIM

Что он делает, понятно из комментариев. Но для того, чтобы он заработал, нужно разобраться, как и что он делает!

Этот файл запускается просто как программа, без "srun", и (пока нет длинных очередей) необходимо до запуска определить, на каких блейдах вы собираетесь считать. Для его запуска нужно сделать его исполняемым. Курсивом помечены символы, подлежащие замене на то, что Вам нужно.

Чтобы не проводить промежуточную архивацию, можно просто убрать строчки с gzip и gunzip. Следите, чтобы не сервере было достаточно места! Иначе всё перестанет работать.

Запуск всего скрипта нужно делать командой

salloc -w blade[n1,n2,n3] имя файла

в этом случае ресурсы будут заблокированы для остальных задач, пока не закончат выполняться все объявленные в скрипте задания, включая копирование и архивацию.

Запуск нескольких задач одновременно как одного задания

По умолчанию каждое задание га кластере занимает полностью один вычислительный узел, с 8 процессорами и 16Гб ОЗУ. Такой алгоритм позволяет программам использовать ресурсы кластера максимально. Если же одному пользователю требуется выполнить несколько расчётов, например, при разных исходных параметрах, причём количество процессоров и памяти, нужные для каждой задачи отдельно и для всех вместе позволяют использовать меньшее число вычислительных узлов, чем количество задач, разумно использовать опцию --multi-prog . При этом скорость вычисления одной задачи может немного снизиться, пользователь выигрывает во времени, потому что параллельно получает результаты нескольких расчётов.

Например, пусть нужно выполнить расчёт по программе /my-path/a.out для 4 параметров, задающихся в самой программе перед компилированием, и расчёт по программе /my-path-2/b.out для 2 наборов параметров, задающихся входным файлом b.in. Известно, что объём памяти 16Гб достаточен для работы 4 программ a.out и 2 программ b.out. Для оптимального по времени расчёта подготовим директории /my-path-a/,/my-path-b/,/my-path-c/,/my-path-d/, в которых поместим скомпилированные исполняемые файлы a.out для разных параметров. Далее, подготовим директории /my-path-2a/, /my-path-2b/ с программами b.out и входными файлами с нужными параметрами b.in в каждой директории. Для последних двух заданий нужно ещё создать в тех же директориях исполняемые скрипт-файлы "task" содержания

#!/bin/bash
cd /my-path-b1/
/my-path-b1/b.out < b.in

и

#!/bin/bash
cd /my-path-b2/
/my-path-b2/b.out < b.in

Наконец, нужно сделать конфигурационнный файл task.conf следующего содержания:

0 /my-path-a/a.out
1 /my-path-b/a.out
2 /my-path-c/a.out
3 /my-path-d/a.out
4-5 /my-path-2a/task
6-7 /my-path-2b/task 

Теперь запускаем сразу все задания:

srun -n8 -l -v --multi-prog task.conf

Примечание1: Рационально использовать эту опцию, когда известно, что программы считаются примерно одинаковое время, или если программы позволяют продолжать дальнейший расчёт после прерывания.

Примечание2: Если известно, например, что одна программа пожирает менее 4 Гб, разумно запускать одновреммено 4 программы на одном узле (srun -n4 -l -v --multi-prog task.conf), если они однопотоковые или 2-х потоковые. Но даже запуск 2 программ одним пользователем, с частичным использованием памяти, позволит съэкономить вычислительные мощности для других пользователей или задач.

Примечание3: В скрипт "task" можно добавить какие-нибудь опции, например, сжать результаты gzip-ом, построить график gnuplot-ом и так далее.

OpenMP

На кластере установлены компиляторы gfortran и intel fortran. Оба поддерживают технологию OpenMP. Для компилирования соответствующих программ используются ключи -fopenmp для gfortran и -openmp для ifort.