eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingbezkolizyjne paralelizowanie wioskiRe: bezkolizyjne paralelizowanie wioski
  • Path: news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
    From: " " <f...@N...gazeta.pl>
    Newsgroups: pl.comp.programming
    Subject: Re: bezkolizyjne paralelizowanie wioski
    Date: Fri, 30 Dec 2011 19:09:25 +0000 (UTC)
    Organization: "Portal Gazeta.pl -> http://www.gazeta.pl"
    Lines: 114
    Message-ID: <jdl295$f7v$1@inews.gazeta.pl>
    References: <jdka2s$1mo$1@inews.gazeta.pl> <jdktnt$1vc$1@inews.gazeta.pl>
    NNTP-Posting-Host: localhost
    Content-Type: text/plain; charset=ISO-8859-2
    Content-Transfer-Encoding: 8bit
    X-Trace: inews.gazeta.pl 1325272165 15615 172.20.26.236 (30 Dec 2011 19:09:25 GMT)
    X-Complaints-To: u...@a...pl
    NNTP-Posting-Date: Fri, 30 Dec 2011 19:09:25 +0000 (UTC)
    X-User: fir
    X-Forwarded-For: 31.61.128.254
    X-Remote-IP: localhost
    Xref: news-archive.icm.edu.pl pl.comp.programming:194564
    [ ukryj nagłówki ]

    <f...@N...gazeta.pl> napisał(a):

    > >
    > > jak ktos z grupowiczow zabieralby sie do parelelizowania
    > > wioski?
    > >
    >
    > czyli zeby jeszcze podsumowac dla konkretnego przypadku
    >
    > - powiedzmy ze mam mape tysiac pol na tysiac i 50 tys
    > postaci na mapie
    > - 4 albo 6 rdzeniowy procek
    >
    > dzielenie lagranzowskiej petli 50tys malych move'ow
    > np na 6 rownloeglych niesynchronizzowanych kawalkow
    > powodowac bedzie losowo wypadki
    >
    > sposoby kolizyjne (z lockami)
    >
    > -mozna lokowac cala mape ale to raczej zupelnie do niczego,
    > -mozna lokowac mape w drobniejszej skali np na poziomie
    > pojedynczych pol mapy - jest to jeden ze sposobow ale nie
    > umiem ocenic jego praktycznych plusow czy minusow - mozna
    > tylko byc pewnym ze tych lokow byloby od cholery (chyba co
    > najmniej 50tys na ramke) tak ze nie wiem jak by to dzialalo
    >
    > sposob bezkolizyjny:
    >
    > dzielimy mape np na 6 poziomych pasow odleglych od siebie
    > o kilka pol np (y: 0-150, 160-310, 320-470, itd)
    >
    > olewamy lagrangea i iterujemy eulerowsko w 6ciu watkach
    > po tych pasach rownolegle, - jest zrownoleglenie, -
    > wyszukojemy postaci na mapiei wywolujemy im update;
    > czekamy az pasy sie wykonaja po czym w drugim przebiegu
    > wykonujemy piec paskow dzielacych tamte duze pasy
    >
    > wada:
    > jest 200 kilo/na watek prostych ale stratnych iteracji
    > po mapie w poszukiwaniu postaci (200 kilo takich prostych
    > iteracji to jednak raczej nie powinno mam nadziej dobic
    > kosztu milisekundy)
    >
    > zaleta:
    > jest bezkolizyjne bez lockow i waitow - raczej by sie chyba
    > oplacalo - no ale dokladnie trudno powiedziec, trzebaby zbadac,
    > ew zastanowic sie czy nie ma jeszcze jakiegos innego pomyslu)
    > - im wiecej rdzeni tym raczej bardziej by sie oplacalo
    >

    choc dla kilku rdzeni to moze i lepiej lagrangem (z grubsza
    eulerem lepiej gdy rozmiar tablicy postaci << rozmiar bloku na
    mapie, tutaj jest 50k vs ok 200k czyli wychodzi jakby z grubsza
    to samo

    czyli w sumie mz paralelizacja tego

    update_boty_by_one_thrad()
    {
    for(int i=0; i<postac_max;i++)
    postac[i].update();

    }

    wygladalaby jakos tak (lagrange):


    update_part(int map_y_begin, int map_y_end)
    {
    for(int i=0; i<postac_max;i++)
    if(postac[i].y>=map_y_begin &&
    postac[i].y<map_y_end &&
    !postac[i].done) // flaga potrzebna dla tych co z
    szerokiego pasa przeszly do waskiego i tam juz nie powinny sie ruszac jako
    przerobione
    {
    postac[i].update();
    postac[i].done = true;
    }
    }


    update_boty_mt()
    {
    int threads = get_optimal_no_of_threads_for_mt();

    // obliczanie szerokosci 'pasow' podzialu mapy

    int caly = map_y/threads;
    int waski = 5;
    int szeroki = caly - waski;


    for(int i=0; i<threads;i++)
    new thread update_part(i*caly, i*caly+szeroki);

    wait threads;

    for(int i=0; i<threads;i++)
    new thread update_part(i*caly+szeroki, (i+1)*caly);

    wait threads;

    }

    kod nie taki za przyjemny, (mam nadzieje ze to by dzialalo
    bo moze sa jednak jakies bugi w kodzie czy rozumowaniu)
    ale rozwazanie jakie za tym stoi mz w miare przydatne




    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: