Работа с 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++
(В русской версии Visual C++=>Общие, «Пустой проект»)
Открыть свойства проекта.
2 – Поменять значение поля Subsystem в Linker=>System на CONSOLE(/SUBSYSTEM:CONSOLE) (для русской версии VS: Компоновщик=>Система=>Подсистема)
3 – Добавить к компоновщику (Linker) путь к дополнительным библиотекам (в русской версии VS необходимо зайти на вкладку Общие)
4 – Добавить к компоновщику (Linker) дополнительные зависимости . Вписать msmpi . lib Ws2_32.lib. В данной программе используется дополнительная зависимость Ws2_32.lib, данная библиотека используется для сетевого взаимодействия, в других проектах может быть и не задействована.
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) пути для дополнительных файлов (для русской версии: дополнительные каталоги включения):
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
Результат:
Использование программы 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
Запуск задач с помощью 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 указывает менеджеру задач, что выбранные ресурсы будут заняты данной задачей эксклюзивно.
Следующая вкладка Task List, отвечает за добавление подзадач:
Добавить можно Basic Task, Parametric Task, Task From File.
Command line: как необходимо запускать задачу.
mpiexec \\hnwindows\share\myMPIProject.exe *
(. exe можно опустить).
Working directory: рабочая директория, относительно которой будут определяться абсолютные пути для standard input/output/error.
Standard input: файл с входными данными
Standard output: файл для выходных данных
Standard error: файл для ошибок выполнения.
После нажатия Submit, если всё было заполнено верно, задача появится в вкладке Active:
После окончания расчётов задача сменит статус либо на Finished:
Поскольку не был указан файл для выходных данных, мы можем посмотреть их, два раза нажав на свойствах задачи в окне внизу.
Пример запуска параметрической задачи из командной строки:
Job submit /parametric:6-12:1 /jobname:”MyParametricSweep” mpiexec \\hnwindows\share\MyMPIProject.exe *
Интеграция Visual Studio и mpiexec.
Есть также дополнительный способ интеграции Visual Studio и mpiexec, нестандартный, но, тем не менее, позволяющий оперировать кластерными вычислениями непосредственно из Visual Studio, без запуска HPC Cluster Manager, mpiexec и т.д.
Так, в подменю Tools находится раздел Other tools (в русской версии Сервис=>Внешние инструменты).
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 кластера), и данному аспекту будет посвящён отдельный пост.