czasy wyników w Mosix

0

Witam,
mam problem i mam nadzieję, że ktoś mi pomoże albo chociaż wskaże miejsce, w którym mogę szukać dalej pomocy. Otóż za kilka dni mam kolokwium i jednym z zadań jakie mnie będzie czekało, będzie zadanie o następującej treści:

Program o nastepujacej tresci:

	fork();
	fork();
	fork();
	for (c=0, dx=M_PI/1000000, x=0; x<M_PI; x+=dx)
		c+= cos(x) * dx + sin(x+M_PI/2)*dx
	//wydruk c z nowa linia

uruchomiono w klastrze skladajacym sie z 5 komputerow o mocy 1MFlopa kazdy.
Zakladamy, ze decyzja o przeniesieniu zadania zapada natychmiast,
czas przenoszenia jest pomijalnie krotki, a zmienne sa typu float.
Podac czas, po ktorym uzyskamy pierwszy i ostatni z wynikow.
Jakie beda wartosci zmiennej c?

Czy ktoś wie jak to się liczy? Nie chodzi mi tu o gotowy wynik ale sposób w jaki mogę dojść do wyniku.
Bardzo proszę o pomoc.

0

Bedziemy mieli 8 zadan ( 1 fork ->2; 2 fork -> 4; 3 fork-> 8)
przy zalozeniu ze:

  • wszystkie sinusy, cosinusy, += itp. to jedna operacja
    zmiennoprzecinkowa (bo nie wiem jak to przyjac),
  • przypisanie to tez operacja zmiennoprzecinkowa
    mamy w petli 10 operacji zmiennoprzecinkowych - co w sumie daje 10
    milionow operacji, bo petla sie wykona milion razy (pomijamy przypisania
    poczatkowe bo nie maja znaczenia dla obliczen)
    Bedziemy mieli 8 takich zadan na 5 kompach - poczatkowo na 4 kompach po
    jednym zadaniu (po 100% mocy), na ostatnim 4 zadania (po 25 %mocy)
    4 pierwsze wyniki dostaniemy po 10 sekundach (10 milionow operacji - po
    milion na sekunde) - pozostale zadania beda skonczone w 25%
    w tej chwili z ostatniego kompa 3 zadania sie przeniosa na inne kompy i
    wszystkie beda mialy po 100% mocy przydzielone i skoncza liczyc po 7,5
    sekundach
    tutaj wykres tego (mam nadzieje ze bedzie cos widac)
    proces procent zaawansowania

1 10 20 30 40 100%
2 10 20 30 40 100%
3 10 20 30 40 100%
4 10 20 30 40 100%
5 2,5 5 7,5 10 25 35 45 100
6 2,5 5 7,5 10 25 35 45 100
7 2,5 5 7,5 10 25 35 45 100
8 2,5 5 7,5 10 25 35 45 100

czas:1s 2s 3s 4s 10s 11s 12s 17,5s

wiec odpowiedz jest taka ze pierwszy wynik dostaniemy po 10 sekundach, a
ostatni po 17,5 sekundach
c=0

0

psotniki [rotfl]

0

Dzięki mad.luk za odpowiedź :) to z czasami zrozumiałam. Ale możesz mi jeszcze napisać jak liczyłeś te operacje zmiennoprzecinkowe, że wyszło Ci że w pętli jest ich 10 ?
I dlaczego na końcu c=0 ?

0

Czemu majne posten zostal ukryty? Wyszlo zero (a dokladniej 8 * wypisane zero bo to suma calek oznaczona danych funkcji, a w ogole to mozesz sobie sprawdzic sama). Co do rozdzielania zadan, to istnieje teroia, ze mosix jest genailny i rodziela zadania rownomiernie, czyli nie pozwala jednemu wezlowi na wykonywanie kilku zadan jak na innych wezlach wykonuje sie tylko jedno. Upraszcza to zadanie, a dla takich samych kompow daje takie same wyniki. Ale jak jest napisane to tylko teoria, jak ktos wie na 100% jak to dziala to niech napisze.

//mad.luk - pasowalo by napisac, ze nie Ty jestes autorem tego rozwiazania, a jedynie je skopiowales

//bo uznałem, że nic nie wnosi i znalazł się tu nie wiedzieć czemu - M
// ja raczej nie pisze nie wiedzac czemu ;-)
//wydaje mi się, że tylko Ty rozumiesz znaczenie tego posta ;) ale go odkryłem :P - M

0

sorki. Myśle, że autor tego rozwiązanie nie obraził sie

// wcześniejszy post foflika był zrozumiały tylko dla studentów informatyki w gliwicach :)

0

Ale ja jestem studentem informatyki w Gliwicach...

0

1 X<M

2 c+=
3 Cos(x)
4 *
_ dx
5 +
6 sin
_ x
7 +
_ M_PI
8 /
_ 2
9 *
_ dx

10 x+=dx

0

Fofliku:
Całka oznaczona, to nie to samo, co jej przybliżenie prostokątami. To po pierwsze.
Pętla nie koniecznie obróci się milion razy.
Ponieważ Pi jest liczbą niewymierną, stąd dx różni się od Pi/1e6, to po drugie.
A po trzecie. Dokładnie liczymy tylko wtedy, gdy wartość ?dx? da się przedstawić dokładnie w układzie dwójkowym, na tylu bitach ile daje nam typ zmiennoprzecinkowy. Np. 1/10 jest w układzie dwójkowym liczbą okresową. Błąd będzie się kumulował. W ostatniej iteracji wartość X może istotnie odbiegać wartości oczekiwanej.
Precyzyjniejszy wynik otrzymamy licząc x=i*pi/1e6 (zamiast x+=dx).
A po czwarte, w zmiennej C sumujemy różnice dwu liczb, o porównywalnej wartości bezwzględnej. Różnica ta jest porównywalna z dokładnością obliczeń. Czyli tylko kilka jej pierwszych cyfr (różnych od zera) jest dokładnych.
Uzyskane wyniki bardzo silnie zależą od typu użytych zmiennych. Gdy 1/N jest porównywalne z dokładnością obliczeń, liczba iteracji może bardzo grubo odbiegać od oczekiwanego N.

Joanna W. pisze o sobie: ?...jestem studentem informatyki...? ciekawe :-)

0
Dr.Czepialski napisał(a)

Joanna W. pisze o sobie: ?...jestem studentem informatyki...? ciekawe :-)

To miała być odpowiedź do wyższego postu, że zrozumieją to tylko studenci informatyki. No i tak mi się napisało. Dr.Czepialski... ile zatem wynosi C i dlaczego tyle?

0

Droga Joanno.
Dlaczego? Już napisał to Dr.Czepialski. A nie możesz sobie sprawdzić sama? Źródło przecie masz. No ale okażę trochę dobrej woli.
U mnie: (dla single, pośrednie obliczenia są typu double)
Single_____:-0.0252104048 _po 1?008?660 iteracjach
Double
: 0.0000000000230678 po 1?000?001
Long double: 0.0000000000000430 po 1?000?001

1 użytkowników online, w tym zalogowanych: 0, gości: 1