Microsoft MPI и Visual Studio

ВНИМАНИЕ, ЭТО НЕДОПИСАННАЯ СТАТЬЯ. Она мо­жет со­дер­жать ка­кие-угод­но не­точ­но­сти.

В од­ной из преды­ду­щих ста­тей я по­дроб­но опи­сал про­цесс уста­нов­ки и на­строй­ки биб­лио­те­ки MPICH 2 (са­мой по­пу­ляр­ной от­кры­той реа­ли­за­ции MPI) в опе­ра­ци­он­ной си­сте­ме Windows, и по­лу­чил мно­же­ство от­зы­вов. К со­жа­ле­нию, лю­ди ча­сто жа­лу­ют­ся на про­бле­мы с на­строй­кой MPICH в этой опе­ра­ци­он­ной си­сте­ме, что не­уди­ви­тель­но: на про­тя­же­нии мно­гих лет Windows яв­ля­лась враж­деб­ной плат­фор­мой для на­уч­ных вы­чис­ле­ний и сво­бод­но­го про­граммно­го обес­пе­че­ния. По­это­му те­перь рас­смот­рим реа­ли­за­цию MPI от са­мой Microsoft.

Мод­ная аб­бре­ви­а­ту­ра HPC рас­шиф­ро­вы­ва­ет­ся, как High-Per­for­man­ce Com­pu­ting — вы­со­ко­про­из­во­ди­тель­ные вы­чис­ле­ния. Под эту от­расль нын­че вы­де­ля­ют­ся боль­шие сред­ства как за ру­бе­жом, так и в Рос­сии

Не­сколь­ко лет на­зад 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:

Я не уве­рен, что вер­сии раз­ной «бит­но­сти» бу­дут пра­виль­но свя­зы­вать­ся друг с дру­гом по се­ти

  1. ска­чай­те 32-х бит­ную или 64-х бит­ную вер­сию, в со­от­вет­ствии с вер­си­ей ва­шей опе­ра­ци­он­ной си­сте­мы;
  2. за­пу­сти­те ска­чан­ный ин­стал­ля­тор;
  3. при­ми­те ли­цен­зи­он­ное со­гла­ше­ние;
  4. на­жи­май­те кноп­ку «Next» до тех пор, по­ка она не пре­вра­тит­ся в кноп­ку «Finish»;
  5. ска­чай­те 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 в стан­дарт­ное ме­сто:

До­бав­ля­ем путь к за­го­ло­воч­ным фай­лам MS MPI
До­бав­ля­ем путь к за­го­ло­воч­ным фай­лам MS MPI

Ри­су­нок 1. До­бав­ля­ем путь к за­го­ло­воч­ным фай­лам MS MPI

Ана­ло­гич­но до­бавь­те ди­рек­то­рию с биб­лио­теч­ны­ми фай­ла­ми. Ес­ли у вас 32-х бит­ная опе­ра­ци­он­ная си­сте­ма, то путь окан­чи­ва­ет­ся на i386, ес­ли же си­сте­ма 64-х бит­ная, то путь окан­чи­ва­ет­ся на amd64:

До­бав­ля­ем путь к биб­лио­теч­ным фай­лам MS MPI
До­бав­ля­ем путь к биб­лио­теч­ным фай­лам MS MPI

Ри­су­нок 2. До­бав­ля­ем путь к биб­лио­теч­ным фай­лам MS MPI

Со­зда­ние про­стей­шей про­грам­мы

Со­здай­те кон­соль­ный про­ект так, как по­ка­за­но на ри­сун­ках 2–4 в ста­тье об OpenMP. Бу­дем да­лее счи­тать, что вы за­да­ли имя про­ек­та «MpiTest». На­жми­те Project → MpiTest Options, и до­бавь­те msmpi.lib в спи­сок до­пол­ни­тель­ных фай­лов для ком­по­нов­ки:

До­бав­ле­ние msmpi.lib к про­грам­ме

Ри­су­нок 3. До­бав­ле­ние msmpi.lib к про­грам­ме

Вве­ди­те ис­ход­ный код про­грам­мы. Бу­дем вы­пол­нять те­сты на сле­дую­щем про­стей­шем ко­де:

#include <mpi.h>
#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:

За­пуск пя­ти про­цес­сов на од­ном ком­пью­те­ре
За­пуск пя­ти про­цес­сов на од­ном ком­пью­те­ре

Ри­су­нок 5. За­пуск пя­ти про­цес­сов на од­ном ком­пью­те­ре

