Цей пост буде присвячений різним аспектам роботи з найбільш популярної бібліотекою для розробки паралельних програм - MS-MPI.
Аналогічно нижчеописане алгоритму проводиться настройка проекту для MPICH2, за винятком інших шляхів до бібліотек і mpiexec. Налаштування проекту і запуск паралельних програм нічим не відрізняється і в 10-й версії Visual Studio.
У даній інструкції комп'ютер, на якому здійснюється компіляція і запуск програми, має доменне ім'я hnwindows.
1 - Створити проект C ++
(У російській версії Visual C ++ => Загальні, «Порожній проект»)
Відкрити властивості проекту.
2 - Поміняти значення поля Subsystem в Linker => System на CONSOLE (/ SUBSYSTEM: CONSOLE) (для російської версії VS: Компоновщик => Система => Підсистема)
3 - Додати до компонувальнику (Linker) шлях до додаткових бібліотек (в російській версії VS необхідно зайти на вкладку Загальні)
4 - Додати до компонувальнику (Linker) додаткові залежності. Вписати msmpi.libWs2_32.lib. У даній програмі використовується додаткова залежність Ws2_32.lib, дана бібліотека використовується для мережевої взаємодії, в інших проектах може бути і не задіяна.
5 - додати файл C ++ до проекту (в даній інструкції ми будемо використовувати програму Hello World), натиснути правою кнопкою миші на назві проекту, Add => Add an element (для російської версії Додати => Створити елемент), де вибрати C ++ File:
6 - Викликати властивості проекту, з'явиться нова вкладка C / C ++. Додати до шляхів компілятора (Compiler) шляху для додаткових файлів (для російської версії: додаткові каталоги включення):
7 - Для того, щоб вузли успішно запустили програму, необхідно скомпілювати нашу програму з усіма залежностями. Для цього значення «Використання MFC» необхідно поміняти на «Використовувати MFC в статичної бібліотеці».
8 - Скомпілювати програму. Build project (в російській версії Побудувати <имя проекта>).
Необхідно звернути увагу, що, в разі, якщо проект «збирається» без вказівки «MFC як статична бібліотека», розмір бінарного файлу різко відрізняється. У випадку з даною програмою - без статичної MFC близько 28 кб, з - близько 600 кб.
Необхідно також відзначити, що, якщо необхідні багатопроцесорні розрахунки, то «збирати» MFC в статичному вигляді не потрібно - всі необхідні бібліотеки є на тому комп'ютері, на якому відбувається розробка. У разі ж запуску на кластері MFC в статичному вигляді просто необхідно, так як на вузлах можуть бути відсутні необхідні бібліотеки.
Для того, щоб програма була доступна всім вузлам, необхідно помістити бінарний файл в каталог, доступний через мережу всіх вузлів кластера.
Запуск MPI-програми в різних режимах
mpiexec -n 10 \\ hnwindows \ share \ MyMPIProject.exe
Використання програми 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 - крок між ними, * - місце підстановки значень. Відповідно, дана команда запустить три завдання:
Запуск задач за допомогою 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 вказує менеджеру завдань, що обрані ресурси будуть зайняті цим завданням ексклюзивно.
Наступна вкладка Task List, відповідає за додавання подзадач:
Додати можна Basic Task, Parametric Task, Task From File.
Command line: як необхідно запускати завдання.
Working directory: робоча директорія, щодо якої будуть визначатися абсолютні шляхи для standard input / output / error.
Standard input: файл з вхідними даними
Standard output: файл для вихідних даних
Standard error: файл для помилок виконання.
Після натискання Submit, якщо все було заповнено вірно, завдання буде додано до вкладці Active:
Після закінчення розрахунків завдання змінить статус або на Finished:
Оскільки не було вказано файл для вихідних даних, ми можемо подивитися їх, два рази натиснувши на властивостях завдання в вікні внизу.
Приклад запуску параметричної завдання з командного рядка:
Інтеграція Visual Studio і mpiexec.
Є також додатковий спосіб інтеграції Visual Studio і mpiexec, нестандартний, але, тим не менше, що дозволяє оперувати кластерними обчисленнями безпосередньо з Visual Studio, без запуску HPC Cluster Manager, mpiexec і т.д.
Так, в підміню Tools знаходиться розділ Other tools (в російській версії Сервіс => Зовнішні інструменти).
Command - шлях до mpiexec від необхідної реалізації MPI. В аргументах необхідно вказати шлях до проекту ($ (TargetPath)), в Initial Directory - директорію проекту.
З корисних додаткових опцій слід зазначити use output window - використовувати консоль для виведення результатів.
Command: C: \ Program Files \ Microsoft HPC Pack \ Bin \ job.exe
Ясна річ, цей приклад не ілюструє всіх можливостей конфігурації External Tools. Даний інструмент досить потужний, що дозволяє ефективно пов'язувати середу розробки з безпосередньо кластером (крім цього, можна домогтися такої конфігурації, що з workstation можна відправляти завдання на розрахунок на віддалений headnode кластера), і цього аспекту буде присвячений окремий пост.