Microsoft MPI и Visual Studio
В одной из предыдущих статей я подробно описал процесс установки и настройки библиотеки MPICH 2 (самой популярной открытой реализации MPI) в операционной системе Windows, и получил множество отзывов. К сожалению, люди часто жалуются на проблемы с настройкой MPICH в этой операционной системе, что неудивительно: на протяжении многих лет Windows являлась враждебной платформой для научных вычислений и свободного программного обеспечения. Поэтому теперь рассмотрим реализацию MPI от самой Microsoft.
Модная аббревиатура HPC расшифровывается, как High-Performance Computing — высокопроизводительные вычисления. Под эту отрасль нынче выделяются большие средства как за рубежом, так и в России
Несколько лет назад Microsoft осознала своё отставание в нише высокопроизводительных вычислений, и в 2006 году выпустила Windows Compute Cluster Server 2003, имеющую набор дополнительных API-функций для настройки и работы Windows-машины в качестве узла вычислительного кластера, а также собственную реализацию стандарта MPI — MS MPI.
Затем был создан Windows HPC Server 2008, имеющий все атрибуты HPC-системы, в частности:
- прямой доступ из вычислительной программы к сетевому оборудованию;
- подсистему развёртывания и управления кластером;
- менеджер вычислительных заданий;
- поддержку различных стандартов, принятых в мире HPC;
- очередную версию MS MPI, о которой мы и поговорим.
Чтобы опробовать MS MPI в действии, вовсе не обязательно развёртывать кластер под управлением Windows HPC Server; достаточно установить себе небольшой по объёму пакет HPC Pack 2008 SDK, который работает под операционными системами Windows Server 2003, Windows Server 2008, Windows Vista и Windows XP. Желательно иметь несколько компьютеров, соединённых гигабитной сетью, но сойдёт и один компьютер с многоядерным процессором (очень не рекомендую использовать сеть Wi-Fi даже для учебных целей).
Установка HPC Pack 2008 SDK
Установка HPC Pack SDK похожа на установку других программных продуктов Microsoft:
Я не уверен, что версии разной «битности» будут правильно связываться друг с другом по сети
- скачайте 32-х битную или 64-х битную версию, в соответствии с версией вашей операционной системы;
- запустите скачанный инсталлятор;
- примите лицензионное соглашение;
- нажимайте кнопку «Next» до тех пор, пока она не превратится в кнопку «Finish»;
- скачайте Fix и установите его тоже;
В отличие от MPICH, настраивать HPC Pack 2008 SDK не нужно.
Настройка Visual Studio
Теперь нам нужно настроить Visual Studio для работы с вновь проинсталлированной библиотекой. Если у вас запущена Visual Studio, то на всякий случай перезапустите её после установки HPC Pack SDK. Нажмите Tools → Options, и добавьте путь к заголовочным файлам в Projects and Solutions → VC++ Directories → Show directories for: Include files. Предполагаем, что вы установили HPC Pack SDK в стандартное место:
Аналогично добавьте директорию с библиотечными файлами. Если у вас 32-х битная операционная система, то путь оканчивается на i386, если же система 64-х битная, то путь оканчивается на amd64:
Создание простейшей программы
Создайте консольный проект так, как показано на рисунках 2–4 в статье об OpenMP. Будем далее считать, что вы задали имя проекта «MpiTest». Нажмите Project → MpiTest Options, и добавьте msmpi.lib в список дополнительных файлов для компоновки:

Рисунок 3. Добавление msmpi.lib к программе
Введите исходный код программы. Будем выполнять тесты на следующем простейшем коде:
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
MPI_Init(&argc, &argv);
int rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if( rank )
{
char buf[] = "Hello!";
MPI_Send(buf, sizeof(buf), MPI_CHAR, 0, 0, MPI_COMM_WORLD);
} else {
cout << "Process 0 started" << endl;
for(int i(1); i<size; ++i)
{
MPI_Status s;
MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &s);
int count;
MPI_Get_count(&s, MPI_CHAR, &count);
char *buf = new char[count];
MPI_Recv(buf, count, MPI_CHAR,
MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &s);
cout << "Message from process " << s.MPI_SOURCE << ": "
<< buf << endl;
delete[] buf;
}
cout << "Done." << endl;
}
MPI_Finalize();
return 0;
}
Листинг 1. Простейшая программа, использующая MPI
Нажмите Debug → Start Without Debugging. Если Visual Studio спросит вас, хотите ли откомпилировать программу, нажмите «Yes». После этого программа откомпилируется и запустится. Если у вас включён брэндмауэр, то он, возможно, спросит, хотите ли вы разрешить программе MpiTest.exe доступ в сеть. Нажмите «Разблокировать». После этого вы должны увидеть на экране консольное окно с результатом работы:

