Инструкция по работе

  1.   Программно-аппаратная среда кластера HybriLIT
  2.   Начало работы: удаленный вход на кластер
  3.   Планировщик задач SLURM
  4.   5 основных шагов для проведения расчетов на кластере
  5.   Компиляция и запуск OpenMP-приложений
  6.   Компиляция и запуск MPI-приложений
  7.   Компиляция и запуск CUDA-приложений
  8.   Планировщик задач SLURM: scripts
  9.   Компиляция и запуск гибридных приложений OpenMP+CUDA
  10.   Компиляция и запуск гибридных приложений MPI+CUDA
  11.   Компиляция и запуск OpenCL-приложений
  12.   Основные команды Linux
  13.   Профилирование MPI-приложений
  14.   Инструкция по установке MobaXterm
  15.   Инструкция по использованию программы GNUPlot


Программно-аппаратная среда кластера HybriLIT

Гетерогенный вычислительный кластер HybriLIT содержит вычислительные узлы с многоядерными процессорами Intel, графическими процессорами Nvidia и сопроцессорами Intel Xeon Phi (Подробные характеристики в разделе «Характеристики кластера«).

Типы основных вычислительных узлов:

  1. Узлы с многоядерными CPU и сопроцессорами Intel Xeon Phi
  2. Узлы с многоядерными CPU и  3 графическими ускорителями Nvidia Tesla K40
  3. Узлы с многоядерными CPU и 2 (4) графическими ускорителями Nvidia Tesla K80
  4. Mix-узел с многоядерными CPU и   сопроцессорами Intel Xeon Phi и графическим ускорителем Nvidia Tesla K20

Гетерогенный кластер находится под управлением операционной системы Scientific Linux 6.7 , с планировщиком задач <SLURM и установленным программным обеспечением: компиляторами и пакетами для разработки, отладки и профилировки параллельных приложений, а также пакетом Modules.


Пакет Modules

Для динамического изменения переменных окружения на кластере установлен пакет Modules 3.2.10. Данный пакет позволяет пользователю изменять список компиляторов для сборки приложений с поддержкой основных языков программирования (C/C++, FORTRAN, Java), технологий параллельного программирования (OpenMP, MPI, OpenCL, CUDA) и использовать установленные на кластере пакеты программ. Перед компиляцией приложения пользователю необходимо загрузить модули, необходимые для работы.

Основные команды для работы с модулями:

drawit-diagram-8Загруженные модули не сохраняются между сессиями, если Вам нужно всегда использовать один набор модулей, допишите команду:

Также Вы можете подключить версии компиляторов и пакеты, которые установлены в системе cvmfs (CernVM File System).


CernVM File System

Добавление системы CernVM-FS к установленному списку программных пакетов позволяет получить доступ к установленному программному обеспечению CERN.
Список доступных пакетов можно посмотреть, выполнив команду:

Стоит отметить, что директория /cvmfs/sft.cern.ch/ монтируется динамически при обращении к ее содержимому и спустя некоторое время бездействия может исчезнуть из списка доступных директорий. Заново смонтировать ее можно, повторно выполнив команду

Для использования компиляторов и программных пакетов необходимо выполнить команду:

Директории в cvmfs имеют определенную структуру. Рассмотрим ее на примере пакета ROOT. Полный путь до директории будет выглядеть следующим образом:

где /6.07.02-f644e – версия пакета ROOT, в названии директории /x86_64-slc6-gcc49-opt: x86_64 указывает на поддержку 64-битности пакета, slc6 – то, что компиляция пакета из исходного кода проводилась под Scientific Linux 6, gcc49 – пакет компилировался с применением gcc 4.9.9.
Файлы с переменными окружения могут иметь одно из двух имен:

  • setup.sh

Например, команда для использования компилятора gcc 4.9.3 будет выглядеть следующим образом

  • [ИМЯ_ПАКЕТА]-env.sh

Например, для пакета ROOT 6.07.02 команда будет выглядеть следующим образом



Начало работы: удаленный вход на кластер

Удаленный доступ к  гетерогенному вычислительному кластеру HybriLIT открыт только по протоколу SSH.
DNS адрес гетерогенного кластера:

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


Для пользователей  OS Linux

Запустите терминал и введите:

где USERNAME – логин, который Вы получили при регистрации, hydra.jinr.ru – адрес сервера. После требования системы ввести пароль — введите его. В случае успешной авторизации на кластере Вы увидите командную строчку на экране:

Это означает, что Вы подключились к кластеру и находитесь в своем домашнем каталоге.
drawit-diagram-8 При первой попытке доступа появится уведомление о незнакомом IP-адресе, к которому Вы пытаетесь подключиться. Наберите yes, нажмите Enter, и этот адрес будет добавлен в список известных адресов.

drawit-diagram-8Для запуска с поддержкой графического интерфейса введите в терминале


Для пользователей OS Windows

Для подключения к кластеру пользователей Windows необходимо использовать специальную программу – SSH-клиент, например, PuTTY.

Установка для программы PuTTY не требуется. Нужно просто скачать файл putty.exe  по ссылке http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe в удобное место на компьютере и запустить его.

