-
1. Data: 2010-11-15 16:50:45
Temat: OpenMP do zliczania węzłów drzewa
Od: Mariusz Marszałkowski <m...@g...com>
Witam
Jest sobie rekurencyjna procedura która zlicza węzły drzewa:
int zliczaj( Object *obj , depht ) {
if( depht == 0 )
return 1;
sum = 1;
for( int i=0 ; i<ilosc_potomkow( obj ) ; i++ ) {
wykonaj_instrukcje( obj );
sum += zliczaj( obj , depth-1 );
cofnij_instrukcje( obj );
}
return sum;
}
Na platformach wieloprocesorowych aż się prosi żeby zrobić po prostu
tak:
int zliczaj( Object *obj , depht ) {
if( depht == 0 )
return 1;
sum = 1;
#pragma omp parallel for private(obj) reduction(+:sum)
for( int i=0 ; i<ilosc_potomkow( obj ) ; i++ ) {
wykonaj_instrukcje( obj );
sum += zliczaj( obj , depth-1 );
cofnij_instrukcje( obj );
}
return sum;
}
Ale nie działa, kompilator wywala że zmienna obj jest użyta bez
zainicjowania, a
program się zawiesza. Co robię źle?
Pozdrawiam
-
2. Data: 2010-11-15 17:15:12
Temat: Re: OpenMP do zliczania węzłów drzewa
Od: Michoo <m...@v...pl>
W dniu 15.11.2010 17:50, Mariusz Marszałkowski pisze:
> Witam
>
> Jest sobie rekurencyjna procedura która zlicza węzły drzewa:
>
> int zliczaj( Object *obj , depht ) {
> if( depht == 0 )
> return 1;
> sum = 1;
> for( int i=0 ; i<ilosc_potomkow( obj ) ; i++ ) {
> wykonaj_instrukcje( obj );
> sum += zliczaj( obj , depth-1 );
> cofnij_instrukcje( obj );
> }
> return sum;
> }
>
> Na platformach wieloprocesorowych aż się prosi żeby zrobić po prostu
> tak:
>
> int zliczaj( Object *obj , depht ) {
> if( depht == 0 )
> return 1;
> sum = 1;
> #pragma omp parallel for private(obj) reduction(+:sum)
> for( int i=0 ; i<ilosc_potomkow( obj ) ; i++ ) {
> wykonaj_instrukcje( obj );
> sum += zliczaj( obj , depth-1 );
> cofnij_instrukcje( obj );
> }
> return sum;
> }
>
> Ale nie działa, kompilator wywala że zmienna obj jest użyta bez
> zainicjowania, a
> program się zawiesza. Co robię źle?
Mieszanie rekurencji i wielowątkowości - czy to jest dowcip?
jeżeli nie to:
masz prywatny wskaźnik do obiektu, obiekt jest współdzielony, wykonujesz
wykonaj_instrukcje i cofnij_instrukcje na nim równolegle.
Chcesz prawdopodobnie zrobić coś w stylu:
Object job = *obj;
i dopiero job potraktować jako private. Albo zapłacić komuś za zrobienie
tego dobrze.
--
Pozdrawiam
Michoo
-
3. Data: 2010-11-15 17:45:34
Temat: Re: OpenMP do zliczania węzłów drzewa
Od: Mariusz Marszałkowski <m...@g...com>
On 15 Lis, 18:15, Michoo <m...@v...pl> wrote:
> Mieszanie rekurencji i wielow tkowo ci - czy to jest dowcip?
Dlaczego to miałby być dowcip?
> Chcesz prawdopodobnie zrobi co w stylu:
> Object job = *obj;
> i dopiero job potraktowa jako private.
Object jest za duzy zeby go zawsze kopiowac, chcialem zeby
OpenMP samo go sklonowalo tylko wtedy gdy jest dostepny zasob
(czyli wolny procesor) na utworzenie nowego watku.
Pozdrawiam
-
4. Data: 2010-11-15 21:34:49
Temat: Re: OpenMP do zliczania węzłów drzewa
Od: Mariusz Marszałkowski <m...@g...com>
On 15 Lis, 18:45, Mariusz Marszałkowski <m...@g...com> wrote:
> On 15 Lis, 18:15, Michoo <m...@v...pl> wrote:
>
> > Mieszanie rekurencji i wielow tkowo ci - czy to jest dowcip?
>
> Dlaczego to miałby być dowcip?
>
Nie jest to dowcip i widze ze nawet jest bardzo eleganckie
rozwiazanie w OpenMP, ale niestety tylko w wersji 3.0 :/
http://bisqwit.iki.fi/story/howto/openmp/#TaskDirect
iveOpenmp%203%200Only
Pozdrawiam
-
5. Data: 2010-11-16 11:14:38
Temat: Re: OpenMP do zliczania węzłów drzewa
Od: Michoo <m...@v...pl>
W dniu 15.11.2010 22:34, Mariusz Marszałkowski pisze:
> On 15 Lis, 18:45, Mariusz Marszałkowski<m...@g...com> wrote:
>> On 15 Lis, 18:15, Michoo<m...@v...pl> wrote:
>>
>>> Mieszanie rekurencji i wielow tkowo ci - czy to jest dowcip?
>>
>> Dlaczego to miałby być dowcip?
Wydało mi się to sporym niezrozumieniem działania OMP o które Cię nie
posądzałem.
> Nie jest to dowcip i widze ze nawet jest bardzo eleganckie
> rozwiazanie w OpenMP, ale niestety tylko w wersji 3.0 :/
Jest eleganckie.
Na starszym OMP możesz zrobić ją deklarując zmienną jako lokalną dla
wątków i najpierw wykonać kopiowanie a potem ustawić flagę, albo rozbić
na 2 części - najpierw kopiowanie a potem obliczenia.
--
Pozdrawiam
Michoo
-
6. Data: 2010-11-16 15:40:17
Temat: Re: OpenMP do zliczania węzłów drzewa
Od: Mariusz Marszałkowski <m...@g...com>
On 16 Lis, 12:14, Michoo <m...@v...pl> wrote:
> > jest bardzo eleganckie
> > rozwiazanie w OpenMP, ale niestety tylko w wersji 3.0 :/
>
> Jest eleganckie.
>
> Na starszym OMP mo esz zrobi j deklaruj c zmienn jako lokaln dla
> w tk w i najpierw wykona kopiowanie a potem ustawi flag , albo rozbi
> na 2 cz ci - najpierw kopiowanie a potem obliczenia.
Po kilku godzinach szukania po necie i dzieki Twoim wskazowka
domyslilem sie o co chodzi - dziekuje. Co ciekawe, wersja
programu z kopiowaniem dziala 300 razy wolniej, bym musial
uzyc 300 procesorow zeby byl widoczny zysk :)
Zrobilem dwie kopie tego samego algorytmu, blisko korzenia
drzewa dziala z OpenMP ( z powolny kopiowanem struktur), blisko
lisci bez OpenMP. Skaluje się prawie liniowo, ale dwie
kopie tej samej procedury nie maja nic wspolnego z tym
jak OpenMP jest reklamowane: "Równoległość inkrementacyjna:
można pracować na jednej porcji programu w jednym
czasie, nie są potrzebne drastyczne zmiany kodu".
Spodziewalem sie w zwiazku z powyzszym, ze OpenMP
samo zrobi dwie kopie algorytmu i jesli jest brak wolnych
procesorow, to szybkim if-em (bez kopiowania struktur)
wybierze kopie szeregowa a nie rownolegla.
Pozdrawiam