Рисунок 4. Запуск одного процесса
Запуск программы на одном компьютере
Для более полного понимания материла рекомендую ознакомиться с принципами работы MPICH, которые я описал в другой статье. В этом плане MS MPI почти не отличается от MPICH
Для запуска MPI-программ в комплекте MS MPI идут программы mpiexec.exe и smpd.exe, путь к которым при установке HPC Pack SDK добавился в переменную окружения PATH. Это означает, что вы можете вызывать mpiexec.exe из командной строки, находясь в любом месте файловой системы.
Для запуска нашей программы на одном компьютере достаточно только программы mpiexec.exe. Она запустит требуемое число экземпляров MPI-программы и снабдит их информацией для связи друг с другом. Запустите командную строку (Пуск → Программы → Стандартные → Командная строка), и перейдите в папку с исполняемым файлом вашей программы с помощью команды cd, затем запустите программу с помощью mpiexec:
Ключи -n 5 у программы mpiexec говорят о том, что нужно запустить 5 процессов на текущем компьютере. Список допустимых ключей можно получить по команде mpiexec -help2. Не удивляйтесь, что сообщения от процессов 1–4 перемешаны: процессы вовсе не обязаны запускаться по очереди и работать с одинаковой скоростью.
Запуск программы на нескольких компьютерах
[Допишу позже...]
P.S.
Самая полная информация о создании MPI-программ находится в спецификации MPI. Рекомендую начать изучение с версии 1.3.






30 отзывов на запись «Microsoft MPI и Visual Studio»
Автор: Anton. Дата: 8-го января 2010 г. Время: 18:43.
Спасибо за статью, помогла. А как сделать так, чтобы из VS 2008 запускался не только процесс мастер, но и несколько других процессов, котрые будут обрабатывать данные.
Автор: Владимир. Дата: 29-го апреля 2010 г. Время: 18:02.
Спасибо за статью. полезная.
только вот уме возникает проблема: когда запускаю из VisualStudio или на прямую, то всё нормально — один запущеный процесс. А вот если запускаешь несколько процессов (даже если указать количество процессов 1) по средством mpiexec. то выскакивает ошибка:
smpd.exe — Точка входа не найдена
Точка входа в процедуру GETLogicalProcessorInformation не найдена в библиотеке DLL KERNEL32.dll
Автор: Антон. Дата: 29-го апреля 2010 г. Время: 18:16.
Какая у вас версия Windows? Обновляли её?
Автор: Владимир. Дата: 29-го апреля 2010 г. Время: 18:36.
XP SP3
а что это может повлиять? у меня просто поставлен transformationpack MacOs но это вроде только визуализация, не должно задевать такие библиотеки.
Автор: Антон. Дата: 29-го апреля 2010 г. Время: 18:57.
Это очень странно, ибо в SP3 функция GetLogicalProcessorInformation имеется (до этого её не было). Может, криво установлен Service Pack? Попробуйте заново установить третий Service Pack на вашу систему, либо переустановите систему целиком.
Возможно также, что Transformation Pack что-то повредил.
Автор: Владимир. Дата: 29-го апреля 2010 г. Время: 21:02.
спасибо. попробую
Автор: Владимир. Дата: 30-го апреля 2010 г. Время: 01:29.
да действительно переустановка SP3 помогла, только вот Пак осовский слетел. спасибо
Автор: Валерий. Дата: 2-го октября 2010 г. Время: 12:30.
здравствуйте, сделал все как указано выше, при запуске исходного кода программы, выдает ошибку error 1083: Cannot open include file: ‘mpi.h’ в чем может быть проблема? делал все по инструкции
Автор: Валерий. Дата: 4-го октября 2010 г. Время: 18:51.
разобрался
Автор: Meyir. Дата: 20-го сентября 2011 г. Время: 07:29.
привет у меня такая же проблема ты как разобрался ответь плз
Автор: Сергей. Дата: 22-го октября 2010 г. Время: 08:01.
Запуск программы на нескольких компьютерах
[Допишу позже...]
Самого нужно и нет!
Подскажите, что почитать?
Автор: G. Дата: 31-го октября 2010 г. Время: 17:15.
Как может повлиять на работу Microsoft MPI установленный и настроенный для работы с VS MPICH?
Автор: Максим. Дата: 18-го мая 2011 г. Время: 19:42.
Спасибо большое за статью, очень помогла. Но была проблема при добавлении директории с библиотечными файлами. У меня Windows 7 x64, но при добавлении amd64 выдавало ошибку: «error LNK2019: ссылка на неразрешенный внешний символ», как бы не могло найти функции. Вылечил заменой amd64 на i386.
Автор: hawk. Дата: 14-го сентября 2011 г. Время: 13:39.
Огромное спасибо за статью! Всё очень подробно и кристально ясно. Буду очень рад, если раздел «Запуск программы на нескольких компьютерах» будет дописан.
Ещё раз спасибо!
Автор: umaw. Дата: 2-го декабря 2011 г. Время: 20:09.
Кто-нибудь с Фортраном дело имеет? а то выдает 20 ошибок по типу такой:
1>Klaus_3d.obj : error LNK2019: ссылка на неразрешенный внешний символ MPI_INIT в функции MAIN__
файл msmpi.lib прописан
Автор: Егор. Дата: 5-го декабря 2011 г. Время: 01:00.
«ссылка на неразрешенный внешний символ MPI_INIT в функции MAIN__» и подобные ошибки говорят о том, что забыли либ-файл подключить.читайте внимательно этот man
«Создание простейшей программы
Создайте консольный проект так, как показано на рисунках 2–4 в статье об OpenMP. Будем далее считать, что вы задали имя проекта «MpiTest». Нажмите Project → MpiTest Options, и добавьте msmpi.lib в список дополнительных файлов для компоновки:»
«Cannot open include file: ‘mpi.h’»
скорее всего изза того, что не прописали или неправильно прописали директорию для инклудов.
была ещё 1 проблема при запуске из консоли mpiexec.exe -n 5 mpi.exe ругался на то, что не может запустить smpd.exe. перезагрузка + поместил всё из папки C:\Program Files\Microsoft HPC Pack 2008 SDK\Bin в папку Debug(Release) проекта и заработало
Автор: Олег. Дата: 13-го декабря 2011 г. Время: 11:56.
Да нет, msmpi.lib прописан!
А почему такое вылезает, не знаю!
Автор: Jakard. Дата: 19-го декабря 2011 г. Время: 17:15.
И когда же и где же туториал про то как настроить кластер из 2х виндовых машин?=)
Автор: Олег. Дата: 22-го декабря 2011 г. Время: 15:33.
Для пользователей Фортрана. пишем в свойствах проекта в Linker => Input => Additional Dependencies следующие 2 библиотеки: msmpi.lib msmpifmc.lib
Автор: dast3r. Дата: 22-го декабря 2011 г. Время: 20:27.
очень нужен туториал по запуску проги на 2ух(3х и более) windows компах.
Автор: Павел. Дата: 21-го февраля 2012 г. Время: 22:30.
Есть проблема. Компиляция программы проходит нормально. Но когда я хочу запустить exe фалй через командную строку, мне выбивает иероглифы.