Клю­чи -n 5 у про­грам­мы mpiexec го­во­рят о том, что нуж­но за­пу­стить 5 про­цес­сов на те­ку­щем ком­пью­те­ре. Спи­сок до­пу­сти­мых клю­чей мож­но по­лу­чить по ко­ман­де mpiexec -help2. Не удив­ляй­тесь, что со­об­ще­ния от про­цес­сов 1–4 пе­ре­ме­ша­ны: про­цес­сы во­все не обя­за­ны за­пус­кать­ся по оче­ре­ди и ра­бо­тать с оди­на­ко­вой ско­ро­стью.

За­пуск про­грам­мы на не­сколь­ких ком­пью­те­рах

[До­пи­шу поз­же...]

P.S.

Са­мая пол­ная ин­фор­ма­ция о со­зда­нии MPI-про­грамм на­хо­дит­ся в спе­цифи­ка­ции MPI. Ре­ко­мен­дую на­чать изу­че­ние с вер­сии 1.3.

30 отзывов на запись «Microsoft MPI и Visual Studio»

Спа­си­бо за ста­тью, по­мог­ла. А как сде­лать так, что­бы из VS 2008 за­пус­кал­ся не толь­ко про­цесс ма­стер, но и не­сколь­ко дру­гих про­цес­сов, ко­т­рые бу­дут об­ра­ба­ты­вать дан­ные.

Спа­си­бо за ста­тью. по­лез­ная.

толь­ко вот уме воз­ни­ка­ет про­бле­ма: ко­гда за­пус­каю из VisualStudio или на пря­мую, то всё нор­маль­но — один за­пу­ще­ный про­цесс. А вот ес­ли за­пус­ка­ешь не­сколь­ко про­цес­сов (да­же ес­ли ука­зать ко­ли­че­ство про­цес­сов 1) по сред­ством mpiexec. то вы­ска­ки­ва­ет ошиб­ка:

smpd.exe — Точ­ка вхо­да не най­де­на

Точ­ка вхо­да в про­це­ду­ру GETLogicalProcessorInformation не най­де­на в биб­лио­те­ке DLL KERNEL32.dll

Ка­кая у вас вер­сия Windows? Об­нов­ля­ли её?

XP SP3

а что это мо­жет по­вли­ять? у ме­ня про­сто по­став­лен transformationpack MacOs но это вро­де толь­ко ви­зуа­ли­за­ция, не долж­но за­де­вать та­кие биб­лио­те­ки.

Это очень стран­но, ибо в SP3 функ­ция GetLogicalProcessorInformation име­ет­ся (до это­го её не бы­ло). Мо­жет, кри­во уста­нов­лен Service Pack? По­про­буй­те за­но­во уста­но­вить тре­тий Service Pack на ва­шу си­сте­му, ли­бо пе­ре­уста­но­ви­те си­сте­му це­ли­ком.

Воз­мож­но так­же, что Transformation Pack что-то по­вре­дил.

спа­си­бо. по­про­бую

да дей­стви­тель­но пе­ре­уста­нов­ка SP3 по­мог­ла, толь­ко вот Пак осов­ский сле­тел. спа­си­бо

здрав­ствуй­те, сде­лал все как ука­за­но вы­ше, при за­пус­ке ис­ход­но­го ко­да про­грам­мы, вы­да­ет ошиб­ку error 1083: Cannot open include file: ‘mpi.h’ в чем мо­жет быть про­бле­ма? де­лал все по ин­ст­рук­ции

разо­брал­ся

при­вет у ме­ня та­кая же про­бле­ма ты как разо­брал­ся от­веть плз

За­пуск про­грам­мы на не­сколь­ких ком­пью­те­рах
[До­пи­шу поз­же...]

Са­мо­го нуж­но и нет! :(
Под­ска­жи­те, что по­чи­тать?

Как мо­жет по­вли­ять на ра­бо­ту Microsoft MPI уста­нов­лен­ный и на­стро­ен­ный для ра­бо­ты с VS MPICH?

Спа­си­бо боль­шое за ста­тью, очень по­мог­ла. Но бы­ла про­бле­ма при до­бав­ле­нии ди­рек­то­рии с биб­лио­теч­ны­ми фай­ла­ми. У ме­ня Windows 7 x64, но при до­бав­ле­нии amd64 вы­да­ва­ло ошиб­ку: «error LNK2019: ссыл­ка на не­раз­ре­шен­ный внеш­ний сим­вол», как бы не мог­ло най­ти функ­ции. Вы­ле­чил за­ме­ной amd64 на i386.

Огром­ное спа­си­бо за ста­тью! Всё очень по­дроб­но и кри­сталь­но яс­но. Бу­ду очень рад, ес­ли раз­дел «За­пуск про­грам­мы на не­сколь­ких ком­пью­те­рах» бу­дет до­пи­сан.
Ещё раз спа­си­бо!

Кто-ни­будь с Фор­тра­ном де­ло име­ет? а то вы­да­ет 20 оши­бок по ти­пу та­кой:
1>Klaus_3d.obj : error LNK2019: ссыл­ка на не­раз­ре­шен­ный внеш­ний сим­вол MPI_INIT в функ­ции MAIN__
файл msmpi.lib про­пи­сан

«ссыл­ка на не­раз­ре­шен­ный внеш­ний сим­вол 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) про­ек­та и за­ра­бо­та­ло

