MPI
user: Tadeusz Zalewski
Cześć! Czy istnieje jakiś sposób na uruchomienie programu wykorzystującego bibliotekę MPI pomijając mprun? Coś jak z PVM. Czy rezerwacji zasobów jakiej dokunuje mprun nie da się obejść w inny sposób? Aktualnie pracuję z Sun MPI na Solrisie. Ale będę też chciał zrobić to podobnie na Linuksie z MPICH2. Pozdrawiam
Re: MPI
user: gacek
Tadeusz Zalewski wrote: > Cześć! > > Czy istnieje jakiś sposób na uruchomienie programu wykorzystującego > bibliotekę MPI pomijając mprun? Coś jak z PVM. Czy rezerwacji zasobów > jakiej dokunuje mprun nie da się obejść w inny sposób? > > Aktualnie pracuję z Sun MPI na Solrisie. Ale będę też chciał zrobić to > podobnie na Linuksie z MPICH2. ale w czym problem? w mpich2 chyba jest mpirun (albo jakis mpiexec)? gacek
Re: MPI
user: Tadeusz Zalewski
gacek wrote: > > ale w czym problem? w mpich2 chyba jest mpirun (albo jakis mpiexec)? > Sęk w tym, że mój program musi być jednym z kilku uruchamianych w ciągu przez zewnętrzny program. Nie mogę wykonać tam polecenia mprun. Muszę wykonać plik exe, który będzie miał w sobie odpowiednie dla zewnętrznego programu funkcje inicjujące. Pozdrawiam
Re: MPI
user: Mariusz Maslowski
Tadeusz Zalewski wrote: > Cześć! > > Czy istnieje jakiś sposób na uruchomienie programu wykorzystującego > bibliotekę MPI pomijając mprun? Coś jak z PVM. Czy rezerwacji zasobów > jakiej dokunuje mprun nie da się obejść w inny sposób? Z tego co pamiętam we wszystkich implementacjach MPI było tak, że wirtualna maszyna (cluster), był setup-owany niejako rozłącznie do wykonywanego kodu... Zresztą sama specyfikacja nic też nie mówiła o spawnowaniu procesów. Nie wchodziło to w zakres standardu. -- Pozdrawiam serdecznie, Mariusz Maslowski
Re: MPI
user: Mariusz Maslowski
Tadeusz Zalewski wrote: > Sęk w tym, że mój program musi być jednym z kilku uruchamianych w > ciągu przez zewnętrzny program. Nie mogę wykonać tam polecenia mprun. Niby dlaczego właściwie? Chodzi o parametry? Można napisać prosty skrypt, który owinie mpirun i twój program > Muszę wykonać plik exe, który będzie miał w sobie odpowiednie dla > zewnętrznego programu funkcje inicjujące. Jeśli tak, to owe funkcje inicjujące zrób w swoim programie, a w nim wywołaj również polecenie mpirun: system("mpirun " + twoj_prog_mpi + argumenty); -- Pozdrawiam serdecznie, Mariusz Maslowski
Re: MPI
user: Tadeusz Zalewski
Mariusz Maslowski wrote: > Z tego co pamiętam we wszystkich implementacjach MPI było tak, że > wirtualna maszyna (cluster), był setup-owany niejako rozłącznie do > wykonywanego kodu... > > Zresztą sama specyfikacja nic też nie mówiła o spawnowaniu procesów. > Nie wchodziło to w zakres standardu. > W standardzie MPI2 to jest (spawnowanie procesów) i ja właśnie muszę to zastosować. Tylko ta rezerwacja zasobów jest tochę inaczej rozwiązana niż w PVM, co sprawia mi problem.
Re: MPI
user: Tadeusz Zalewski
Mariusz Maslowski wrote: > > Jeśli tak, to owe funkcje inicjujące zrób w swoim programie, a w nim > wywołaj również polecenie mpirun: > > system("mpirun " + twoj_prog_mpi + argumenty); > Niestety wtedy stracę kontak z terabajtami danych i musiałbym to oprogramować od zera wszystko. Ten program to taki bardzo złożony system do przetwarzania danych sejsmicznych. Dlatego chcę uruchomić mój moduł równoległy jako któryś z koleii program w jendym ciągu. Jeden moduł odpowiada za wczytanie danych, potem kolejne za ich obróbkę i na końcu oczywiście jakieś wyjście. Poprzez funkcje inicjalizujacą i finalziującą kolejne moduły jakby przekazują sobie dostęp do danych. A te dane to nie jest poprostu jeden ciąg danych tylko skomplikowana struktura z różnymi bazami, do których odwołuję sie poprzez całe multum funkcji. Potem chcę wyciągnąć z nich odpowiednie macierze i wykorzystać MPI_Comm_Spawn do rozesłania po kilku procesach.
Re: MPI
user: Mariusz Maslowski
Tadeusz Zalewski wrote: > W standardzie MPI2 to jest (spawnowanie procesów) i ja właśnie muszę > to zastosować. He, za moich czasów było MPI 1.1 i wtedy chyba jeszcze nie było... > Tylko ta rezerwacja zasobów jest tochę inaczej rozwiązana niż w PVM, > co sprawia mi problem. Jaki problem? przykład na spawnowanie procesów: http://www.mpi-forum.org/docs/mpi-20-html/node98.htm#Node98 przykład na przesyłanie danych: http://www.mpi-forum.org/docs/mpi-20-html/node106.htm#Node109 -- Pozdrawiam serdecznie, Mariusz Maslowski
Re: MPI
user: Tadeusz Zalewski
Mariusz Maslowski wrote: > > Jaki problem? > > przykład na spawnowanie procesów: > http://www.mpi-forum.org/docs/mpi-20-html/node98.htm#Node98 > > przykład na przesyłanie danych: > http://www.mpi-forum.org/docs/mpi-20-html/node106.htm#Node109 > Trochę się nie zrozumieliśmy. Używając PVM nie ma czegoś takiego jak pvmrun, tylko poprostu uruchamia się program, będący w odpowiednim katalogu a rezerwacja zasobów jak rozumiem dokonuje się podczas wykonywania "spawnowania". W MPI jest mprun i on rezerwuje zasoby (Jak wykonuję wewnątrz programu "spawnowanie" to musze z góry przewidzieć ile chce procesów uruchomić i dać opcje -nr ilosc_procesów) i to jest mój problem, o czym szerzej napisałem w odpowiedzi na Twój inny post. Z samym MPI jak narazie nie mam żadnych problemów.
Re: MPI
user: Mariusz Maslowski
Tadeusz Zalewski wrote: > Trochę się nie zrozumieliśmy. Używając PVM nie ma czegoś takiego jak > pvmrun, tylko poprostu uruchamia się program, będący w odpowiednim > katalogu a rezerwacja zasobów jak rozumiem dokonuje się podczas > wykonywania "spawnowania". W MPI jest mprun i on rezerwuje zasoby (Jak > wykonuję wewnątrz programu "spawnowanie" to musze z góry przewidzieć > ile chce procesów uruchomić i dać opcje -nr ilosc_procesów) Naprawdę? Z pobieżnej lektury dokumentacji zrozumiałem, że MPI_Comm_Spawn() uruchamia dodatkową grupę procesów w liczbie niezależnej od aktualnie wykonywanego procesu uruchomionego za pomocą mpirun. Zatem w twoim wypadku byłyby de facto dwa programy: jeden -- worker.exe, i drugi -- master.exe. Uruchamiasz: mpirun -nr 1 ./master Natomiast master spawnuje workerów: MPI_Comm_Spawn("./worker.exe", nproc); Czy to jest odpowiedź na twój problem? > i to jest mój problem, o czym szerzej napisałem w odpowiedzi na Twój > inny post. Z samym MPI jak narazie nie mam żadnych problemów. -- Pozdrawiam serdecznie, Mariusz Maslowski
Re: MPI
user: gacek
Tadeusz Zalewski wrote: > Trochę się nie zrozumieliśmy. Używając PVM nie ma czegoś takiego jak > pvmrun, tylko poprostu uruchamia się program, będący w odpowiednim > katalogu a rezerwacja zasobów jak rozumiem dokonuje się podczas > wykonywania "spawnowania". W MPI jest mprun i on rezerwuje zasoby (Jak > wykonuję wewnątrz programu "spawnowanie" to musze z góry przewidzieć ile > chce procesów uruchomić i dać opcje -nr ilosc_procesów) i to jest mój > problem, o czym szerzej napisałem w odpowiedzi na Twój inny post. Z > samym MPI jak narazie nie mam żadnych problemów. Powiedz wiecej o tym mechanizmie przekazywania tych danych. Jak dokladnie to co piszesz w MPI dostaje dane? gacek
Re: MPI
user: Tadeusz Zalewski
Mariusz Maslowski wrote: > > Naprawdę? Z pobieżnej lektury dokumentacji zrozumiałem, że > MPI_Comm_Spawn() uruchamia dodatkową grupę procesów w liczbie > niezależnej od aktualnie wykonywanego procesu uruchomionego za pomocą > mpirun. > > Zatem w twoim wypadku byłyby de facto dwa programy: jeden -- > worker.exe, i drugi -- master.exe. Uruchamiasz: > mpirun -nr 1 ./master > Natomiast master spawnuje workerów: > MPI_Comm_Spawn("./worker.exe", nproc); > > Czy to jest odpowiedź na twój problem? > Nie nie. To nie jest mój problem. A jeśli chodzi o MPI_Comm_Spawn to po pierwsze ja dokładnie to korzystam z implementacji Sun MPI(dlatego ja piszę mprun a Ty piszesz mpirun). W mojej dokumentacji jest jasno napisane, że jeżeli chce wykonać polecenie MPI_Comm_Spawn to program z którego to robię muszę uruchomić poprzez: mprun -nr liczba_procesów i to rezerwuje zasoby, a w MPI_Comm_Spawn nie mogę przekroczyć paremetrem nproc liczby liczba_procesów - 1. Ale to nie jest istostą mojego problemu, bo tak czy siak muszę uruchomić program poprzez mprun, a ja chciałbym to ominąć.
Re: MPI
user: Tadeusz Zalewski
gacek wrote: > > Powiedz wiecej o tym mechanizmie przekazywania tych danych. > > Jak dokladnie to co piszesz w MPI dostaje dane? > To nie jest istota mojego problemu. Ale nic mi nie szkodzi odpisać więc: Spod interfejsu mojego programu do przetwarzania danych sejsmicznych uruchamiam mój moduł. Składa się on z dwóch programów: master i slave. Program master pobiera np. parametry wykonania poprzez menu, które jest pisane w Lispie(nie pytajcie dlaczego. Taki mam produkt i z nim pracuje.) Wewnątrz programu master korzystam z funkcji bibliotecznych, które udostępnia mi API owego programu sejsmicznego, wyciągając dane z odpowiednich baz (nie wiem jak są zaiplementowane te bazy, ale to jest kod zamknięty i nie mam do niego dostępu). Następnie operuje już na tablicach w C. Z mojego programu master wywołuje poprzez MPI_Comm_Spawn program slave w odpowiedniej ilosci kopii. Między master a slave przesyłam dane wykorzystując mechanizmy MPI. Ot cała komunikacja. Wcześniej podobnie to robiłem z wykorzystaniem PVM zamiast MPI i działało, tylko że w PVM nie ma pvmrun. Pozdrawiam
Re: MPI
user: gacek
Tadeusz Zalewski wrote: > Nie nie. To nie jest mój problem. A jeśli chodzi o MPI_Comm_Spawn to po > pierwsze ja dokładnie to korzystam z implementacji Sun MPI(dlatego ja > piszę mprun a Ty piszesz mpirun). W mojej dokumentacji jest jasno > napisane, że jeżeli chce wykonać polecenie MPI_Comm_Spawn to program z > którego to robię muszę uruchomić poprzez: > mprun -nr liczba_procesów i to rezerwuje zasoby, a w MPI_Comm_Spawn nie > mogę przekroczyć paremetrem nproc liczby liczba_procesów - 1. Ale to nie > jest istostą mojego problemu, bo tak czy siak muszę uruchomić program > poprzez mprun, a ja chciałbym to ominąć. ale dlaczego chcesz tego uniknac? "jeżeli chce wykonać polecenie MPI_Comm_Spawn to program z którego to robię muszę uruchomić poprzez: mprun -nr liczba_procesów i to rezerwuje zasoby" co stoi na przeszkodzie zeby wlasnie tak robic? gacek
Re: MPI
user: Tadeusz Zalewski
gacek wrote: > > co stoi na przeszkodzie zeby wlasnie tak robic? > Już to wyjaśniłem parę postów wyżej. Moje programy są uruchamiane wewnątrz innego większego programu i jak on nie widzi funkcji inicjującej z jego biblioteki na początku to nie wie co z tym zrobić, a mprun nie ma w sobie takiej funkcji.
Re: MPI
user: gacek
Tadeusz Zalewski wrote: > gacek wrote: > >> >> co stoi na przeszkodzie zeby wlasnie tak robic? >> > > Już to wyjaśniłem parę postów wyżej. Moje programy są uruchamiane > wewnątrz innego większego programu w jaki sposob? exec()? > i jak on nie widzi funkcji > inicjującej z jego biblioteki na początku to nie wie co z tym zrobić, a > mprun nie ma w sobie takiej funkcji. hmmm. "nie widzi funkcji inicjujacej", czyli tak rozkladajac na czynniki pierwsze .... gacek
Re: MPI
user: Tadeusz Zalewski
gacek wrote: >> Już to wyjaśniłem parę postów wyżej. Moje programy są uruchamiane >> wewnątrz innego większego programu > > w jaki sposob? exec()? > Nie mam dostępu do kodu źródłowego tego programu. Mam udostępnioną tylko masę funkcji i procedury dołączania nowych podprogramów (poprzez menu pisane w Lispie). >> i jak on nie widzi funkcji inicjującej z jego biblioteki na początku >> to nie wie co z tym zrobić, a mprun nie ma w sobie takiej funkcji. > > hmmm. "nie widzi funkcji inicjujacej", czyli tak rozkladajac na czynniki > pierwsze .... > w moim programie pisanym w C muszę mieć po funkcji main i deklaracjach zmiennych jedną z funkcji inicjujących, która jest w udostępnionej mi bibliotece. Oczywiście do kodów źródłowych tych funkcji nie mam dostępu.
Re: MPI
user: Mariusz Maslowski
Tadeusz Zalewski wrote: > gacek wrote: > >>> Już to wyjaśniłem parę postów wyżej. Moje programy są uruchamiane >>> wewnątrz innego większego programu >> >> >> w jaki sposob? exec()? >> > > Nie mam dostępu do kodu źródłowego tego programu. Mam udostępnioną > tylko masę funkcji i procedury dołączania nowych podprogramów (poprzez > menu pisane w Lispie). A w czym ma być napisany ten podprogram? Zresztą to chyba jest nieistotne. W każdym z języków będziesz mógł wystartować inny program. W C będzie to właśnie exec() albo system(). I jako program do uruchomienia przez te funkcje podasz mpirun czy mprun a jako argumenty -nproc oraz Twój program w MPI. Czy coś stoi na przeszkodzie takiemu rozwiązaniu? -- Pozdrawiam serdecznie, Mariusz Maslowski
Re: MPI
user: Tadeusz Zalewski
Mariusz Maslowski wrote: > > A w czym ma być napisany ten podprogram? > Zresztą to chyba jest nieistotne. W każdym z języków będziesz mógł > wystartować inny program. > W C będzie to właśnie exec() albo system(). I jako program do > uruchomienia przez te funkcje podasz mpirun czy mprun a jako argumenty > -nproc oraz Twój program w MPI. > Czy coś stoi na przeszkodzie takiemu rozwiązaniu? > Niestety tak. Stoi na przeszkodzie to, że w tym momencie tracę kontakt z moimi danymi sejsmicznymi.
Re: MPI
user: Mariusz Maslowski
Tadeusz Zalewski wrote: > > Niestety tak. Stoi na przeszkodzie to, że w tym momencie tracę kontakt > z moimi danymi sejsmicznymi. Jak to możliwe? A gdzie te dane sejsmiczne przechowujesz? Nie w pliku? -- Pozdrawiam serdecznie, Mariusz Maslowski
Re: MPI
user: Tadeusz Zalewski
Mariusz Maslowski wrote: > > Jak to możliwe? > A gdzie te dane sejsmiczne przechowujesz? Nie w pliku? > Już pisałem, że muszę uruchomić sekwencję programów, co u nas nazywa się job. Pierwszy program w tej sekwencji to wczytanie danych zazwyczaj. Dane są w różnych formatach wiele programów wczytujących do tego służy (kilkadziesiąt) potem są zapisywane przez ten program do swojej postaci w odpowiedniej strukturze do której ja się dostaję z mojego programu poprzez wywoływanie odpowiednich funkcji z udostępnionej mi biblioteki. Inaczej tego nie wczytam. A skolei jak nie zaincjalizuje programu funkcją inicjalizującą to nie mam dodtępu do tych funkcji. Czyli jak uruchomię mój program poprzez exec() lub system() to nie mogę korzystać z funkcji pobierających dane, Nie mogę wpisać tam funkcji inicjalizującej bo ona działa tylko wtedy jak mój program uruchomię wewnątrz tego ich menu. Jedyne wyjście które widzę dla mojego problemu to komunikacja między procesowa. Chyba to się nazywa sockety. Tylko, ze jeszcze tego nie umiem i myślałem, że da się jakoś podobnie to zrobić jak zrobiłem z PVM. Pozdrawiam
Re: MPI
user: Mariusz Maslowski
Tadeusz Zalewski wrote: > Czyli jak uruchomię mój program poprzez exec() lub system() to nie > mogę korzystać z funkcji pobierających dane, Nie mogę wpisać tam > funkcji inicjalizującej bo ona działa tylko wtedy jak mój program > uruchomię wewnątrz tego ich menu. No tak. To zrozumiałe. > Jedyne wyjście które widzę dla mojego problemu to komunikacja między > procesowa. Chyba to się nazywa sockety. Tylko, ze jeszcze tego nie > umiem i myślałem, że da się jakoś podobnie to zrobić jak zrobiłem z PVM. Nie tylko sockety. Również: pliki, kolejki fifo (named pipe), pamięć dzielona itp. Przy okazji -- sockety, podobnie troszkę do PVM, czy MPI nadają się do komunikacji między procesami na różnych maszynach; pliki, fifo i pamięć dzielona -- w ramach jednego komputera. Pliki są jakby na pograniczu tego podziału, zważywszy na sieciowe systemy plików (NFS, Samba, HTTP, FTP itp.) Ja bym chyba w twojej sytuacji użył pamięci dzielonej, lub fifo. Fifo jest prostsze, ale wymaga serializacji danych, a pamięć dzielona nie. -- Pozdrawiam serdecznie, Mariusz Maslowski
Re: MPI
user: Tadeusz Zalewski
Mariusz Maslowski wrote: > > Ja bym chyba w twojej sytuacji użył pamięci dzielonej, lub fifo. Fifo > jest prostsze, ale wymaga serializacji danych, a pamięć dzielona nie. > Czy mógłbyś mi polecić jakieś sprawdzone materiały w tym zakresie? Chciałbym to zaimplementować na Solarisie i Red Hacie. Pozdrawiam
Re: MPI
user: Marcin 'Qrczak' Kowalczyk
Mariusz Maslowski
Re: MPI
user: Mariusz Maslowski
Tadeusz Zalewski wrote: > Mariusz Maslowski wrote: > >> >> Ja bym chyba w twojej sytuacji użył pamięci dzielonej, lub fifo. Fifo >> jest prostsze, ale wymaga serializacji danych, a pamięć dzielona nie. >> > > Czy mógłbyś mi polecić jakieś sprawdzone materiały w tym zakresie? > Chciałbym to zaimplementować na Solarisie i Red Hacie. Dokumentacja do GNU C Library. /usr/share/info/libc.info.gz http://www.gnu.org/software/libc/manual/ IPC na Solarisie: http://docs.sun.com/app/docs/doc/816-1042/6m7g4ma76 Wydaje mi sie że powinno wystarczyć. :) -- Pozdrawiam serdecznie, Mariusz Maslowski
Re: MPI
user: Mariusz Maslowski
Marcin 'Qrczak' Kowalczyk wrote: >Mariusz Maslowski
MPI
user: pwa@WYTNIJ-TO.autograf.pl (pwa)
Mam pytanie w jaki sposob w MPI-u w polaczneiu z C++ napisac program ktory: wysle np z procesu 1 do procesu 0 "n" oddzielnych zapytan i uzyska na nie oddzielne odpowiedzi od procesu 0??