Вот что пишет:
Автор: Антон. Дата: 21-го февраля 2012 г. Время: 22:43.
Скопируйте сам текст сюда, иначе не смогу прочесть. Для этого в в меню окна нажмите изменить → пометить, выделите текст, и нажмите Enter — он скопируется в буфер обмена.
Автор: Павел. Дата: 21-го февраля 2012 г. Время: 23:22.
Microsoft Windows [Version 6.1.7600]
(c) Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены.
C:\Users\Павел>cd «d:\\mpi\debug»
C:\Users\Павел>mpiexec -n 5 mpi.exe
Aborting: failed to launch ‘mpi.exe’ on ╧ртхы-╧╩
Error (2) ═х єфрхЄё эрщЄш єърчрээ√щ Їрщы.
C:\Users\Павел>
Автор: Антон. Дата: 21-го февраля 2012 г. Время: 23:38.
Написано:
Aborting: failed to launch 'mpi.exe' on Павел-giError (2) Не удается найти указанный файл.
Видимо, файл mpi.exe не находится в папке C:\Users\Павел. Перейдите в нужную папку и оттуда запускайте.
Автор: Павел. Дата: 22-го февраля 2012 г. Время: 00:01.
Большое спасибо! Все получилось! Я не думал даже что может быть проблема в пути. Наскольок я понимаю что в ОС в Pach — прописаный путь к exe и можно с любой точки запускать прокомпеллированый файл. Спасибо! Вы мне очень помогли!)))
Автор: Алексей. Дата: 1-го марта 2012 г. Время: 16:33.
Есть проблема. Компиляция программы проходит нормально. Но когда я хочу запустить exe файл через командную строку все виснет
C:\Documents and Settings\Admin>mpiexec -timeout 3 -n 5 1.exe
mpiexec terminated job due to 3 second timeout.
Автор: Алексей. Дата: 1-го марта 2012 г. Время: 16:41.
Вот такая ошибка
Автор: Алексей. Дата: 1-го марта 2012 г. Время: 16:42.
http://i079.radikal.ru/1203/5f/79b05d97377a.jpg
Автор: Влад. Дата: 29-го апреля 2012 г. Время: 01:49.
хорошая статья, продолжайте писать!
Автор: Иван. Дата: 1-го мая 2012 г. Время: 20:35.
Отличная статья! Подскажите пожалуйста, есть ли способ проводить отладку в VS 2010 Fortran приложения с MPI, так чтобы непосредственно в отладчике запускалось несколько процессов, и break points срабатывали на всех процессах? в VS 2008 можно было выбрать тип отладчика MPI Cluster Debugger для Fortran, а в VS 2010 так уже не получается..
Единственный способ, который я нашел — присоединить отладчик к процессам запущенным из mpiexec. Но это занимает время, а как присоединить отладчик как только запускается процесс я не знаю.