Ниже описана пошаговая процедура настройки PuTTY для доступа к кластеру.

  • В поле Host Name (or IP address) введите адрес сервера: hydra.jinr.ru
  • В поле Saved Sessions введите предпочтительное имя для текущего подключения (например, hydra.jinr.ru).
  • Для подключения удаленного графического интерфейса X11 переходим на вкладку Connection SSH>X11и выделяем поле Enable X11 forwarding
  • Проверяем, что на вкладке Connection > SSH > Tunnels выделено поле Local ports accept connection from other hosts

drawit-diagram-11

  • После этого возвращаемся во вкладку Sessions и нажимаем Save, чтобы сохранить все наши изменения.
  • Нажимаем Open для подключения к кластеру HybriLIT и вводим логин и пароль, которые Вы получили при регистрации.

drawit-diagram-12
В случае успешной авторизации на кластере Вы увидите командную строчку на экране:

Это означает, что Вы подключились к кластеру и находитесь в своем домашнем каталоге.
drawit-diagram-8При первой попытке доступа появится уведомление о незнакомом IP-адресе, к которому Вы пытаетесь подключиться. Наберите yes , нажмите Enter, и этот адрес будет добавлен в список известных адресов.

drawit-diagram-8Для запуска с поддержкой графического интерфейса введите



Планировщик задач SLURM

SLURM – это высоко масштабируемый отказоустойчивый менеджер кластеров и планировщик заданий с открытым кодом, который обеспечивает три основные функции:

  • Выделяет эксклюзивный и/или неэксклюзивный доступ к ресурсам (компьютерные узлы) для пользователей в течение некоторого периода времени;
  • Обеспечивает основу для запуска, работы и мониторинга работы (как правило, параллельной работе) на множестве выделенных узлов;
  • Поддерживает очередь ожидающих заданий и управляет общей загрузкой ресурсов в процессе выполнения работы.

1. Основные команды

К основным командам планировщика SLURM относятся: sbatch, scancel, sinfo, squeue, scontrol.

  • sbatch — команда для запуска приложения в режиме очереди

После запуска приложению присваивается персональный номер jobid, по которому его можно найти в списке запущенных приложений (squeue). Результат записывается в файл с именем slurm-jobid.out.
Пример использования sbatch:

  • squeue — команда для просмотра списка запущенных приложений в очереди;

Одним из основных параметров списка является состояние приложений. Запущенное приложение может иметь одно из следующих состояний:

  •  RUNNING (R) – выполняется;
  •  PENDING (PD) – в очереди;
  • COMPLETING (CG) – завершается. (в этом состоянии, возможно, может понадобиться помощь системного администратора для удаления приложения из очереди).

Пример использования squeue:

  • sinfo — команда для просмотра состояния вычислительных узлов и очередей. Вычислительные узлы могут быть в одном из следующих состояний:
  1. idle – узел свободен;
  2. alloc – узел используется процессом;
  3. mix – узел частично занят, частично свободен;
  4. down, drain, drng – узел заблокирован.

Пример использования sinfo:

  • scancel — команда для удаления приложения из очереди.

Пример использования scancel для удаления из очереди приложения с jobid 141980:

  • scontrol — используется для просмотра или изменения состояния SLURM, включающего: задачи, узла и очереди. Многие из управляющих команд могут выполняться только суперпользователем.

Пример использования scontrol для просмотра характеристик запущенного приложения:

Список характеристик содержит такие параметры, как:

 параметр          функция
UserId  имя пользователя
JobState  состояние приложения
RunTime текущее время расчетов
Partition используемая очередь
NodeList используемые узлы
NumNodes число используемых узлов
NumCPUs число используемых ядер процессора
Gres число используемых графических ускорителей или сопроцессоров
MinMemoryCPU      количество используемой оперативной памяти
Command  расположение файла для запуска приложения
StdErr расположение файла с ошибками
StdOut расположение файла с выходными данными

Пример использования scontrol для просмотра характеристик узлов:

Список характеристик содержит такие параметры, как:
NodeName – hostname вычислительного узла;
CPUAlloc – количество загруженных вычислительных ядер;
CPUTot – общее число вычислительных ядер на узле;
CPULoad – загрузка вычислительных ядер;
Gres – число доступных для расчетов графических укорителей и сопроцессоров;
RealMemory – общее количество оперативной памяти на узле;
AllocMem – количество загруженной оперативной памяти;
State – состояние узла.


2. Очереди

Запуск задачи осуществляется с помощью постановки ее в очередь на счет. Так как HybriLIT является гетерогенным кластером, то для использования различных ресурсов были созданы отдельные очереди.

На текущий момент HybriLIT содержит 6 очередей:

  • <interactive* — включает 1 вычислительный узел с 2 Intel Xeon E5-2695 v2 12-cores, 1 NVIDIA Tesla K20X, 1 Intel Xeon Coprocessor 5110P (* означает, что очередь используется по умолчанию). Очередь подойдет для запуска тестовых программ. Время расчетов для этой очереди ограничено и составляет 1 час;
  • cpu — включает 4 вычислительных узла с 2 Intel Xeon E5-2695 v2 12-cores на каждом. Очередь подойдет для запуска приложений, использующих центральные процессоры для расчетов;
  • gpu — очередь включает 3 вычислительных узла с 3 NVIDIA Tesla K40 (Atlas) на каждом. Очередь подойдет для запуска приложений, использующих графические ускорители для расчетов;
  • gpuK80 — очередь включает 3 вычислительных узла с 2 NVIDIA Tesla K80 на каждом. Очередь подойдет для запуска приложений, использующих графические ускорители для расчетов;
  • phi — очередь включает 1 вычислительный узел с 2 Intel Xeon Coprocessor 7120P. Очередь подойдет для запуска приложений, использующих сопроцессоры для расчетов;
  • long — очередь включает 1 вычислительный узел с  NVIDIA Tesla. Очередь подойдет для запуска приложений, требующих длительных (до 14 дней) вычислений;

