-
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