Работа с MS-MPI в среде Visual Studio и Windows HPC Server

Этот пост будет посвящен различным аспектам работы с наиболее популярной библиотекой для разработки параллельных программ – MS-MPI.

Для того, чтобы компилировать свои программы, написанные на C/C++/C# с использованием MPI и Visual Studio 2008, необходимо сначала скачать дистрибутив HPC Pack SDK 2008, содержащий все необходимые библиотеки:

- HPC Pack SDK 2008

Аналогично нижеописанному алгоритму производится настройка проекта для MPICH2, за исключением других путей к библиотекам и mpiexec. Настройка проекта и запуск параллельных программ ничем не отличается и в 10-й версии Visual Studio.

В данной инструкции компьютер, на котором осуществляется компиляция и запуск программы, имеет доменное имя hnwindows.

1 – Создать проект C++
clip_image001
(В русской версии Visual C++=>Общие, «Пустой проект»)

Открыть свойства проекта.

2 – Поменять значение поля Subsystem в Linker=>System на CONSOLE(/SUBSYSTEM:CONSOLE) (для русской версии VS: Компоновщик=>Система=>Подсистема)
clip_image002
3 – Добавить к компоновщику (Linker) путь к дополнительным библиотекам (в русской версии VS необходимо зайти на вкладку Общие)
clip_image003
4 – Добавить к компоновщику (Linker) дополнительные зависимости . Вписать msmpi . lib Ws2_32.lib. В данной программе используется дополнительная зависимость Ws2_32.lib, данная библиотека используется для сетевого взаимодействия, в других проектах может быть и не задействована.
clip_image004
5 – добавить файл C++ к проекту (в данной инструкции мы будем использовать программу Hello World), нажать правой кнопкой мыши на названии проекта, Add=>Add an element (для русской версии Добавить=>Создать элемент), где выбрать C++ File:

 #include <iostream>

#include <iomanip>

#include <fstream>

#include <cstdlib>

#include <ctime>

#include <cassert>

#include <math.h>

#include <windows.h>

#include <mpi.h>

using namespace::std; 

int myRank; 

int numProcs; 

char host[256]; 

int main(int argc, char* argv[]) 

{ 

  MPI_Init(&argc, &argv); 

  MPI_Comm_size(MPI_COMM_WORLD, &numProcs); // number of processes involved in run 

  MPI_Comm_rank(MPI_COMM_WORLD, &myRank); // my process id: 0 <= myRank < numProcs 

  gethostname(host, sizeof(host)/sizeof(host[0])); // machine we are running on 

  cout << "Process " << myRank << " of " << numProcs << " is running on '" << host << "'." << endl; 

  MPI_Finalize(); 
  
  return 0; 

}

6 – Вызвать свойства проекта, появится новая вкладка C/C++. Добавить к путям компилятора (Compiler) пути для дополнительных файлов (для русской версии: дополнительные каталоги включения):

clip_image005

7 – Для того, чтобы узлы успешно запустили программу, необходимо скомпилировать нашу программу со всеми зависимостями. Для этого значение «Использование MFC» необходимо поменять на «Использовать MFC в статической библиотеке».

8 – Скомпилировать программу. Build project (в русской версии Построить <имя проекта>).

Бинарный файл, необходимый для запуска, расположен в Start=>Documents=>Documents=>Visual Studio 2008=>Projects=><имя проекта>=>Debug=><имя С++-файла>.exe

Необходимо обратить внимание, что, в случае, если проект «собирается» без указания «MFC как статическая библиотека», размер бинарного файла резко отличается. В случае с данной программой – без статической MFC около 28 кб, с – около 600 кб.

Необходимо также отметить, что, если необходимы многопроцессорные расчёты, то «собирать» MFC в статическом виде не требуется – все необходимые библиотеки есть на том компьютере, на котором происходит разработка. В случае же запуска на кластере MFC в статическом виде просто необходимо, так как на узлах могут отсутствовать необходимые библиотеки.

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

Запуск MPI-программы в различных режимах

Запустим либо cmd, либо Start=>Programs=>HPC Pack 2008=>HPC Power Shell

mpiexec –n 10 \\hnwindows\share\MyMPIProject.exe

Результат:

clip_image008

Использование программы mpiexec (полный список опций можно вызвать mpiexec /help2)

mpiexec [options] executable [args] [ : [options] exe [args] : ... ]

mpiexec -configfile <file name>

