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