Компіляція та запуск MPI додатків
На обчислювальні вузли (ОВ) передбачається встановлювати декілька реалізацій та версій MPI.
Для уникнення конфліктів між різними версіями, установка виконується в директорію, шлях до якої визначається за наступним правилом:
/opt/<MPI name>/<MPI version>/<compiler name>/<compiler version>, де
<MPI name> - назва реалізації MPI (наприклад, ompi (скорочення від OpenMPI), mvapich тощо);
<MPI version> - версія MPI;
<compiler name> - назва компілятора, що використовується;
<compiler version> - версія компілятора.
Компіляція виконується безпосередньо на обчислювальному вузлі, оскільки саме там встановлені MPI та компілятори. Крім того, компіляцію додатків необхідно виконувати в тому оточенні, в якому вони повинні працювати.
Оскільки на SCIT3 та SCIT4 використовуються різні ОС, відповідно CentOS 5 та CentOS 6, то для кожного з них необхідно скомпілювати свій екземпляр програми.
Компіляція
Приклади MPI Hello World на C, C++, Fortran можна знайти на сервері доступу до кластера (access) в директорії /usr/share/doc/scit/mpi_examples.
Копіюємо до себе в домашній каталог директорію з прикладами та переходимо в неї:
[login@access ~]$ cp -r /usr/share/doc/scit/mpi_examples .
[login@access ~]$ cd mpi_examples
Компіляцію та невеликі тестові задачі зручно виконувати на спецільних розділах (scit4_lt для SCIT4 и lite_task для SCIT3), на яких максимальний час виконання обмежено до 1 години, завдяки цьому в даних розділах немає великої черги задач і ОВ зазвичай можна отримати майже миттєво.
Алокуємо ОВ та перходим на нього:
[login@access mpi_examples]$ srun -p scit4_lt --pty bash
[login@g3211 mpi_examples]$
На ОВ в диреуторію /opt встановлено декілька різних весій MPI та компіляторів. Найбільш стабільною і перевіреною є OpenMPI версії 1.6.5 з компіляторами GCC версії 4.4, котра знаходиться в директорії /opt/ompi/1.6.5/gcc/4.4 , тому рекомендується починати саме з неї.
Ручна
Кожний окремий файл можна компілювати вручну:
[login@g3211 mpi_examples]$ /opt/ompi/1.6.5/gcc/4.4/bin/mpicc hello_c.c -o hello_c
[login@g3211 mpi_examples]$ /opt/ompi/1.6.5/gcc/4.4/bin/mpicxx hello_cxx.cc -o hello_cxx
[login@g3211 mpi_examples]$ /opt/ompi/1.6.5/gcc/4.4/bin/mpif77 hello_f77.f -o hello_f77
[login@g3211 mpi_examples]$ /opt/ompi/1.6.5/gcc/4.4/bin/mpif90 hello_f90.f90 -o hello_f90
Makefile
Оскільки виконувати компіляцію вручну не зручно, доцільно скористатися утилітою GNU Make, яка може суттєво спростити процес компіляції.
Для цього знадобиться створити Makefile, приклад якого можна знайти в директорії mpi_examples:
[login@g3211 mpi_examples]$ cat Makefile
MPI_PATH ?= /opt/ompi/1.6.5/gcc/4.4
CC = $(MPI_PATH)/bin/mpicc
CXX = $(MPI_PATH)/bin/mpicxx
F90 = $(MPI_PATH)/bin/mpif90
F77 = $(MPI_PATH)/bin/mpif77
EXAMPLES = hello_c hello_cxx hello_f77 hello_f90
all: $(EXAMPLES)
clean:
rm -f $(EXAMPLES) *~ *.o
hello_c: hello_c.c
$(CC) $(CFLAGS) $^ -o $@
hello_cxx: hello_cxx.cc
$(CXX) $(CXXFLAGS) $^ -o $@
hello_f77: hello_f77.f
$(F77) $(F77FLAGS) $^ -o $@
hello_f90: hello_f90.f90
$(F90) $(F90FLAGS) $^ -o $@
Компіляція тих же прикладів за допомогою Makefile та утиліти make буде виглядати так:
[login@g3211 mpi_examples]$ make
/opt/ompi/1.6.5/gcc/4.4/bin/mpicc hello_c.c -o hello_c
/opt/ompi/1.6.5/gcc/4.4/bin/mpicxx hello_cxx.cc -o hello_cxx
/opt/ompi/1.6.5/gcc/4.4/bin/mpif77 hello_f77.f -o hello_f77
/opt/ompi/1.6.5/gcc/4.4/bin/mpif90 hello_f90.f90 -o hello_f90
Для компіляції з іншою версією MPI, досить змінити значення змінної MPI_PATH в Makefile або встановити нове значення MPI_PATH за допомогою відповідної змінної оточення:
[login@g3211 mpi_examples]$ make MPI_PATH=/opt/ompi/1.6.5/gcc/4.8
/opt/ompi/1.6.5/gcc/4.8/bin/mpicc hello_c.c -o hello_c
/opt/ompi/1.6.5/gcc/4.8/bin/mpicxx hello_cxx.cc -o hello_cxx
/opt/ompi/1.6.5/gcc/4.8/bin/mpif77 hello_f77.f -o hello_f77
/opt/ompi/1.6.5/gcc/4.8/bin/mpif90 hello_f90.f90 -o hello_f90
Після виконання компіляції виходимо з ОВ:
[glad@g3211 mpi_examples]$ exit
Запуск
[login@access mpi_examples]$ srun -n2 -pscit4 ./hello_c
Hello, world, I am 1 of 2
Hello, world, I am 0 of 2
Фонова (batch) задача
Для запуску фонової задачі можна скористатися скриптом run.ompi. В цьому випадку запуск задачі буде виглядати так:
[login@access examples]$ sbatch -n 2 -pscit4 run.ompi ./hello_c
sbatch: Submitted batch job 103904
[login@access examples]$ cat slurm-103904.out
Hello, world, I am 0 of 2
Hello, world, I am 1 of 2
Деякі корисні опції
Під час запуску задач, що використовують GPU, може знадобитися, щоб процеси задачі розподілялися, виходячи з кількості GPU на ОВ. На кожному ОВ розділу scit4 встановлено по 3 GPU.
Запустити задачу так, щоб на кожний вузол припадало 3 процеси, можна за допомогою опції --ntasks-per-node (див. man sbatch):
[login@access examples]$ sbatch -n6 --ntasks-per-node=3 -pscit4 run.mvapich2 hostname -s
sbatch: Submitted batch job 103909
[login@access examples]$ cat slurm-103909.out
g4101
g4101
g4101
g4102
g4102
g4102