-n <количество процессов>

-env <название переменной> <значение переменной>

-wdir <директория, в которой хранятся файлы>

-hosts n host1 [m1] host2 [m2] ... hostn [mn] [список компьютеров в случае использования кластера, синтаксис: -hosts 1 node-12 2 node-13 3 node-14 и др)

-cores <количество ядер, которое нужно задействовать, на каждом процессоре>

В случае успешного добавления должна появиться надпись:

Job has been submitted. ID: [].

Примеры ручного добавления задач:

mpiexec - n 4 pi . exe

mpiexec -hosts 1 server1 master : -n 8 worker

Ручной запуск параллельной задачи на кластере

job submit /numcores:16 mpiexec \\hnwindows\share\MyMPIProject.exe

запустить задачу на 16 ядрах

job submit /parametric:6-12:3 mpiexec \\hnwindows\share\MyMPIProject.exe *

запустить параметрическую задачу, при этом: 6-12 – диапазон изменяемых значений, 3 – шаг между ними, * - место подстановки значений. Соответственно, данная команда запустит три задачи:

MyMPIProject 6

MyMPIProject 9

MyMPIProject 12

clip_image010

Запуск задач с помощью Cluster Manager

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

CM находится в Start=>Programs=>HPC Pack 2008=>HPC Cluster Manager. После запуска необходимо выбрать Job Management в левом нижнем углу, после чего откроется консоль управления задачами. Все задачи разделены на «все», «мои», каждый вид подразделяется на «Настраиваемые в данный момент», «Выполняющиеся», «Закончившиеся», «Закончившиеся с ошибкой», «Отменённые».

Для добавления задач необходимо использовать консоль справа Actions, подменю Job Submission. В зависимости от тип задачи, можно выбрать new Job, new Single-Task Job, new Parametric Sweep job

New Job: диалог для создания задачи, в которой может быть несколько подзадач. Из необходимых для выбор полей отметим Job resources: может быть «ядро», «сокет», «узел». Use assigned resourses exclusively for this job указывает менеджеру задач, что выбранные ресурсы будут заняты данной задачей эксклюзивно.

clip_image012

Следующая вкладка Task List, отвечает за добавление подзадач:

clip_image014

Добавить можно Basic Task, Parametric Task, Task From File.

clip_image016

Command line: как необходимо запускать задачу.

mpiexec \\hnwindows\share\myMPIProject.exe *

(. exe можно опустить).

Working directory: рабочая директория, относительно которой будут определяться абсолютные пути для standard input/output/error.

Standard input: файл с входными данными

Standard output: файл для выходных данных

Standard error: файл для ошибок выполнения.

После нажатия Submit, если всё было заполнено верно, задача появится в вкладке Active:

clip_image018

После окончания расчётов задача сменит статус либо на Finished:

clip_image020

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

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

Job submit /parametric:6-12:1 /jobname:”MyParametricSweep” mpiexec \\hnwindows\share\MyMPIProject.exe *

clip_image022

Интеграция Visual Studio и mpiexec.

Есть также дополнительный способ интеграции Visual Studio и mpiexec, нестандартный, но, тем не менее, позволяющий оперировать кластерными вычислениями непосредственно из Visual Studio, без запуска HPC Cluster Manager, mpiexec и т.д.

Так, в подменю Tools находится раздел Other tools (в русской версии Сервис=>Внешние инструменты).

clip_image024

Command – путь к mpiexec от необходимой реализации MPI. В аргументах необходимо указать путь к проекту ($(TargetPath)), в Initial Directory – директорию проекта.

Из полезных дополнительных опций следует отметить use output window – использовать консоль для вывода результатов.

Таким образом, мы получаем полный доступ к функциональности mpiexec и других утилит, поставляемых с HPC Pack 2008. В качестве пример приведу настройку External tools для добавления и расчёта задачи на кластере в HPC Job Manager:

Command: C:\Program Files\Microsoft HPC Pack\Bin\job.exe

Arguments: submit /numcores:16 mpiexec \\hnwindows\share\MyMPIProject.exe

Разумеется, данный пример не иллюстрирует всех возможностей конфигурации External Tools. Данный инструмент достаточно мощный, позволяющий эффективно связывать среду разработки с непосредственно кластером (кроме этого, можно добиться такой конфигурации, что с workstation можно отправлять задачи на расчёт на удалённый headnode кластера), и данному аспекту будет посвящён отдельный пост.