Компіляція та запуск 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
