mpixp


MPI pod Windows XP
Opracowanie: Maciej Tarkowski
14 pazdziernika 2007 r.
MPI pod Windows XP Maciej Tarkowski
Spis treści
1. Wstęp................................................................................................................................................3
2. Konfiguracja.....................................................................................................................................4
3. Tworzenie aplikacji...........................................................................................................................6
4. MinGW  zaprzęgamy kompilator do pracy....................................................................................7
5. Dev-C++ na usługach.......................................................................................................................9
6. Uruchamianie.................................................................................................................................12
2/12
MPI pod Windows XP Maciej Tarkowski
1. Wstęp
Aby możliwe było tworzenie równoległych aplikacji opartych o MPI w systemie Windows XP,
konieczne jest przygotowanie kompilatora oraz instalacja implementacji biblioteki MPI.
W tym dokumencie przedstawiam instalację, konfigurację oraz uruchomienie DeinoMPI 
implementacji biblioteki MPI-2 dla środowiska Windows.
Opiszę dwie konfiguracje: w pierwszej wykorzystam tylko kompilator MinGW, a w drugiej -
środowisko programistyczne Dev-C++ (które zawiera MinGW, jednakże w starszej wersji).
Wykorzystywanym językiem programowania jest oczywiście C++.
Na początek  system requirements:
 Windows 2000 / XP / XP 64-bit / Server 2003 / Server 2003 64-bit :)
 .NET Framework 2.0
 DeinoMPI, dostępne pod adresem http://mpi.deino.net/
 Dev-C++, dostępne pod adresem http://www.bloodshed.net/devcpp.html
i/lub
MinGW, dostępne pod adresem http://www.mingw.org/
 konto użytkownika z grupy Administratorzy z ustawionym hasłem (!)
Po zainstalowaniu Windowsa, biblioteki .NET Framework instalujemy sam kompilator MinGW lub
środowisko Dev-C++. W pierwszym przypadku doradzam skorzystanie z automatycznego
instalatora, jaki dostarczają twórcy.
Następnie przystępujemy do instalacji DeinoMPI. Autorzy dostarczają standardowy kreator, a więc
proces nie jest niczym skomplikowanym:
3/12
MPI pod Windows XP Maciej Tarkowski
2. Konfiguracja
Po zainstalowaniu DeinoMPI czas na jego konfigurację. Aby uruchomić aplikację zarządzającą
(DeinoMPIWin) przechodzimy do Menu Start -> wszystkie programy -> DeinoMPI -> DeinoMPI.
W otwartym oknie przechodzimy do zakładki  Credential Store .
Założeniem twórców DeinoMPI było umożliwienie użytkownikom wykorzystywanie biblioteki MPI
w sieci połączonych ze sobą komputerów (zob. zakładka  Cluster ). W tym celu zaproponowali
szyfrowanie wymiany informacji pomiędzy maszynami za pomocą kluczy  hashujących . My
będziemy uruchamiać aplikacje MPI na jednej maszynie, ale i tak musimy taki  credential store
założyć. Jedyne co możemy sobie podarować, to oferowane przez Deino mechanizmy
szyfrujące.
Aby utworzyć nowy  credential store zaznaczamy opcję  enable create store options :
Następnie w grupie  Encryption wybieramy opcję  no encryption , następnie wybieramy
przechowywanie klucza w rejestrze systemowym ( Registry ), a na zakończenie klikamy przycisk
 Create Credential Store .