3. Описание и примеры script-файлов

Для запуска приложения с помощью команды sbatch требуется использовать script-файл. В общем случае, script-файл – это обычный bash файл, удовлетворяющий следующим правилам:

drawit-diagram-8

  • Первая строка содержит #!/bin/sh (или #!/bin/bash) , что позволяет скрипту быть запущенным как bash-script;
  • Строки, начинающиеся с #  — это комментарии;
  • строки, начинающиеся с #SBATCH , устанавливают параметры для планировщика SLURM;
  • Все параметры планировщика SLURM должны быть установлены до непосредственного запуска приложения;
  • Script-файл содержит команду для запуска приложений.

SLURM имеет большое количество различных параметров (https://computing.llnl.gov/linux/slurm/sbatch.html). Ниже приведены параметры обязательные или рекомендованные для использования на кластере HybriLIT:

  • -p  — используемая очередь. В случае отсутствия данного параметра задача будет поставлена в интерактивную очередь, время выполнения в которой ограничено 1 часом. В зависимости от типа используемых ресурсов приложение может быть запущено в одной из существующих очередей: cpu, phi, gpu, gpuK80;
  • -n  — число используемых процессов;
  • -t  — резервируемое время расчетов. Это обязательный параметр. Доступны следующие форматы: minutes, minutes:seconds, hours:minutes:seconds, days-hours, days-hours:minutes, days-hours:minutes:seconds;
  • --gres  — число резервируемых графических ускорителей NVIDIA или сопроцессоров Intel Xeon Phi. Это обязательный параметр для задач, использующих gpu или сопроцессоры Intel Xeon Phi;
  • --mem  — резервируемая оперативная память, в мегабайтах. Это необязательный параметр, но если ваше приложение использует большое количество оперативной памяти, рекомендуется задать данный параметр;
  • -N  – число используемых узлов. Этот параметр следует устанавливать только в том случае, если количество ресурсов на 1 узле недостаточно для выполнения вашего расчета;
  • -o  – имя выходного файла. По умолчанию результат записывается в файл с именем slurm-jobid.out.

Ниже приведены примеры скриптов, использующие различные ресурсы гетерогенного кластера HybriLIT.

  • Для расчетов на CPU:

  • Для расчетов с использованием GPU:

  • Для расчетов с использованием Intel Xeon Coprocessor:

Примеры script-файлов для различных технологий программирования будут приведены ниже в соответствующих разделах.



5 основных шагов для проведения расчетов на кластере

  • Для проведения расчетов на кластере можно выделить основных шагов:

drawit-diagram-3

Компиляция и запуск OpenMP-приложений

OpenMP (Open Multi-Processing) — открытый стандарт для разработки многопоточных программ на языках С, С++ и Fortran. Содержит набор директив компилятора, библиотечных процедур и переменных окружения, которые предназначены для разработки многопоточных приложений на многопроцессорных системах с общей памятью. Программная модель — Fork-Join Model, которая заключается в следующем (Рис.1.):

  • Любая программа начинает работу в нулевом потоке (Master thread), далее  нулевой поток создает  (с помощью директив компилятора) группу потоков  — FORK, которые выполняются параллельно, затем, по завершении работы порожденных потоков в параллельной области, происходит синхронизация — JOIN,  и программа продолжает работу в основном потоке.

drawit-diagram-19

Рис.1. Программная модель Fork-Join.


Компиляция

Используются стандартные компиляторы с ключами поддержки OpenMP. Доступны компиляторы GNU и Intel. Доступны компиляторы GNU версии 4.4.7 (утсановлен по умолчанию), 4.8.4 и 4.9.3. с поддержкой OpenMP. Перед компиляцией с использованием Intel — компиляторов необходимо загрузить соответствующий модуль:

Ниже представлены команды для компиляции программ, написанных на С, С++ или Fortran для различных компиляторов:

          Intel GNU PGI
C icc -openmp hello.c gcc -fopenmp hello.c pgcc -mp hello.c
C++ icpc -openmp hello.cpp g++ -fopenmp hello.cpp  pgc++ -mp hello.cpp
Fortran    ifort -openmp hello.f gfortran -fopenmp hello.f pgfortran -mp hello.f

При успешной компиляции образуется исполняемый бинарный файл. По умолчанию имя бинарного файла для всех компиляторов - a.out . Другое имя можно задать с помощью ключа -o . Например, в результате выполнения команды:

имя бинарного файла будет hello.


Запуск

Запуск OpenMP-приложений  осуществляться с помощью script-файла,  содержащего следующую информацию:

Использование следующей установки оптимизирует распределение потоков по вычислительным ядрам и, как правило, обеспечивает меньшее время счета по сравнению с расчетом без использования этой команды.

Число OMP-нитей (потоков) может быть  задано  с помощью переменной окружения OMP_NUM_THREADS  до выполнения программы в командной строке:

где threads — количество OMP-нитей.

Таким образом, рекомендуемый script-файл для OpenMP-приложений, например, с 5-ю потоками имеет вид:

Для запуска приложения используется следующая команда:

Компиляция и запуск MPI-приложений

Message Passing Interface (MPI, интерфейс для передачи сообщений) — программный интерфейс (API) для передачи информации, который позволяет обмениваться сообщениями между процессами, выполняющими одну задачу.

Для работы с MPI доступны компиляторы GNU и Intel.


Компиляторы GNU

MPI-программы могут компилироваться GNU-компиляторами с библиотекой OpenMPI. GNU-компиляторы устанавливаются на HybriLIT по умолчанию. Для доступа к OpenMPI-библиотекам нужно добавить подходящий модуль 1.8.8, или 2.1.2:

или

 

 

Компиляция

Ниже представлены команды для компиляции программ, написанных на С, С++ или Fortran для GNU-компилятора:

     Язык программирования     Команды вызова компилятора
C mpicc
C++ mpiCC / mpic++ / mpicxx
Fortran 77 mpif77 / mpifort (*)
Fortran 90 mpif90 / mpifort (*)

drawit-diagram-8(*) Рекомендуется использовать команду mpifort вместо mpif77 или mpif90, которые считаются устаревшими. С помощью mpifort можно компилировать любые Fortran-программы, использующие в качестве интерфейса « mpif.h » или « use mpi «.

Пример компиляции программы на языке С:

Если не задавать имя исполняемого файла, получаемого после успешной компиляции, ему по умолчанию присваивается имя a.out .

Для запуска программы с использованием модулей OpenMPI используется script:


Intel-компилятор

Для использования MPI с Intel-компилятором нужно добавить модуль

MPI-библиотека входит в состав этого модуля.

Компиляция

Ниже представлены команды для компиляции программ, написанных на С, С++ или Fortran для Intel-компилятора:

     Язык программирования     Команды вызова компилятора
C mpiicc
C++ mpiicpc
Fortran  mpiifort

Пример компиляции программы на языке Fortran:


drawit-diagram-8Опции оптимизации компиляторов:

  Опция                     Назначение
-O0 без оптимизации; используется по умолчанию для GNU-компилятора
-O2 используется по умолчанию для Intel-компилятора
-O3 может быть эффективна для определенного класса программ
-march=native         -march=core2 настройка на архитектуру процессоров (использование дополнительных возможностей процессоров Intel)

Запуск задачи на счет

В счетном режиме запуск задачи на счет осуществляется планировщиком SLURM командой:

где script_mpi – имя заранее заготовленного script-файла, содержащего «паспорт задачи».

Пример script-файла для запуска MPI-приложений на двух вычислительных узлах

Далее приведены два способа распределения MPI процессов по вычислительным узлам.

Пример использования комбинации ключей --tasks-per-node  и -n : задается 10 процессов  ( -n 10 )  по 5  процессов на один вычислительный узел ( --tasks-per-node=5). Таким образом, вычислительная работа распределяется по  2 вычислительным узлам:

Пример использования комбинации ключей --tasks-per-node  и -N:  задается  по 5  процессов на один вычислительный узел  ( --tasks-per-node=5 ) и количество узлов ( -N 2 ). Таким образом,  создается 10 процессов и вычислительная работа распределяется по  2  узлам:

drawit-diagram-8Дополнительные узлы (**) имеет смысл заказывать, если для решения задачи требуется большое число параллельных процессов (больше 24).

Пример простейшего script-файла, в котором из множества возможных SLURM-директив фигурируют только самые необходимые:

Здесь исполняемый файл a.out, изготовленный компилятором, отправляется во входную очередь задач, предназначенных для счета на cpu-подмножестве кластера HybriLIT. Задача требует 7 ядер. Задача получит уникальный номер во входной очереди. Пусть это будет 1234. Тогда листинг задачи будет оформлен как файл slurm-1234.out в той же директории, где находился ее исполняемый файл a.out.

drawit-diagram-8

В программе на языке Fortan для подключения MPI-процедур обычно используется оператор Include ‘mpif.h’ , который можно заменить на более функциональный вариант – модуль mpi.mod, подключаемый командой Use mpi.

drawit-diagram-8

При запуске задачи на счет

  • необходимо учитывать существующие ограничения по ресурсам на кластере;
  •  желательно использовать тот модуль установки переменных окружения, с которым программа была откомпилирована;
  • пока задача не досчиталась до конца, нельзя удалять исполняемый файл и менять входные данные.

Компиляция и запуск CUDA-приложений

CUDA (Compute Unified Device Architecture) — программно-аппаратная архитектура параллельных вычислений, которая позволяет существенно увеличить вычислительную производительность благодаря использованию графических процессоров фирмы NVIDIA (GPU).

Доступные версии CUDA

Наиболее эффективной технологией, позволяющей использовать графические процессоры NVIDIA, является платформа параллельных вычислений Compute Unified Device Architecture (CUDA), обеспечивающая набор расширений для языков C/С++ , Fortran.

Для разработки параллельных приложений (отладки, профилирования и компиляции), использующих графические процессоры NVIDIA Telsa на кластере HybriLIT, доступны два компилятора с поддержкой CUDA:

  • Реализация CUDA для языка C/C++ компании NVIDIA, основанная на компиляторе с открытым исходным кодом Open64: компилятор nvcc.
  • Реализация CUDA для Fortran c закрытой лицензией от компании Portland Group Inc. (PGI): pgfortran

Компиляция CUDA C/C++ приложений

На кластере доступны следующие версии CUDA, подключаемые через соответствующие модули пакета MODULES:

     Версия CUDA     Подключаемый модуль
7.5 $ module add cuda/7.5
8.0   $ module add cuda/v8.0-1
9.1.2.   $ module add cuda/v9.1-2
9.2 $ module add cuda/v9.2

Для проведения расчетов с использованием графических ускорителей доступны три представителя семейства графических ускорителей NVIDIA Tesla: Tesla K20X, Tesla K40, Tesla K80. Согласно принятой NVIDIA системе наименования архитектур, графические процессоры именуют как sm_xy , где х обозначает число GPU-поколения,   у  — версии в этом поколении. Графические процессоры Tesla K20 и Tesla K40  имеют архитектуру sm_35 ,   а процессоры Tesla K80sm_37 .

CUDA  7.5, 8.0, 9.1.2, 9.2

Для компиляции CUDA-приложений, поддерживающей все имеющиеся на кластере архитектуры, можно использовать одну команду для компиляции (для CUDA версий, начиная с 6.5.):

Компиляция приложений с использованием библиотек CUDA

Для проведения расчетов на графических ускорителях программно-аппаратная платформа CUDA предоставляет ряд хорошо оптимизированных математических библиотек,  не требующих специальной установки. Например:

  • библиотека для матрично-векторных операций cuBLAS – реализация библиотеки BLAS (Basic Linear Algebra Subprograms);
  • библиотека CUFFT, реализация быстрого преобразования Фурье (FFT), которая состоит из двух отдельных библиотек: CUFFT и cuFFTW;
  • библиотека cuRAND, предоставляющая средства для эффективной генерации высококачественных псевдослучайных и квазислучайных чисел;
  • библиотека cuSPARSE, предназначенная для операций с разряженными матрицами, например, для решения систем линейных алгебраических уравнений с матрицей системы, имеющей ленточную структуру.

Более подробная информация доступна по ссылке: http://docs.nvidia.com/cuda/

drawit-diagram-8

Ниже представлен пример компиляции приложений с функциями из библиотеки cuBLAS и cuFFT:

Как видно из этой строки компиляции, необходимо только добавить ключи -lcublas  -lcufft.

Запуск GPU-приложений  на кластере в системе SLURM

Для запуска приложений, использующих графические ускорители, в пакетном режиме в системе SLURM необходимо указать в запускаемом script-файле следующие обязательные параметры/опции:

  • имя соответствующей очереди, в зависимости от типа GPU (см. п.1.3.2). Например, для использования в расчетах графических ускорителей NVIDIA Tesla K80 , в script-файл надо добавить строку:

  • количество требуемых графических процессоров (GPU), которое задается опцией

--gres  (Generic сonsumable RESources) в виде:

Например, для использования 3GPU на одном узле, в script-файл надо добавить строку:

Для использования в расчетах большего количества GPU, чем на одном узле, в script-файл надо добавить две строки:

В этом случае будет задействовано вычислительных узла с 3 графическими процессорами на каждом, суммарно 6GPU.

drawit-diagram-8

Особенности вычислений с использованием ускорителя NVIDIA K80.

Графический ускоритель Tesla K80 является двухпроцессорным устройством (два графических процессора в одном устройстве) и обладает почти в два раза более высокой производительностью и вдвое более широкой полосой пропускания памяти по сравнению с предшественником — Tesla K40.

Для задействования 2 процессоров ускорителя Tesla K80 в script-файле необходимо указать параметр -gres=gpu:2 .


Приложения, использующие один графический процессор

Ниже представлены общие script-файлы для запуска приложений с использованием графического ускорителя NVIDIA Tesla K40:

и одного процессора ускорителя Tesla K80 в пакетном режиме в системе SLURM:

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

  • несколько GPU на одном вычислительном узле;
  • несколько вычислительных узлов с графическими процессорами.

Для эффективного использования нескольких графических ускорителей разрабатываются гибридные приложения, например, OpenMP+CUDA, MPI+CUDA,  MPI+OpenMP+CUDA и т.п. Более подробную информацию можно найти в проекте GitLab  “Parallel  features”:  https://gitlab-hybrilit.jinr.ru/


Планировщик задач SLURM : scripts

CUDA (Compute Unified Device Architecture) — программно-аппаратная архитектура параллельных вычислений, которая позволяет существенно увеличить вычислительную производительность благодаря использованию графических процессоров фирмы NVIDIA (GPU).

Доступные версии CUDA

Наиболее эффективной технологией, позволяющей использовать графические процессоры NVIDIA, является платформа параллельных вычислений Compute Unified Device Architecture (CUDA), обеспечивающая набор расширений для языков C/С++ , Fortran.

Для разработки параллельных приложений (отладки, профилирования и компиляции), использующих графические процессоры NVIDIA Telsa на кластере HybriLIT, доступны два компилятора с поддержкой CUDA:

  • Реализация CUDA для языка C/C++ компании NVIDIA, основанная на компиляторе с открытым исходным кодом Open64: компилятор nvcc.
  • Реализация CUDA для Fortran c закрытой лицензией от компании Portland Group Inc. (PGI): pgfortran

Компиляция CUDA C/C++ приложений

На кластере доступны следующие версии CUDA, подключаемые через соответствующие модули пакета MODULES:

     Версия CUDA     Подключаемый модуль
5.5 $ module add hlit/cuda/5.5
6.0 $ module add hlit/cuda/6.0
6.5 $ module add hlit/cuda/6.5
7.0 $ module add hlit/cuda/7.0
7.5 $ module add hlit/cuda/7.5
8.0 $ module add hlit/cuda/8.0

Для проведения расчетов с использованием графических ускорителей доступны три представителя семейства графических ускорителей NVIDIA Tesla: Tesla K20X, Tesla K40, Tesla K80. Согласно принятой NVIDIA системе наименования архитектур, графические процессоры именуют как sm_xy , где х обозначает число GPU-поколения,   у  — версии в этом поколении. Графические процессоры Tesla K20 и Tesla K40  имеют архитектуру sm_35 ,   а процессоры Tesla K80sm_37 .

CUDA 6.5, 7.0, 7.5, 8.0

Для компиляции CUDA-приложений, поддерживающей все имеющиеся на кластере архитектуры, можно использовать одну команду для компиляции (для CUDA версий, начиная с 6.5.):

CUDA 5.5, 6.0

Для компиляции CUDA-приложений, использующих CUDA версий 5.5. и 6.0:

Компиляция приложений с использованием библиотек CUDA

Для проведения расчетов на графических ускорителях программно-аппаратная платформа CUDA предоставляет ряд хорошо оптимизированных математических библиотек,  не требующих специальной установки. Например:

  • библиотека для матрично-векторных операций cuBLAS – реализация библиотеки BLAS (Basic Linear Algebra Subprograms);
  • библиотека CUFFT, реализация быстрого преобразования Фурье (FFT), которая состоит из двух отдельных библиотек: CUFFT и cuFFTW;
  • библиотека cuRAND, предоставляющая средства для эффективной генерации высококачественных псевдослучайных и квазислучайных чисел;
  • библиотека cuSPARSE, предназначенная для операций с разряженными матрицами, например, для решения систем линейных алгебраических уравнений с матрицей системы, имеющей ленточную структуру.

Более подробная информация доступна по ссылке: http://docs.nvidia.com/cuda/

drawit-diagram-8

Ниже представлен пример компиляции приложений с функциями из библиотеки cuBLAS и cuFFT:

Как видно из этой строки компиляции, необходимо только добавить ключи -lcublas  -lcufft.

Запуск GPU-приложений  на кластере в системе SLURM

Для запуска приложений, использующих графические ускорители, в пакетном режиме в системе SLURM необходимо указать в запускаемом script-файле следующие обязательные параметры/опции:

  • имя соответствующей очереди, в зависимости от типа GPU (см. п.1.3.2). Например, для использования в расчетах графических ускорителей NVIDIA Tesla K80 , в script-файл надо добавить строку:

  • количество требуемых графических процессоров (GPU), которое задается опцией

--gres  (Generic сonsumable RESources) в виде:

Например, для использования 3GPU на одном узле, в script-файл надо добавить строку:

Для использования в расчетах большего количества GPU, чем на одном узле, в script-файл надо добавить две строки:

В этом случае будет задействовано вычислительных узла с 3 графическими процессорами на каждом, суммарно 6GPU.

drawit-diagram-8

Особенности вычислений с использованием ускорителя NVIDIA K80.

Графический ускоритель Tesla K80 является двухпроцессорным устройством (два графических процессора в одном устройстве) и обладает почти в два раза более высокой производительностью и вдвое более широкой полосой пропускания памяти по сравнению с предшественником — Tesla K40.

Для задействования 2 процессоров ускорителя Tesla K80 в script-файле необходимо указать параметр -gres=gpu:2 .


Приложения, использующие один графический процессор

Ниже представлены общие script-файлы для запуска приложений с использованием графического ускорителя NVIDIA Tesla K40:

и одного процессора ускорителя Tesla K80 в пакетном режиме в системе SLURM:

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

  • несколько GPU на одном вычислительном узле;
  • несколько вычислительных узлов с графическими процессорами.

Для эффективного использования нескольких графических ускорителей разрабатываются гибридные приложения, например, OpenMP+CUDA, MPI+CUDA,  MPI+OpenMP+CUDA и т.п. Более подробную информацию можно найти в проекте GitLab  “Parallel  features”:  https://gitlab-hybrilit.jinr.ru/


Компиляция и запуск гибридных приложений OpenMP+CUDA

В данном разделе представлен пример запуска приложения, использующего несколько графических процессоров (multi-GPU application) на одном узле. Например, такое приложение может быть написано с использованием двух технологий параллельного программирования  OpenMP+CUDA, в котором каждому потоку/нити (OpenMP-thread) ставится в соответствие один графический процессор.

При использовании в расчетах ускорителей NVIDIA Tesla K40:

При использовании в расчетах ускорителей NVIDIA Tesla K80:


Компиляция и запуск гибридных приложений MPI+CUDA

В данном разделе представлен пример запуска приложения, использующего несколько графических процессоров (multi-GPU application) на нескольких вычислительных узлах. Например, такое приложение может быть написано с использованием двух технологий параллельного программирования  MPI+CUDA, в котором каждому процессу ставится в соответствие один графический процессор, при этом явно указано количество процессов на узел.

При использовании в расчетах ускорителей NVIDIA Tesla K40:

При использовании в расчетах ускорителей NVIDIA Tesla K80:


Компиляция и запуск OpenCL-приложений

Open Computing Language (OpenCL) — язык программирования высокого уровня, основанный на стандарте C99, для разработки параллельных программ, использующих различные вычислительные устройства: графические процессоры, центральные процессоры и другие. При этом параллелизм обеспечивается как на уровне инструкций, так и на уровне данных.

OpenCL является открытым стандартом и поддерживается консорциумом Khronos Group, в который входят крупнейшие IT-компании, включая Intel, NVIDIA и многие другие. Таким образом, программы, написанные на языке OpenCL, могут выполняться практически на всех вычислительных устройствах.

Компиляция приложений, написанных на языке OpenCL

Приложения, написанные на языке OpenCL, могут быть скомпилированы и запущены на различных платформах. Рассмотрим для нашего случая платформу NVIDIA. Для этого необходимо подключить одну из доступных на кластере версий CUDA, используя пакетный модуль MODULES:

где *.* — номер версии от 5.5 и выше.

Для компиляции можно воспользоваться различными компиляторами, например, компилятором GCC:

drawit-diagram-8

При компиляции необходимо добавлять опцию -lOpenCL .

После завершения компиляции в текущей директории появится исполняемый файл с именем a.out по умолчанию. Для задания другого имени исполняемому файлу нужно использовать команду:

Тогда исполняемый файл получит название helloWorld.out .

Запуск OpenCL-приложений

Для запуска приложений необходимо воспользоваться следующим скриптом:

Приложения запускается командой:

После запуска задача получит номер:

После завершения расчетов в текущей директории будет создан файл slurm-XXXXX.out  (где XXXXX  — номер задачи), который будет содержать выходные данные программы. Подробнее ознакомиться с примером helloWord можно по ссылке: https://gitlab-hybrilit.jinr.ru/hybrilit/HybriLitDoc/issues/28


Основные команды Linux

Команда Описание
man <имя_команды> после вводе этой команды на экране появляется информация о команде.
man -k <ключевое_слово> получить список команд, к которым относится данное <ключевое слово>.
Простейшие действия
ls получить список файлов в текущем каталоге
ls-la получить подробный список, включая скрытые файлы
cd <каталог> сменить текущий каталог. Если имя каталога не указывается, то текущим становится домашний каталог пользователя
cp <что_копировать> <куда_копировать> копировать файлы
mv <что_перемещать> <куда_перемещать> переместить или переименовать файл
ln -s <на_что_сделать_ссылку> <имя_ссылки> создать символическую ссылку
rm <файл(ы)> удалить файл(ы)
rm -r <директория> удалить директорию, с параметорм <-r> — рекурсивно
cat <имя_файла> вывод содержимого файла на стандартный вывод (по умолчанию — на экран)
more <имя_файла> просмотр содержимого длинного текстового файла по страницам
less <имя_файла> просмотр содержимого текстового файла с возможностью вернуться к предыдущим страницам. Нажатие q означает выход из программы.
find <каталог> -name <имя_файла>  найти файл <имя_файла>  в  <каталоге>  и отобразить результат на экране
tar -zxvf <файл> распаковать архив tgz  или tar.gz
nano <имя_файла> редактировать текстовый файл с помощью текстового редактора nano
vim <имя_файла>

 

редактировать текстовый файл с помощью текстового  редактора vim
pico<имя_файла> редактировать текстовый файл с помощью текстового редактора pico
mc запустить программу управления файлами MidnightCommander
manmc вывести описание опций MidnightCommander
Стандартные команды
pwd  вывести имя текущего каталога
whoami вывести имя, под которым Вы зарегистрированы
date  вывести текущие дату и время
time <имя программы> выполнить программу и получить информацию о времени, нужном для ее выполнения
ps -a  вывести список текущих процессов в текущем сеансе работы
chmod <права доступа><файл> изменить права доступа к файлу, владельцем которого Вы являетесь
*Есть три способа доступа к файлу:

-чтение —read

-запись — write

-исполнение — execute

 

Отсутствие права доступа показывается как   «-«

Пример:

 

chmod a+r zara

 

 

chmod o-x zara

 

 

chown <новый_владелец> <файлы>

 

chgrp <новая_группа> <файлы>

и три типа пользователей:

— владелец файла  (u)

— члены группы владельца (g)

— все остальные (o)

Эта команда позволит Вам установить права доступа на чтение для файла  zara  для всех (all=user+group+others):

Эта команда отнимет право доступа на исполнение файла у всех, кроме пользователя и группы

изменить владельца файлов

изменить группу принадлежности для файлов

ls -l <имя_файла> проверить текущие права доступа

*если файл доступен всем пользователям, то напротив имени файла будет следующая комбинация букв:   rwxrwxrwx

Контроль процессов
<имя_файла> | grep < фрагмент> поиск <фрагмента> текста в файле <имя_файла>
man grep справка о команде
ps axu | grep <Ваше_имя_пользователя> отобразить все процессы, запущенные в системе от Вашего_имени_пользователя
kill <номер процесса> принудительно завершить («убить») процесс с заданным номером
killall <имя_программы> «убить» все процессы по имени программы

Профилирование MPI-приложений

В данном разделе представлены инструменты Intel Parallel Studio 2016 для профилирования и трассировки MPI-приложений:

MPI Performance Snapshot

MPIPerformanceSnapshot представляет из себя инструмент для профилирования MPI приложений. Данное приложение входит в состав IntelParallelStudio 2016, которая установлена на кластере HybriLIT.

MPIPerformanceSnapshot позволяет анализировать основные параметры, такие как использование памяти, объем пересылок, время работы каждого процесса, задержки в работе и т.д.

Для профилирования приложения необходимо:

  1. Подключить модуль,  обеспечивающий поддержку переменных окружения для работы с IntelParallelStudio: 

  1. Скомпилировать приложение при помощи подключенной библиотеки MPI:

где name_app.cpp — название компилируемого файла.

  1. Запустить исполняемый файл (по умолчанию a.out) с ключом mps, или при помощи script-файла:

  1. Все полученные профилировщиком данные  будет размещены в папке stat_[дата запуска]_[время запуска]. Для генерации отчета в формате HTML (Рис. 1) используется команда:

 Рис.1. Скриншот output-файла MPI Perfomance Snapshot (нажмите на картинку, для перехода на страницу отчета).

Для вывода избранной информации по полученным профилировщиком данных  о приложении рекомендуется использовать ключи из Таблицы 1, например:

Таблица 1. Ключи для выборки данных

[table id=3 /]

Intel Trace Analyzer and Collector

IntelTraceAnalyzerandCollector предназначен для трассировки MPI-процессов.

Основные задачи:

      • Визуализация поведения параллельного приложения;
      • Оценка профилей статистики и балансировки нагрузки;
      • Анализ производительности подпрограмм или блоков кода;
      • Детализация модели обмена, параметров и данных о производительности;
      • Определение горячих точек связи;
      • Уменьшение времени выполнения и повышение эффективности приложения.

Для запуска приложения нужно повторить пункты 1-2 из раздела MPI Performance Snapshot.Затем запустить программу на счет с ключем –trace. Ниже показан пример используемого скрипта:

Для просмотра результатов нужно воспользоваться графической оболочкой ITAC GUI с помощью команды

В результате будет открыто приложение, в которое необходимо загрузить файл (по умолчанию a.out.stf) . Пример работы трассировщика ITAC представлен  на Рис.2.

В верхней части Рис.2. отображается распределение вычислительной нагрузки на MPI-процессах и межпроцессорные коммуникации (шкала Event Timeline), числовые значения отображаются в нижней части рисунка.

itac1

Рис.2  Пример коммуникации в MPI-приложении.

На графике Message Profile можно оценить, какие именно процессы обмениваются сообщениями и какие коммуникации наиболее затратные по времени (Рис. 3).

itac2

Рис.3 Обмены между процессами в MPI приложении.

В пункте Collectiveoperations можно построить таблицу с временными  затратами на коллективные MPI-операции (рис. 4).

Collective_operations-2

Рис. 4 Таблица временных затрат на коллективные операции в MPI-приложении.

Заключение

Из представленного обзора инструментов профилирования и трассировки MPI-приложений можно сделать следующие выводы:

      • MPI Performance Snapshot —  предназначен для  быстрой оценки эффективности, имеет минимальные накладные расходы, обеспечивает профилировку до 32000 MPI процессов, позволяет получить быструю оценку дисбаланса MPI и OpenMP, и получить общую оценку производительности (GFLOPS).
      • Intel Trace Analyzer and Collector —  позволяет провести детальное исследование MPI- приложения, выявить шаблоны коммуникации, локализовать конкретные «узкие» места программы.

Инструкция по установке MobaXterm

1. По ссылке http://mobaxterm.mobatek.net/download-home-edition.html можно на выбор скачать портативную версию программы, не требующую установки (синяя кнопка), и версию с установщиком. Далее рассмотрим версию с установкой.

pic00
2. После скачивания установщика на компьютер, открыть файл MobaXterm_Setup_XX.exe и следовать стандартным шагам установки программы.
pic01
3. По завершению установки на рабочем столе появится ярлык для запуска программы.
pic02
4. Запустите ее и в верхнем меню в разделе Sessions выберите New session
pic03
5. Введите в поле Remote host адрес сервера hydra.jinr.ru и нажмите OK

pic04

6. Откроется новая вкладка, где Вам надо будет ввести логин и пароль для доступа на кластер. И в случае успешной авторизации на кластере Вы увидите командную строчку на экране:

[USERNAME@hydra ~] $
pic05

Инструкция по использованию программы GNUPlot

GNUPlot имеет собственную систему команд, может работать интерактивно (в режиме командной строки) и выполнять скрипты, читаемые из файлов.
Также используется в качестве системы вывода изображений в различных математических пакетах: GNU Octave, Maxima, Reduce и других.

Запуск GNUPlot осуществляется с виртуальной машины space31, для подключения к виртуальной машине ипользуйте команду ssh space31.

После подключения к виртуальной машине, чтобы запустить GNUPlot введите команду:

Для построения графика необходимо ввести команду:

и указать функцию которую вы хотите напечатать. Ниже приведен список наиболее популярных функций.

Программа так же поддерживает построение графиков на основе файлов с данными. Ниже приведен пример тестового файла с данными (testdata.dat):

Для печати графика необходимо выполнить команду:

Для печати графика необходимо выполнить команду:

Настройка графика осуществляется следующими командами:

Для того чтобы запустить скрипт воспользуйтесь командой:

Более подробную информацию о возможностях программы вы можете прочитать на сайте: http://www.gnuplot.info/