Цей пост буде присвячений різним аспектам роботи з найбільш популярної бібліотекою для розробки паралельних програм - MS-MPI.
Аналогічно нижчеописане алгоритму проводиться настройка проекту для MPICH2, за винятком інших шляхів до бібліотек і mpiexec. Налаштування проекту і запуск паралельних програм нічим не відрізняється і в 10-й версії Visual Studio.
У даній інструкції комп'ютер, на якому здійснюється компіляція і запуск програми, має доменне ім'я hnwindows.
1 - Створити проект C ++
![Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc (server) Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc](https://images-on-off.com/images/120/msmpivisualstudiowindowshpcserverrusskiy-f0281fa5.jpg)
(У російській версії Visual C ++ => Загальні, «Порожній проект»)
Відкрити властивості проекту.
2 - Поміняти значення поля Subsystem в Linker => System на CONSOLE (/ SUBSYSTEM: CONSOLE) (для російської версії VS: Компоновщик => Система => Підсистема)
![Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc (server) Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc](https://images-on-off.com/images/120/msmpivisualstudiowindowshpcserverrusskiy-875ea6c9.jpg)
3 - Додати до компонувальнику (Linker) шлях до додаткових бібліотек (в російській версії VS необхідно зайти на вкладку Загальні)
![Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc (studio) Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc](https://images-on-off.com/images/120/msmpivisualstudiowindowshpcserverrusskiy-89aa2c11.jpg)
4 - Додати до компонувальнику (Linker) додаткові залежності. Вписати msmpi.libWs2_32.lib. У даній програмі використовується додаткова залежність Ws2_32.lib, дана бібліотека використовується для мережевої взаємодії, в інших проектах може бути і не задіяна.
![Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc (server) Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc](https://images-on-off.com/images/120/msmpivisualstudiowindowshpcserverrusskiy-0343f7fd.jpg)
5 - додати файл C ++ до проекту (в даній інструкції ми будемо використовувати програму Hello World), натиснути правою кнопкою миші на назві проекту, Add => Add an element (для російської версії Додати => Створити елемент), де вибрати C ++ File:
6 - Викликати властивості проекту, з'явиться нова вкладка C / C ++. Додати до шляхів компілятора (Compiler) шляху для додаткових файлів (для російської версії: додаткові каталоги включення):
![Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc (visual) Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc](https://images-on-off.com/images/120/msmpivisualstudiowindowshpcserverrusskiy-4711501d.jpg)
7 - Для того, щоб вузли успішно запустили програму, необхідно скомпілювати нашу програму з усіма залежностями. Для цього значення «Використання MFC» необхідно поміняти на «Використовувати MFC в статичної бібліотеці».
8 - Скомпілювати програму. Build project (в російській версії Побудувати <имя проекта>).
Необхідно звернути увагу, що, в разі, якщо проект «збирається» без вказівки «MFC як статична бібліотека», розмір бінарного файлу різко відрізняється. У випадку з даною програмою - без статичної MFC близько 28 кб, з - близько 600 кб.
Необхідно також відзначити, що, якщо необхідні багатопроцесорні розрахунки, то «збирати» MFC в статичному вигляді не потрібно - всі необхідні бібліотеки є на тому комп'ютері, на якому відбувається розробка. У разі ж запуску на кластері MFC в статичному вигляді просто необхідно, так як на вузлах можуть бути відсутні необхідні бібліотеки.
Для того, щоб програма була доступна всім вузлам, необхідно помістити бінарний файл в каталог, доступний через мережу всіх вузлів кластера.
Запуск MPI-програми в різних режимах
mpiexec -n 10 \\ hnwindows \ share \ MyMPIProject.exe
![Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc (visual) Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc](https://images-on-off.com/images/120/msmpivisualstudiowindowshpcserverrusskiy-1a864f3c.jpg)
Використання програми mpiexec (повний список опцій можна викликати mpiexec / help2)
mpiexec [options] executable [args] [. [Options] exe [args]. ]
mpiexec -configfile
-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 -hosts 1 server1 master. -n 8 worker
job submit / numcores: 16 mpiexec \\ hnwindows \ share \ MyMPIProject.exe
запустити задачу на 16 ядрах
запустити параметричну задачу, при цьому: 6-12 - діапазон змінюваних значень, 3 - крок між ними, * - місце підстановки значень. Відповідно, дана команда запустить три завдання:
![Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc (server) Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc](https://images-on-off.com/images/120/msmpivisualstudiowindowshpcserverrusskiy-9ba0e024.jpg)
Запуск задач за допомогою Cluster Manager
Для успішних розрахунків на кластері необхідно, щоб файл програми і все вхідні дані були доступні всім вузлам. В даному випадку (і в будь-якому іншому) найбільш оптимально використовувати файли, що лежать в мережі, куди мають доступ усі вузли (включаючи головний вузол).
Для додавання завдань необхідно використовувати консоль праворуч Actions, підміню Job Submission. Залежно від тип завдання, можна вибрати new Job, new Single-Task Job, new Parametric Sweep job
New Job: діалог для створення завдання, в якій може бути кілька підзадач. З необхідних для вибір полів відзначимо Job resources: може бути «ядро», «сокет», «вузол». Use assigned resourses exclusively for this job вказує менеджеру завдань, що обрані ресурси будуть зайняті цим завданням ексклюзивно.
![Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc (windows) Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc](https://images-on-off.com/images/120/msmpivisualstudiowindowshpcserverrusskiy-01242bae.jpg)
Наступна вкладка Task List, відповідає за додавання подзадач:
![Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc (studio) Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc](https://images-on-off.com/images/120/msmpivisualstudiowindowshpcserverrusskiy-f3211ead.jpg)
Додати можна Basic Task, Parametric Task, Task From File.
![Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc (windows) Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc](https://images-on-off.com/images/120/msmpivisualstudiowindowshpcserverrusskiy-3dab2aa9.jpg)
Command line: як необхідно запускати завдання.
Working directory: робоча директорія, щодо якої будуть визначатися абсолютні шляхи для standard input / output / error.
Standard input: файл з вхідними даними
Standard output: файл для вихідних даних
Standard error: файл для помилок виконання.
Після натискання Submit, якщо все було заповнено вірно, завдання буде додано до вкладці Active:
![Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc (ms-mpi) Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc](https://images-on-off.com/images/120/msmpivisualstudiowindowshpcserverrusskiy-4a26892c.jpg)
Після закінчення розрахунків завдання змінить статус або на Finished:
![Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc (ms-mpi) Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc](https://images-on-off.com/images/120/msmpivisualstudiowindowshpcserverrusskiy-c9fb7423.jpg)
Оскільки не було вказано файл для вихідних даних, ми можемо подивитися їх, два рази натиснувши на властивостях завдання в вікні внизу.
Приклад запуску параметричної завдання з командного рядка:
![Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc (windows) Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc](https://images-on-off.com/images/120/msmpivisualstudiowindowshpcserverrusskiy-c58d7a78.jpg)
Інтеграція Visual Studio і mpiexec.
Є також додатковий спосіб інтеграції Visual Studio і mpiexec, нестандартний, але, тим не менше, що дозволяє оперувати кластерними обчисленнями безпосередньо з Visual Studio, без запуску HPC Cluster Manager, mpiexec і т.д.
Так, в підміню Tools знаходиться розділ Other tools (в російській версії Сервіс => Зовнішні інструменти).
![Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc (studio) Ms-mpi - - visual studio - windows hpc server - український блог по розробці для hpc](https://images-on-off.com/images/120/msmpivisualstudiowindowshpcserverrusskiy-608dc113.jpg)
Command - шлях до mpiexec від необхідної реалізації MPI. В аргументах необхідно вказати шлях до проекту ($ (TargetPath)), в Initial Directory - директорію проекту.
З корисних додаткових опцій слід зазначити use output window - використовувати консоль для виведення результатів.
Command: C: \ Program Files \ Microsoft HPC Pack \ Bin \ job.exe
Ясна річ, цей приклад не ілюструє всіх можливостей конфігурації External Tools. Даний інструмент досить потужний, що дозволяє ефективно пов'язувати середу розробки з безпосередньо кластером (крім цього, можна домогтися такої конфігурації, що з workstation можна відправляти завдання на розрахунок на віддалений headnode кластера), і цього аспекту буде присвячений окремий пост.