Pozostaje jeszcze powiązanie powstałego  store z użytkownikiem. W tym celu w grupie  Add
Credential wpisujemy nazwę użytkownika i hasło (pamiętając, że Windows rozróżnia małe i duże
litery), a następnie klikamy  Add . Dodany użytkownik pojawia się na liście  Credentials :
4/12
MPI pod Windows XP Maciej Tarkowski
Gdybyśmy pominęli wpisanie użytkownika i hasła, Deino pytałby o nie w momencie uruchomienia
napisanej przez nas aplikacji.
Po uporaniu się z konfiguracją DeinoMPI, zabieramy się do programowania.
5/12
MPI pod Windows XP Maciej Tarkowski
3. Tworzenie aplikacji
Jak już wspomniałem, tworząc aplikacje korzystające z MPI, będziemy pracować z językiem C++.
Przed przystąpieniem do kompilacji, niezależnie od używanego środowiska, konieczna jest
modyfikacja pliku nagłówkowego  mpi.h , który będziemy includ'ować w aplikacjach MPI. Plik
znajduje się w katalogu  inlcude DeinoMPI (u mnie: C:\Dev-Cpp\DeinoMPI\include).
Wyedytujmy plik i przejdzmy do linii 30-33. Sprawdzane jest tu istnienie typu wchar_t i
ewentualna jego definicja instrukcją typedef. Ponieważ kompilatorowi nie pasuje składnia
instrukcji, skomentujmy ten fragment:
Teraz przyszła kolej na kod. Przykładem niech będzie poniższy fragment:
#include
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
int rank, size;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
cout << "Czesc, jestem " << rank << ". Size = " << size << endl;
MPI_Finalize();
return 0;
}
Powyższy przykład prezentuje najbardziej podstawową właściwość MPI, czyli identyfikację
procesów  proces przedstawia się (podaje swój numer) i dodatkowo podaję liczbę wszystkich
blizniaczych procesów.
6/12
MPI pod Windows XP Maciej Tarkowski
4. MinGW  zaprzęgamy kompilator do pracy
Aby proces kompilacji przebiegał poprawnie, wymagane jest dołączenie pewnych bibliotek na
etapie linkowania. Obie znajdują się w katalogu  lib Deino (u mnie: C:\Dev-C++\DeinoMPI\lib)
i są to:  cxx.lib oraz  mpi.lib .
Kiedy mamy już gotowy plik zródłowy (dla przykładu niech będzie to plik  mpitest.cpp
zawierający kod z rozdziału 3) przystępujemy do kompilacji. Jak zwykle w przypadku MinGW,
uruchamiamy wiersz poleceń i przechodzimy do podkatalogu  bin katalogu głównego pakietu,
w którym znajduje się plik g++.exe. Aby skompilować plik linkując wspomniane biblioteki,
wpisujemy:
> g++ mpitest.cpp
C:\Dev-Cpp\DeinoMPI\lib\cxx.lib
C:\Dev-Cpp\DeinoMPI\lib\mpi.lib
-o mpitest.exe
Przy takim wywołaniu, kompilator najprawdopodobniej zaprotestuje, informując o niemożności
odnalezienia pliku nagłówkowego  mpi.h , który incud'ujemy w pierwszej linii kodu. Są dwa
możliwe rozwiązania tego problemu. Pierwsze polega na podaniu bezwzględnej ścieżki do tego
pliku w kodzie programu, a druga  na poinformowaniu kompilatora, aby plików nagłówkowych
szukał również tam, gdzie znajduje się plik  mpi.h .
Realizacja drugiego rozwiązania sprowadza się do skorzystania z opcji -I w wierszu poleceń:
> g++ mpitest.cpp
C:\Dev-Cpp\DeinoMPI\lib\cxx.lib
C:\Dev-Cpp\DeinoMPI\lib\mpi.lib
-I C:\Dev-Cpp\DeinoMPI\include
-o mpitest.exe
Jak widać, kompilacja wymaga wpisywanie długawych ścieżek prawie za każdym razem.
Rozsądnym rozwiązaniem jest przygotowanie odpowiedniego pliku wsadowego, w którym
przechowywać będziemy ścieżki i który wywoła dla nas kompilator.
Wywołanie poniższego skryptu skutkuje kompilacją pliku podanego jako pierwszy i jedyny
argument. Plikiem wyjściowym jest plik wykonywalny nazwany tak jak pierwszy argument (czyli
kompilacja  mpitest.cpp spowoduje utworzenie pliku  mpitest.exe):
@ECHO OFF
REM --- ścieżka do katalogu kompilatora
SET GPP_PATH=C:\MinGW
REM --- ścieżka do katalogu z MPI
SET MPI_PATH=C:\Dev-Cpp\DeinoMPI
%GPP_PATH%\bin\g++ %1 %MPI_PATH%\lib\cxx.lib %MPI_PATH%\lib\mpi.lib -I %MPI_PATH%\include
-o %~n1.exe
REM --- usuwanie zmiennych
SET GPP_PATH=
SET MPI_PATH=
Można jeszcze pokusić się o sprawdzanie, czy aby na pewno podano argument. Poprawiony kod
będzie wyglądał następująco:
7/12
MPI pod Windows XP Maciej Tarkowski
@ECHO OFF
REM --- ścieżka do katalogu kompilatora
SET GPP_PATH=C:\MinGW
REM --- ścieżka do katalogu z MPI
SET MPI_PATH=C:\Dev-Cpp\DeinoMPI
IF (%1) == () GOTO E_BRAK_PARAM
%GPP_PATH%\bin\g++ %1 %MPI_PATH%\lib\cxx.lib %MPI_PATH%\lib\mpi.lib -I %MPI_PATH%\include
-o %~n1.exe
GOTO KONIEC
:E_BRAK_PARAM
ECHO Brak parametru! Podaj nazwę pliku do kompilacji.
:KONIEC
REM --- usuwanie zmiennych
SET GPP_PATH=
SET MPI_PATH=
Skrypt wklejamy np. do Notatnika i zapisujemy np. jako mpiCC.bat. Zauważmy, że skrypt nie
bierze pod uwagę ścieżki pliku zródłowego. Ja zapisałem swój skrypt w katalogu z różnymi
kodami, zatem wywołanie kompilacji ogranicza się jedynie do przejścia do katalogu z plikiem
zródłowym i wywołania skryptu:
8/12
MPI pod Windows XP Maciej Tarkowski
5. Dev-C++ na usługach
Podobnie jak w przypadku powyższym, konieczne jest podpięcie pewnych bibliotek na etapie
linkowania. Ponieważ Dev-C++ nie umożliwia innego rozwiązania tego problemu, zmuszeni
jesteśmy tworzyć oddzielny projekt dla każdej aplikacji.
Rozpoczynamy od utworzenia nowego projektu. W tym celu z menu plik wybieramy
Nowy -> Projekt. W oknie wybieramy typ aplikacji (oczywiście  Cosole application ), podajemy
nazwę projektu, oraz określamy język programowania:
Po kliknięciu  OK przechodzimy do dobrze znanego edytora.
Następną czynnością jest skonfigurowanie projektu tak, aby radził sobie z kompilacją  musimy
 przekonać linkera, aby łączył pewne biblioteki. Przechodzimy do Projekt -> Opcje projektu. W
