eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › na 4rech procesorach
Ilość wypowiedzi w tym wątku: 13

  • 1. Data: 2011-10-30 09:07:46
    Temat: na 4rech procesorach
    Od: " fir i wróżki" <f...@W...gazeta.pl>

    mam jednordzeniowego kompa i o tyle nie
    kusi mnie specjalnie by w praktyce pisac
    programy wielowatkowo, moze ktos moglby
    napisac przyklad:

    zalozmy ze mam funkcje ktora renderuje
    obraz prostym raytracerem

    renderImage(int x, int y, int width, int height)

    w jednordzeniowym wypadku podaje tu cale okienko:

    renderImage(0,0, CLIENT_X, CLIENT_Y); //client x y to rozmiary obszaru
    roboczego okna

    na 4rech procesorach mozna by zrobic 4
    wywolania

    renderImage4Procki(...)
    {

    renderImage(0, CLIENT_Y*0.0/4, CLIENT_X , CLIENT_Y*1.0/4);
    renderImage(0, CLIENT_Y*1.0/4, CLIENT_X , CLIENT_Y*1.0/4);
    renderImage(0, CLIENT_Y*2.0/4, CLIENT_X , CLIENT_Y*1.0/4);
    renderImage(0, CLIENT_Y*3.0/4, CLIENT_X , CLIENT_Y*1.0/4);
    }

    ale czy ktos ew moze podac ralny kod (najlepiej pod winapi
    ale niekoniecznie moze byc i javie itp) - zwlaszcza chodzi
    o koncowke, jak zakonczyc funkcje dopiero gdy wszystkie watki
    skoncza, i jak zapewnic ze kazdy pojdzie na oddzielnym procesorze
    (ew jak sprawdzic ile procesorow jest do dyspozycji)

    pzdr, fir


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


  • 2. Data: 2011-10-30 18:15:34
    Temat: Re: na 4rech procesorach
    Od: Kicer <...@...c>

    fir i wróżki wrote:

    >
    > ale czy ktos ew moze podac ralny kod (najlepiej pod winapi
    > ale niekoniecznie moze byc i javie itp) - zwlaszcza chodzi
    > o koncowke, jak zakonczyc funkcje dopiero gdy wszystkie watki
    > skoncza, i jak zapewnic ze kazdy pojdzie na oddzielnym procesorze
    > (ew jak sprawdzic ile procesorow jest do dyspozycji)
    >

    może OpenMP?

    --
    Michał Walenciak
    gmail.com kicer86
    http://kicer.sileman.net.pl
    gg: 3729519


  • 3. Data: 2011-10-31 06:53:20
    Temat: Re: na 4rech procesorach
    Od: " " <f...@N...gazeta.pl>

    Kicer <...@...c> napisał(a):

    > fir i wróżki wrote:
    >
    > >
    > > ale czy ktos ew moze podac ralny kod (najlepiej pod winapi
    > > ale niekoniecznie moze byc i javie itp) - zwlaszcza chodzi
    > > o koncowke, jak zakonczyc funkcje dopiero gdy wszystkie watki
    > > skoncza, i jak zapewnic ze kazdy pojdzie na oddzielnym procesorze
    > > (ew jak sprawdzic ile procesorow jest do dyspozycji)
    > >
    >
    > może OpenMP?
    >
    nie OpenMP, chodzi mi jak to zrobic normalnie, to nic trudnego,
    tyle ze jako ze mam jednoprocoserowego kompa zrobienie tego na
    4 watkach nie ma fizycznego sensu i nie chce mi sie tego robic,
    bo i tak nie zobacze czy to ladnie dziala; ew moglby ktos
    to napisac i sprawdzic na jakims swoim 4procesorowym






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


  • 4. Data: 2011-11-01 23:48:43
    Temat: Re: na 4rech procesorach
    Od: "Wiktor S." <wswiktor&poczta,fm@no.spam>

    > na 4rech procesorach mozna by zrobic 4
    > wywolania
    >
    > renderImage4Procki(...)
    > {
    >
    > renderImage(0, CLIENT_Y*0.0/4, CLIENT_X , CLIENT_Y*1.0/4);
    > renderImage(0, CLIENT_Y*1.0/4, CLIENT_X , CLIENT_Y*1.0/4);
    > renderImage(0, CLIENT_Y*2.0/4, CLIENT_X , CLIENT_Y*1.0/4);
    > renderImage(0, CLIENT_Y*3.0/4, CLIENT_X , CLIENT_Y*1.0/4);
    > }

    to pod warunkiem, że renderImage() uruchamia nowy wątek i od razu wychodzi,
    bo jeśli nie, to nic to nie da...

    > jak zakonczyc funkcje dopiero gdy wszystkie watki skoncza,

    w winapi jest WaitForMultibleObjects() - trzeba mu podać tablicę uchwytów do
    poszczególnych wątków.
    można też w pętli for zrobić WaitForSingleObject() dla każdego wątku po
    kolei. niezależnie od tego, w jakiej kolejności wątki będą kończyć pracę,
    cała pętla się zakończy dopiero po wszystkich.
    w różnych innych API funkcja czekająca na zakończenie wątku zwykle nazywa
    się "join".

    > i jak zapewnic ze kazdy pojdzie na oddzielnym procesorze

    tego się nie robi, to zostawiamy systemowi operacyjnemu. bo w tym samym
    czasie może pracować też inny program wielowątkowy, niech więc wątki się
    rozłożą optymalnie względem rzeczywistego obciążenia CPU, a nie tak jak nam
    się wydaje.

    > (ew jak sprawdzic ile procesorow jest do dyspozycji)

    GetSystemInfo() i wartość dwNumberOfProcessors w zwracanej strukturze.


    --
    Azarien


  • 5. Data: 2011-11-02 06:10:37
    Temat: Re: na 4rech procesorach
    Od: "Robert Winkler" <n...@n...org>

    Mam dla ciebie dwie złe wiadomości.

    W Windows próba dostępu do pamięci ekranu
    z więcej niż jednego wątku
    w wiekszosci przypadków kończy się błędem systemowym
    i zamknięciem aplikacji.

    Za każdym razem gdy będziesz chciał zmieniać
    jakieś dane w strukturach współdzielinych pomiędzy funkcjami renderImage
    musisz korzystać z synchronizacji.
    Tylko jeden wątek może zmieniać dane w danym czasie,
    inne wątki, nawet te które chcą tylko je czytać muszą zostać wstrzymane,
    a watek modyfikujący po zakończeniu zmiany
    musi poinformować o tym System
    aby ten przekazać tą informacje procesorom.
    Następuje wówczas synchronizacja zawartości pamięci cache procesorów
    --
    __________
    Pozdrawiam
    Robert Winkler


  • 6. Data: 2011-11-02 07:45:39
    Temat: Re: na 4rech procesorach
    Od: " " <f...@N...gazeta.pl>

    Robert Winkler <n...@n...org> napisał(a):

    > Mam dla ciebie dwie złe wiadomości.
    >
    > W Windows próba dostępu do pamięci ekranu
    > z więcej niż jednego wątku
    > w wiekszosci przypadków kończy się błędem systemowym
    > i zamknięciem aplikacji.
    >
    > Za każdym razem gdy będziesz chciał zmieniać
    > jakieś dane w strukturach współdzielinych pomiędzy funkcjami renderImage
    > musisz korzystać z synchronizacji.
    > Tylko jeden wątek może zmieniać dane w danym czasie,
    > inne wątki, nawet te które chcą tylko je czytać muszą zostać wstrzymane,
    > a watek modyfikujący po zakończeniu zmiany
    > musi poinformować o tym System
    > aby ten przekazać tą informacje procesorom.
    > Następuje wówczas synchronizacja zawartości pamięci cache procesorów

    nie wiem co nazywasz pamiecia ekranu, ale ja renderuje
    do zwyklej tablicy bajtow (konkretnie jest to wskaznik jaki
    zwraca funkcja createDibSection, ale jest to raczej zwykla tablica
    ramu tyle ze zaalokowana wewnetrznie przez winde, pozniej dopiero
    to sie blituje do pamieci video);

    czy takie pisania do zwyklej tablicy (kazdy watek do swojej czesci)
    tez trzeba synchronizowac? byloby to glupie i niedobre



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


  • 7. Data: 2011-11-02 08:12:22
    Temat: Re: na 4rech procesorach
    Od: " " <f...@N...gazeta.pl>

    Wiktor S. <wswiktor&poczta,fm@no.spam> napisał(a):

    > > na 4rech procesorach mozna by zrobic 4
    > > wywolania
    > >
    > > renderImage4Procki(...)
    > > {
    > >
    > > renderImage(0, CLIENT_Y*0.0/4, CLIENT_X , CLIENT_Y*1.0/4);
    > > renderImage(0, CLIENT_Y*1.0/4, CLIENT_X , CLIENT_Y*1.0/4);
    > > renderImage(0, CLIENT_Y*2.0/4, CLIENT_X , CLIENT_Y*1.0/4);
    > > renderImage(0, CLIENT_Y*3.0/4, CLIENT_X , CLIENT_Y*1.0/4);
    > > }
    >
    > to pod warunkiem, że renderImage() uruchamia nowy wątek i od razu wychodzi,
    > bo jeśli nie, to nic to nie da...
    >
    > > jak zakonczyc funkcje dopiero gdy wszystkie watki skoncza,
    >
    > w winapi jest WaitForMultibleObjects() - trzeba mu podać tablicę uchwytów
    do
    > poszczególnych wątków.

    no to by bylo ok - wlasnie o cos takiego chodzi, czyli nic wiecej
    4 razy new_thread() zaqpisac uchwyty w tablicy i odpalic
    waitForMultipleObjects? czy jak mam 4 procesory to lpiej odpalic
    4 watki czy trzy (bo jeden ten glowny juz jest)?


    > można też w pętli for zrobić WaitForSingleObject() dla każdego wątku po
    > kolei. niezależnie od tego, w jakiej kolejności wątki będą kończyć pracę,
    > cała pętla się zakończy dopiero po wszystkich

    a co robi dokladnie to waitForSingleObject bo nie do konca
    zrozumialem ? zatrzymuje nadrzędny watek do momentu az konkretny child
    skonczy?


    > w różnych innych API funkcja czekająca na zakończenie wątku zwykle nazywa
    > się "join".
    >
    > > i jak zapewnic ze kazdy pojdzie na oddzielnym procesorze
    >
    > tego się nie robi, to zostawiamy systemowi operacyjnemu. bo w tym samym
    > czasie może pracować też inny program wielowątkowy, niech więc wątki się
    > rozłożą optymalnie względem rzeczywistego obciążenia CPU, a nie tak jak nam
    > się wydaje.

    wlasnie wczoraj czytalem na stronce agnera foga ze np pewne programy
    (tam bylo glownie wymienione jedno engine szachowe 'rybka' o iloe pamietam
    ale dotyczy to raczej wiekszej ilosci programow) dzialaja wolniej
    jesli uruchomic je w hiperthreadingu, (wolniej niz normalnie), natomiast
    jesli poprzypisywac watki odpowiednio do logicznych procesorow, dzialaja
    szybciej niz normalnie, tj od szczegolow tego przypisania 'z reki'
    zalezy czy program bedzie dzialal szybciej (niz bez HT) czy nawet wolniej;
    ale ze system nie pozwala za bardzo tego robic (nie ma api) i ze sam
    przydziela niedobrze (nawet w najnowszym windows7); i tak wogole to
    agner fog sklania sie do wniosku HT najpewniej jest pomyslem niewartym
    zachodu - za to wychwalil architekture Sandy Bridge





    >
    > > (ew jak sprawdzic ile procesorow jest do dyspozycji)
    >
    > GetSystemInfo() i wartość dwNumberOfProcessors w zwracanej strukturze.
    >
    >


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


  • 8. Data: 2011-11-02 23:51:37
    Temat: Re: na 4rech procesorach
    Od: "Wiktor S." <wswiktor&poczta,fm@no.spam>

    > a co robi dokladnie to waitForSingleObject bo nie do konca
    > zrozumialem ?

    ta funkcja ma wiele znaczeń zależnie od tego, co się jej poda za parametr.
    uchwyt do wątku powoduje czekanie na zakończenie tego wątku.

    > zatrzymuje nadrzędny watek do momentu az konkretny child skonczy?

    zatrzymuje wątek, w którym funkcję wywołano do momentu, aż wątek podany w
    parametrze się zakończy.

    WaitForMultipleObjects działa tak samo, ale pobiera całą tablicę wątków i
    czeka na wszystkie.

    --
    Azarien


  • 9. Data: 2011-11-02 23:53:49
    Temat: Re: na 4rech procesorach
    Od: "Wiktor S." <wswiktor&poczta,fm@no.spam>

    > czy takie pisania do zwyklej tablicy (kazdy watek do swojej czesci)
    > tez trzeba synchronizowac? byloby to glupie i niedobre

    jeśli każdy do osobnego obszaru, oraz jeżeli jeden wątek nie będzie w
    trakcie renderowania odczytywał wyników pracy innego wątku, to
    synchronizacji nie trzeba.


    --
    Azarien


  • 10. Data: 2011-11-03 06:21:17
    Temat: Re: na 4rech procesorach
    Od: "Robert Winkler" <n...@n...org>

    > nie wiem co nazywasz pamiecia ekranu, ale ja renderuje
    > do zwyklej tablicy bajtow (konkretnie jest to wskaznik jaki
    > zwraca funkcja createDibSection, ale jest to raczej zwykla tablica
    > ramu tyle ze zaalokowana wewnetrznie przez winde, pozniej dopiero
    > to sie blituje do pamieci video);

    Nie podajesz źródeł więc skąd mamy wiedzieć
    że robisz to z wykorzystaniem bitmapy utworzonej poza ekranem.
    Załóz project na przykład na github i wrzuć źródła.

    > czy takie pisania do zwyklej tablicy (kazdy watek do swojej czesci)
    > tez trzeba synchronizowac? byloby to glupie i niedobre

    Jesli jestes absolutnie pewiem ze jakiś fragment bitmapy
    nie będzie znajdował się jednocześnie w cache dróch różnych rdzeni
    (procesorów)
    to nie potrzebujesz synchronizacji.
    Nie jest to jednak pewne, cache nie pracuje na poziomie pojedyńczych komórek
    pamięci
    ale kilkunasto bajtowych linii.
    (w niektórych procesorach to nawet 512 bajtów, nie jest to jednak żaden
    procesor rodziny x86)

    btw.
    Skoro renderujesz to do bitmapy stworzonej poza pamięcią ekranu
    to co za problem stworzyć 4 niezależne bitmapy,
    po jednaj dla kazdego wątku.
    Każda z nich zawierała by fragment całości (1/4 wysokości)
    po zakończeniu wszystkich wątków przepisałbyś je BitBlt-em
    do jednej bitmapy, podając odpowiedno parametr Y gdzie ma być ona skpiowana.

    Widziałeś jak wygląda raytracing na maszynie z 80-ma równoległymi wątkami?
    (4 Xeony po 10 rdzeni każdy plus HT żeby podwoić liczbe wątków)
    http://www.youtube.com/watch?v=zbokPe4_-mY
    --
    __________
    Pozdrawiam
    Robert Winkler

strony : [ 1 ] . 2


Szukaj w grupach

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: