Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
venovako Forumaš(ica)

Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
Postano: 17:39 pet, 22. 2. 2008 Naslov: PA (was: MPIApp) |
|
|
Problem:
MPI programi traze podosta inicijalizacije, ciscenja, pazljivog ukljucivanja zaglavlja i povezivanja s MPI i raznim drugim bibliotekama. Da stvar bude gora, na Windowsima (MSVC) je netrivijalno podesiti projekt (kao ilustraciju, morate paziti da na svim platformama i svim konfiguracijama rucno podesite ispravne include i library putanje i odaberete pravi C run-time).
Sav taj copy-paste [1] i kliketanje oduzima mnogo vremena i podlozno je greskama. Takodjer, besmisleno je ne iskoristiti vec napisane rutinice, ali bez [1]. Bilo bi dobro moci isprobati svoju MPI aplikaciju sa i bez threadinga, ali da se ne mora rekompajlirati. A ponajvise bi imalo smisla sve primjere drzati na jednom mjestu i trivijalno ih prepraviti, pokrenuti i medjusobno koristiti.
Od paralelnih se programa jos ocekuje, osim lijepog dizajna, i portabilnost. Moraju se, uz minimalne modifikacije, moci kompajlirati i izvrsavati na raznim platformama i s raznim MPI bibliotekama. Lijeni kao pravi programeri i apstrakcijama skloni kao pravi matematicari, htjeli bi negdje duboko zakopati sve te platformske ovisnosti.
Rjesenje:
[url=http://www.fsb.hr/~venovako/nastava/PMF-MO/ParAlg12/PA2/MPIApp.zip]MPIApp[/url].
Generalna je ideja imati [b]jedan[/b] solution i [b]tri[/b] projekta u njemu. No more, no less, za cijeli iduci semestar a i kucnu radinost kasnije. Kratki pregled:
[code:1]MPIApp (VS2005 solution)
|
+---> MPIAppEXE (svojevrsni shell za pokretanje nasih programa, .exe)
|
+---> MPIAppDLL (sve opcekorisne rutine za cijeli solution, .dll)
|
+---> MPIApps (nasi MPI programi kao .dll exportane funkcije)[/code:1]
[code:1]===> (compile-time); ---> (run-time) ovisnosti:
MPIAppEXE ===> MPIAppDLL <=== MPIApps
v ^
| |
+---------------------------+
[/code:1]
Napominjem, ovo jest VS2005-centricna distribucija, ali je kod pisan tako da radi i na svakom razumnom POSIX sustavu.
Po stavkama:
[b]MPIAppEXE[/b] je programcic koji inicijalizira MPI sustav, MPI threading i exception handling, te ucita DLL koji sadrzi nase programe i pokrene zadani program (tj. proceduru).
[b]MPIAppDLL[/b] je biblioteka koja sadrzi globalno korisne rutine i klase, npr. za portabilan rad s DLLovima, exceptionima, a tu ce polako ulaziti i obecani Octave I/O i opcenito sve sto se moze iskoristiti vise no jednom.
[b]MPIApps[/b] je DLL-kontejner nasih programa. Za svaki program eksportiramo proceduru koja glumi njegov main; program pozivamo u run-time-u odabirom imena procedure.
Najbolje je pogledati primjercic iz distribucije.
Pretpostavimo da ste na Windowsima i imate MPICH2 instaliran u defaultnom direktoriju.
Dignete MPIApp.sln, odaberete platformu (x64 ili Win32) i konfiguraciju (Debug ili Release), te kazete (Re)build solution.
Odete u konzolu, iz direktorija u kojem su generirani .exe i .dll-ovi pokrenete MPIAppEXE.exe i pogledate sintaksu poziva.
Npr. jedan moguci poziv (uz prethodno obavljeni mpiexec -register):
[code:1]mpiexec -user 1 -n 1 MPIAppEXE.exe M MPIApps.dll echoExample foo bar[/code:1]
daje sljedeci rezultat:
[code:1]ARGC = 2
ARGV[0] = foo
ARGV[1] = bar
THREADING_REQUESTED = MPI_THREAD_MULTIPLE
THREADING_PROVIDED = MPI_THREAD_SINGLE[/code:1]
Aplikacije iz DLLa koje ne koriste MPI mogu se pokrenuti bez inicijalizacije MPIa:
[code:1]MPIAppEXE.exe 0 MPIApps.dll echoExample bla[/code:1]
Nema nista carobno u MPIApps.dll. Svaki .dll koji se linka na biblioteke kompatibilne MPIAppEXE-u (dakle, C runtime je identican i ako se koristi MPI, to je isti kao za MPIAppDLL/EXE) i eksporta funkcije sa signaturom kao u primjeru [!] moze posluziti (ali je cilj imati ih sto manje, tj. jedan).
[!] Iznimno je vazno pri eksportanju funkcije koja predstavlja ulaz (entry-point) u novu aplikaciju paziti na njenu signaturu.
Pogledajte kako mora izgledati u primjeru i u MPIAppDLL.hpp (EntryFn).
U ovom trenutku najbolje je proci kroz kod, pogledati kako je slozen ovaj trivijalni primjercic, te probati dodati neki svoj (tipa, ispisi rank u komunikatoru i njegovu velicinu, za pocetak...) u MPIApps.dll i pokrenuti ga. Primijetite, MPIApps.dll se ucitava dinamicki, tj. nije potrebno rebuildati nista osim njega, ako se samo on promijenio.
TODO:
-> Iskoristiti ovaj sustav da se napise sto vise MPI programa...
Primjedbe ne samo da prihvacam, vec i trazim.
P.S. Dodani Makefile-ovi za GNU make. Ako netko zeli isprobati, prvo u direktoriju MPIAppDLL kaze make, zatim isto u MPIAppEXE i potom u MPIApps.
Problem:
MPI programi traze podosta inicijalizacije, ciscenja, pazljivog ukljucivanja zaglavlja i povezivanja s MPI i raznim drugim bibliotekama. Da stvar bude gora, na Windowsima (MSVC) je netrivijalno podesiti projekt (kao ilustraciju, morate paziti da na svim platformama i svim konfiguracijama rucno podesite ispravne include i library putanje i odaberete pravi C run-time).
Sav taj copy-paste [1] i kliketanje oduzima mnogo vremena i podlozno je greskama. Takodjer, besmisleno je ne iskoristiti vec napisane rutinice, ali bez [1]. Bilo bi dobro moci isprobati svoju MPI aplikaciju sa i bez threadinga, ali da se ne mora rekompajlirati. A ponajvise bi imalo smisla sve primjere drzati na jednom mjestu i trivijalno ih prepraviti, pokrenuti i medjusobno koristiti.
Od paralelnih se programa jos ocekuje, osim lijepog dizajna, i portabilnost. Moraju se, uz minimalne modifikacije, moci kompajlirati i izvrsavati na raznim platformama i s raznim MPI bibliotekama. Lijeni kao pravi programeri i apstrakcijama skloni kao pravi matematicari, htjeli bi negdje duboko zakopati sve te platformske ovisnosti.
Rjesenje:
MPIApp.
Generalna je ideja imati jedan solution i tri projekta u njemu. No more, no less, za cijeli iduci semestar a i kucnu radinost kasnije. Kratki pregled:
Kod: | MPIApp (VS2005 solution)
|
+---> MPIAppEXE (svojevrsni shell za pokretanje nasih programa, .exe)
|
+---> MPIAppDLL (sve opcekorisne rutine za cijeli solution, .dll)
|
+---> MPIApps (nasi MPI programi kao .dll exportane funkcije) |
Kod: | ===> (compile-time); ---> (run-time) ovisnosti:
MPIAppEXE ===> MPIAppDLL <=== MPIApps
v ^
| |
+---------------------------+
|
Napominjem, ovo jest VS2005-centricna distribucija, ali je kod pisan tako da radi i na svakom razumnom POSIX sustavu.
Po stavkama:
MPIAppEXE je programcic koji inicijalizira MPI sustav, MPI threading i exception handling, te ucita DLL koji sadrzi nase programe i pokrene zadani program (tj. proceduru).
MPIAppDLL je biblioteka koja sadrzi globalno korisne rutine i klase, npr. za portabilan rad s DLLovima, exceptionima, a tu ce polako ulaziti i obecani Octave I/O i opcenito sve sto se moze iskoristiti vise no jednom.
MPIApps je DLL-kontejner nasih programa. Za svaki program eksportiramo proceduru koja glumi njegov main; program pozivamo u run-time-u odabirom imena procedure.
Najbolje je pogledati primjercic iz distribucije.
Pretpostavimo da ste na Windowsima i imate MPICH2 instaliran u defaultnom direktoriju.
Dignete MPIApp.sln, odaberete platformu (x64 ili Win32) i konfiguraciju (Debug ili Release), te kazete (Re)build solution.
Odete u konzolu, iz direktorija u kojem su generirani .exe i .dll-ovi pokrenete MPIAppEXE.exe i pogledate sintaksu poziva.
Npr. jedan moguci poziv (uz prethodno obavljeni mpiexec -register):
Kod: | mpiexec -user 1 -n 1 MPIAppEXE.exe M MPIApps.dll echoExample foo bar |
daje sljedeci rezultat:
Kod: | ARGC = 2
ARGV[0] = foo
ARGV[1] = bar
THREADING_REQUESTED = MPI_THREAD_MULTIPLE
THREADING_PROVIDED = MPI_THREAD_SINGLE |
Aplikacije iz DLLa koje ne koriste MPI mogu se pokrenuti bez inicijalizacije MPIa:
Kod: | MPIAppEXE.exe 0 MPIApps.dll echoExample bla |
Nema nista carobno u MPIApps.dll. Svaki .dll koji se linka na biblioteke kompatibilne MPIAppEXE-u (dakle, C runtime je identican i ako se koristi MPI, to je isti kao za MPIAppDLL/EXE) i eksporta funkcije sa signaturom kao u primjeru [!] moze posluziti (ali je cilj imati ih sto manje, tj. jedan).
[!] Iznimno je vazno pri eksportanju funkcije koja predstavlja ulaz (entry-point) u novu aplikaciju paziti na njenu signaturu.
Pogledajte kako mora izgledati u primjeru i u MPIAppDLL.hpp (EntryFn).
U ovom trenutku najbolje je proci kroz kod, pogledati kako je slozen ovaj trivijalni primjercic, te probati dodati neki svoj (tipa, ispisi rank u komunikatoru i njegovu velicinu, za pocetak...) u MPIApps.dll i pokrenuti ga. Primijetite, MPIApps.dll se ucitava dinamicki, tj. nije potrebno rebuildati nista osim njega, ako se samo on promijenio.
TODO:
→ Iskoristiti ovaj sustav da se napise sto vise MPI programa...
Primjedbe ne samo da prihvacam, vec i trazim.
P.S. Dodani Makefile-ovi za GNU make. Ako netko zeli isprobati, prvo u direktoriju MPIAppDLL kaze make, zatim isto u MPIAppEXE i potom u MPIApps.
Zadnja promjena: venovako; 13:05 pon, 6. 7. 2009; ukupno mijenjano 4 put/a.
|
|
[Vrh] |
|
Casper Forumaš(ica)


Pridružen/a: 02. 04. 2005. (14:45:29) Postovi: (7E)16
Spol: 
Lokacija: Krk
|
|
[Vrh] |
|
venovako Forumaš(ica)

Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
Postano: 19:38 pet, 29. 2. 2008 Naslov: |
|
|
Ako ste slucajno nesto pokusavali u zadnje vrijeme s MPIApp-om, vjerojatno vam nije radio. To je posve normalno i ocekivano, jer su dodani primjeri za upotrebu HDF5 datotecnog formata i biblioteke, koju cemo opisati na prvim vjezbama (tada cete, ako ne i prije, saznati sto je ciniti da MPIApp opet proradi i u vasem domu). Zapravo, sve radi kad se ispravno konfigurira, u sto se vec mozete uvjeriti u Praktikumu 2. Kako mi se ne raspisuje ovdje, vidimo prvih 5 minuta na vjezbama.
Ako ste slucajno nesto pokusavali u zadnje vrijeme s MPIApp-om, vjerojatno vam nije radio. To je posve normalno i ocekivano, jer su dodani primjeri za upotrebu HDF5 datotecnog formata i biblioteke, koju cemo opisati na prvim vjezbama (tada cete, ako ne i prije, saznati sto je ciniti da MPIApp opet proradi i u vasem domu). Zapravo, sve radi kad se ispravno konfigurira, u sto se vec mozete uvjeriti u Praktikumu 2. Kako mi se ne raspisuje ovdje, vidimo prvih 5 minuta na vjezbama.
|
|
[Vrh] |
|
venovako Forumaš(ica)

Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
Postano: 18:21 sub, 15. 3. 2008 Naslov: |
|
|
Latest & greatest MPIApp je na Webu i na student-u.
Unutra su paralelni konjugirani gradijenti.
Obecani clanak mozete pronaci kao PDF na student-u, pod [tt]~venovako/MPIApp/MPIApps/CG_extra/[/tt]; u istom je direktoriju test primjer s nekoliko razlicito tocnih rjesenja.
Popis potrebnih biblioteka se produljio, pa sad uz HDF5 trebate i (C)BLAS, bilo u [url=http://math-atlas.sourceforge.net/]ATLAS[/url] ili Intel MKL izdanju. Teoretski, ako imate sve potrebno i kazete projektima gdje se to nalazi, MPIApp ce raditi i pod Windowsima. Ako netko zeli tu varijantu, objasnim na konzultacijama (tj. nakon vjezbi). U Praktikumu 2 bi sve trebalo raditi i dalje, sto cu jos provjeriti.
Na pocetku sljedecih vjezbi pogledamo ostatak koda i kako koristiti BLAS rutine u C i C++ okruzenju, sto sam vam ostao duzan od prosli put.
Latest & greatest MPIApp je na Webu i na student-u.
Unutra su paralelni konjugirani gradijenti.
Obecani clanak mozete pronaci kao PDF na student-u, pod ~venovako/MPIApp/MPIApps/CG_extra/; u istom je direktoriju test primjer s nekoliko razlicito tocnih rjesenja.
Popis potrebnih biblioteka se produljio, pa sad uz HDF5 trebate i (C)BLAS, bilo u ATLAS ili Intel MKL izdanju. Teoretski, ako imate sve potrebno i kazete projektima gdje se to nalazi, MPIApp ce raditi i pod Windowsima. Ako netko zeli tu varijantu, objasnim na konzultacijama (tj. nakon vjezbi). U Praktikumu 2 bi sve trebalo raditi i dalje, sto cu jos provjeriti.
Na pocetku sljedecih vjezbi pogledamo ostatak koda i kako koristiti BLAS rutine u C i C++ okruzenju, sto sam vam ostao duzan od prosli put.
|
|
[Vrh] |
|
venovako Forumaš(ica)

Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
Postano: 15:12 pon, 17. 3. 2008 Naslov: |
|
|
Dakle, ispitni zadatak na temu paralelnih konjugiranih gradijenata, pa uzme tko hoce:
:-) Uobliciti postojeci kod u nesto objektno-orjentiranije.
:-) Kako je matrica sustava simetricna, dovoljno je pamtiti trokut. Modificirati I/O, memorijsku reprezentaciju podataka i BLAS 2 pozive da uvaze i iskoriste tu cinjenicu. Dodatno, prouciti mogucnost kompresije ulaznih i izlaznih podataka u datoteci.
:-) Realizirati algoritam kad broj procesa u retku/stupcu ne dijeli red problema.
8-) Prouciti algoritme prekondicioniranja. Za literaturu se javite profesorici ili meni. Po dogovoru cemo odabrati neke koje trebate realizirati. Iskoristite prilozeni clanak za upute o modifikaciji osnovnog algoritma.
:twisted: Razmisliti je li moguce i kako implementirati dvostruko kompenzirajucu sumaciju kao MPI redukcijski operator i iskoristiti ga umjesto MPI::SUM. Pazite pri tom na moguci lokalni paralelizam.
Naglasak je na 8-), dok je :twisted: opcionalan, a takodjer se moze raditi samostalno i ulazi u sumu od 3 :twisted: malih ali slatkih projekata umjesto jednog veceg.
Program treba raditi (barem) u Praktikumu 2, gdje cete odrzati i kratku prezentaciju istog.
Dakle, ispitni zadatak na temu paralelnih konjugiranih gradijenata, pa uzme tko hoce:
Uobliciti postojeci kod u nesto objektno-orjentiranije.
Kako je matrica sustava simetricna, dovoljno je pamtiti trokut. Modificirati I/O, memorijsku reprezentaciju podataka i BLAS 2 pozive da uvaze i iskoriste tu cinjenicu. Dodatno, prouciti mogucnost kompresije ulaznih i izlaznih podataka u datoteci.
Realizirati algoritam kad broj procesa u retku/stupcu ne dijeli red problema.
Prouciti algoritme prekondicioniranja. Za literaturu se javite profesorici ili meni. Po dogovoru cemo odabrati neke koje trebate realizirati. Iskoristite prilozeni clanak za upute o modifikaciji osnovnog algoritma.
Razmisliti je li moguce i kako implementirati dvostruko kompenzirajucu sumaciju kao MPI redukcijski operator i iskoristiti ga umjesto MPI::SUM. Pazite pri tom na moguci lokalni paralelizam.
Naglasak je na , dok je opcionalan, a takodjer se moze raditi samostalno i ulazi u sumu od 3 malih ali slatkih projekata umjesto jednog veceg.
Program treba raditi (barem) u Praktikumu 2, gdje cete odrzati i kratku prezentaciju istog.
|
|
[Vrh] |
|
venovako Forumaš(ica)

Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
|
[Vrh] |
|
venovako Forumaš(ica)

Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
|
[Vrh] |
|
Markec Forumaš(ica)