otwartym oknie przechodzimy do zakładki  Parametry i za pomocą przycisku  Dodaj plik
dołączamy do konsolidatora biblioteki  cxx.lib i  mpi.lib umieszczone w folderze  lib
DeinoMPI (u mnie: C:\Dev-Cpp\DeinoMPI\lib):
9/12
MPI pod Windows XP Maciej Tarkowski
Musimy jeszcze poinformować kompilator o konieczności  zerkania do katalogów z bibliotekami i
plikami nagłówkowymi. Można to zrobić na dwa sposoby.
Pierwszy polega na dodaniu odpowiednich ścieżek do list dostępnych w zakładce  Pliki/katalogi
 Opcji projektu . Korzystanie z tego sposobu oznacza jednak każdorazowe wprowadzanie tych
ścieżek przy tworzeniu nowego projektu:
Drugim rozwiązaniem jest dodanie tych samych ścieżek w konfiguracji globalnej kompilatora.
Przechodzimy do Narzędzia -> Opcje kompilatora, zakładka  Katalogi :
Wspomniane ścieżki to:
 biblioteki: \lib (u mnie: C:\Dev-Cpp\DeinoMPI\lib)
 pliki nagłówkowe C/C++ \include (u mnie: C:\Dev-
Cpp\DeinoMPI\include).
10/12
MPI pod Windows XP Maciej Tarkowski
Uff, i to by było na tyle konfiguracji. Teraz możemy oddać się przyjemności programowania w C++
z wykorzystaniem MPI.
Wklejmy przykładowy kod z rozdziału 3 i skompilujmy projekt (F9). Kompilacja powinna
zakończyć się powodzeniem.
Nastąpi automatyczne uruchomienie aplikacji. I tu pojawia się ciekawostka wynikająca ze specyfiki
środowiska MPI. Otóż jeśli korzystasz z firewalla, musisz się liczyć z jego interwencją w tym
momencie. Programy wykorzystujące MPI odwołują się bezpośrednio do procesów, co może nie
spodobać się firewallowi:
Dopiero kliknięcie  Allow powoduje uruchomienie aplikacji.
Firewall często może interweniować w następnej fazie, czyli przy uruchamianiu wielu procesów.
11/12
MPI pod Windows XP Maciej Tarkowski
6. Uruchamianie
W celu uruchomienia wielu procesów tej samej aplikacji możemy skorzystać z omawianego
wcześniej programu DeinoMPIWin: w zakładce  Mpiexec wskazujemy exe'ka, ustawiamy liczbę
procesów i klikamy  execute . Dopilnujmy również wyboru konta  credental store .
Jak wspominałem, firewall może w tym momencie bardzo protestować.
Opisana zakładka programu DeinoMPIWin jest graficzną nakładką na uruchamiany z wiersza
poleceń program mpiexec, znajdujący się w katalogu  bin .
Uruchomienie naszej aplikacji z poziomu linii komend, jest równie proste. Podstawowa składnia
przedstawia się następująco:
mpiexec -np
Koniec.
12/12


Wyszukiwarka