Да нет, msmpi.lib про­пи­сан!
А по­че­му та­кое вы­ле­за­ет, не знаю!

И ко­гда же и где же ту­то­ри­ал про то как на­стро­ить кла­стер из 2х вин­до­вых ма­шин?=)

Для поль­зо­ва­те­лей Фор­тра­на. пи­шем в свой­ствах про­ек­та в Linker => Input => Additional Dependencies сле­дую­щие 2 биб­лио­те­ки: msmpi.lib msmpifmc.lib

очень ну­жен ту­то­ри­ал по за­пус­ку про­ги на 2ух(3х и бо­лее) windows ком­пах.

Есть про­бле­ма. Ком­пи­ля­ция про­грам­мы про­хо­дит нор­маль­но. Но ко­гда я хо­чу за­пу­стить exe фалй че­рез ко­манд­ную стро­ку, мне вы­би­ва­ет иеро­гли­фы.
Вот что пи­шет:

Ско­пи­руй­те сам текст сю­да, ина­че не смо­гу про­честь. Для это­го в в ме­ню ок­на на­жми­те из­ме­нить → по­ме­тить, вы­де­ли­те текст, и на­жми­те Enter — он ско­пи­ру­ет­ся в бу­фер об­ме­на.

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\Па­вел>

На­пи­са­но:

Aborting: failed to launch 'mpi.exe' on Па­вел-gi
Error (2) Не уда­ет­ся най­ти ука­зан­ный файл.

Ви­ди­мо, файл mpi.exe не на­хо­дит­ся в пап­ке C:\Users\Па­вел. Пе­рей­ди­те в нуж­ную пап­ку и от­ту­да за­пус­кай­те.

Боль­шое спа­си­бо! Все по­лу­чи­лось! Я не ду­мал да­же что мо­жет быть про­бле­ма в пу­ти. На­ско­льок я по­ни­маю что в ОС в Pach — про­пи­са­ный путь к exe и мож­но с лю­бой точ­ки за­пус­кать про­ком­пел­ли­ро­ва­ный файл. Спа­си­бо! Вы мне очень по­мог­ли!)))

Есть про­бле­ма. Ком­пи­ля­ция про­грам­мы про­хо­дит нор­маль­но. Но ко­гда я хо­чу за­пу­стить exe файл че­рез ко­манд­ную стро­ку все вис­нет

C:\Documents and Settings\Admin>mpiexec -timeout 3 -n 5 1.exe

mpiexec terminated job due to 3 second timeout.

Вот та­кая ошиб­ка

http://i079.radikal.ru/1203/5f/79b05d97377a.jpg

хо­ро­шая ста­тья, про­дол­жай­те пи­сать!

От­лич­ная ста­тья! Под­ска­жи­те по­жа­луй­ста, есть ли спо­соб про­во­дить от­лад­ку в VS 2010 Fortran при­ло­же­ния с MPI, так что­бы не­по­сред­ствен­но в от­лад­чи­ке за­пус­ка­лось не­сколь­ко про­цес­сов, и break points сра­ба­ты­ва­ли на всех про­цес­сах? в VS 2008 мож­но бы­ло вы­брать тип от­лад­чи­ка MPI Cluster Debugger для Fortran, а в VS 2010 так уже не по­лу­ча­ет­ся..
Един­ствен­ный спо­соб, ко­то­рый я на­шел — при­со­еди­нить от­лад­чик к про­цес­сам за­пу­щен­ным из mpiexec. Но это за­ни­ма­ет вре­мя, а как при­со­еди­нить от­лад­чик как толь­ко за­пус­ка­ет­ся про­цесс я не знаю.

Оставить отзыв

Жёлтые поля обязательны к заполнению

   

Можете использовать теги <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>