Pridružen/a: 20. 02. 2003. (14:49:45) Postovi: (134)16
Spol: 
|
|
[Vrh] |
|
venovako Forumaš(ica)

Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
|
[Vrh] |
|
Markec Forumaš(ica)

Pridružen/a: 20. 02. 2003. (14:49:45) Postovi: (134)16
Spol: 
|
|
[Vrh] |
|
venovako Forumaš(ica)

Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
Postano: 14:26 ned, 1. 6. 2008 Naslov: |
|
|
:oops: Hvala na upozorenju, paranoidni umask, sad bi trebalo biti u redu...
Inace, ako nesto ne valja na student-u, moze se skinuti MPIApp.zip ovdje (isti link kao gore, samo eksplicitniji, da se laske uoci):
http://www.fsb.hr/~venovako/nastava/PMF-MO/ParAlg12/PA2/MPIApp.zip
Hvala na upozorenju, paranoidni umask, sad bi trebalo biti u redu...
Inace, ako nesto ne valja na student-u, moze se skinuti MPIApp.zip ovdje (isti link kao gore, samo eksplicitniji, da se laske uoci):
http://www.fsb.hr/~venovako/nastava/PMF-MO/ParAlg12/PA2/MPIApp.zip
|
|
[Vrh] |
|
Markec Forumaš(ica)

Pridružen/a: 20. 02. 2003. (14:49:45) Postovi: (134)16
Spol: 
|
|
[Vrh] |
|
venovako Forumaš(ica)

Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
|
[Vrh] |
|
venovako Forumaš(ica)

Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
|
[Vrh] |
|
|