Thread View: pl.comp.lang.asm
16 messages
16 total messages
Started by =?iso-8859-2?q?m
Fri, 08 Jan 2010 13:48
‘lock–free’ aka odżywianie grupy asemblerowców :-)
Author: =?iso-8859-2?q?m
Date: Fri, 08 Jan 2010 13:48
Date: Fri, 08 Jan 2010 13:48
11 lines
621 bytes
621 bytes
czy instrukcja âcompare and setâ (oraz wszystkie podobne), to nie jest instrukcja blokujÄ ca? co z tego, że sama w sobie nie blo- kuje, jeÅli i tak oparte na niej algorytmy używajÄ jej jako blokera? algorytmy, które zwÄ siebie mianem âlockâfreeâ⦠to chyba tylko zwykÅa reklama. -- qo |) CPL<ÚtaDPL CPL==/>=codeDPL:conform'/nc';max=CPL! AV0ID bHp _x/ , CPL<=TSS,gateDPL CPL>=/=Þst_DPL:/(jmp&nc') ,RPL!- #GP -o0o | ng __ -- __ -- __ -- __ -- __ -- __ -- __ -- __ -x86-, EV3RY o0o ,__ -- __ -- Current/Requested/DescriptorPrivilegeLevel C/R/DPL , d4y m:#
Re: ‘lock–free’ aka odżywianie grupy asemblerowców :-)
Author: =?iso-8859-2?q?m
Date: Fri, 08 Jan 2010 17:58
Date: Fri, 08 Jan 2010 17:58
19 lines
1270 bytes
1270 bytes
onegdaj ‟Bogdan (bogdro)” rzecze: > W dniu 08.01.2010 14:48, minięty czas pisze: >> czy instrukcja ‘compare and set’ (oraz wszystkie podobne), >> to nie jest instrukcja blokująca? co z tego, że sama w sobie nie >> blo- kuje, jeśli i tak oparte na niej algorytmy używają jej jako >> blokera? algorytmy, które zwą siebie mianem ‘lock—free’… to chyba >> tylko zwykła reklama. > Sam sobie odpowiadasz: "co z tego, że sama w sobie nie blokuje". Ta > instrukcja jest nieblokująca, dlatego należy ją poprzedzić prefiksem > LOCK. Wtedy, oczywiście, staje się blokująca. > Swoją drogą, nie masz na myśli "compare and exchange"? ale nie o to dokładnie. wiadomo, że prefiks “lock” blokuje procesor (czy cokolwiek) ·wewnętrznie·, ale mam na myśli typowe zastosowania tej instrukcji (tak, ‘and exchange’). ta instrukcja w algorytmach ‘lock–free’ występuje zwykle jako warunek pętli, co wydaje się, że działa tak samo jak każdy inny mechanizm blokowania. -- qo |) CPL: cs[0..1] (ss[0..1]) p lvl of curr code! _x/ , RPL: seg_sel[0..1] privilege lvl of seg_sel! | ng __ -- __ -- __ -- __ -- __ -- __ -- __ -x86-, ,__ -- __ -- DPL: 2._word_of_seg_desc[13..14]:`f seg_desc ,
Re: ‘lock–free’ aka odżywianie grupy asemblerowców :-)
Author: "Bogdan (bogdro)
Date: Fri, 08 Jan 2010 18:10
Date: Fri, 08 Jan 2010 18:10
18 lines
910 bytes
910 bytes
W dniu 08.01.2010 14:48, minięty czas pisze: > czy instrukcja ‘compare and set’ (oraz wszystkie podobne), > to nie jest instrukcja blokująca? co z tego, że sama w sobie nie blo- > kuje, jeśli i tak oparte na niej algorytmy używają jej jako blokera? > algorytmy, które zwą siebie mianem ‘lock—free’… to chyba tylko zwykła > reklama. Sam sobie odpowiadasz: "co z tego, że sama w sobie nie blokuje". Ta instrukcja jest nieblokująca, dlatego należy ją poprzedzić prefiksem LOCK. Wtedy, oczywiście, staje się blokująca. Swoją drogą, nie masz na myśli "compare and exchange"? -- Pozdrawiam/Regards - Bogdan (GNU/Linux & FreeDOS) Kurs asemblera x86 (DOS, GNU/Linux):http://rudy.mif.pg.gda.pl/~bogdro Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32 www.JabberPL.org www.torproject.org Soft (EN): miniurl.pl/bogdro-soft
Re: ‘lock–free’ aka odżywianie grupy asemblerowców :-)
Author: Michoo
Date: Sun, 10 Jan 2010 23:30
Date: Sun, 10 Jan 2010 23:30
60 lines
2666 bytes
2666 bytes
minięty czas pisze: > onegdaj ‟Bogdan (bogdro)” rzecze: >> W dniu 08.01.2010 14:48, minięty czas pisze: >>> czy instrukcja ‘compare and set’ (oraz wszystkie podobne), >>> to nie jest instrukcja blokująca? co z tego, że sama w sobie nie >>> blo- kuje, jeśli i tak oparte na niej algorytmy używają jej jako >>> blokera? algorytmy, które zwą siebie mianem ‘lock—free’… to chyba >>> tylko zwykła reklama. >> Sam sobie odpowiadasz: "co z tego, że sama w sobie nie blokuje". Ta >> instrukcja jest nieblokująca, dlatego należy ją poprzedzić prefiksem >> LOCK. Wtedy, oczywiście, staje się blokująca. >> Swoją drogą, nie masz na myśli "compare and exchange"? > ale nie o to dokładnie. > wiadomo, że prefiks “lock” blokuje procesor (czy cokolwiek) ·wewnętrznie·, ale mam na myśli typowe zastosowania tej instrukcji (tak, ‘and exchange’). ta instrukcja w algorytmach ‘lock–free’ występuje zwykle jako warunek pętli, co wydaje się, że działa tak samo jak każdy inny mechanizm blokowania. Typowe przykłady zastosowania ssą ;) (Tzn zazwyczaj robi się na tym taki mutex z aktywnym oczekiwaniem.) Rozważmy kolejkę fifo służącą do przekazywania komunikatów między n producentami a k konsumentami: standardowo) blokujesz dostęp do kolejki wstawiasz element odblokowujesz dostęp blokowanie jak sama nazwa wskazuje uniemożliwia innym równoległy dostęp, jeżeli zderzą się 4 procesy to 1 wejdzie do sekcji krytycznej a reszta pójdzie spać (co jest drogie - zmiana kontekstu) w podejściu lock-free) próbujesz wstawić coś do kolejki jeżeli próba się nie powiodła to ją ponawiasz cały czas nie blokujesz nikomu dostępu - jeżeli zderzą się 4 procesy to 1 zakończy akcję z sukcesem a reszta ponowi próbę w następnym cyklu a dzięki prefiksowi lock za każdym razem jednemu się powiedzie. O ile dobrze pamiętam to jest to działające wstawianie do listy jednokierunkowej: extern "C" int enqueue(void *item,void *queue)__attribute__((fastcall)); section .text global enqueue ;edx - wskażnik na wskaźnik na kolejkę, ecx - wskaźnik na wstawiany element enqueue: mov eax,[edx] ;[**]ładujemy adres aktualnego ogona pre: mov [ecx],eax ;[*]ustawiamy go jako poprzednika we wstawianym elemencie lock cmpxchg [edx],ecx ;staramy się podmienić wskaźnik na ogon listy jne pre ;jak się nie powiodło to ponawiamy próbę ret koszt całości jest niewielki, mimo, że lock zaburza trochę przetwarzanie strumieniowe (blokada magistrali) -- Pozdrawiam Michoo
Re: ‘lock–free’ aka odżywianie grupy asemblerowców :-)
Author: =?iso-8859-2?q?m
Date: Mon, 11 Jan 2010 10:16
Date: Mon, 11 Jan 2010 10:16
84 lines
4333 bytes
4333 bytes
onegdaj ‟Michoo” rzecze: > minięty czas pisze: >> onegdaj ‟Bogdan (bogdro)” rzecze: >>>> czy instrukcja ‘compare and set’ (oraz wszystkie podobne), >>>> to nie jest instrukcja blokująca? co z tego, że sama w sobie nie >>>> blo- kuje, jeśli i tak oparte na niej algorytmy używają jej jako >>>> blokera? algorytmy, które zwą siebie mianem ‘lock—free’… to chyba >>>> tylko zwykła reklama. >>> Sam sobie odpowiadasz: "co z tego, że sama w sobie nie blokuje". Ta >>> instrukcja jest nieblokująca, dlatego należy ją poprzedzić prefiksem >>> LOCK. Wtedy, oczywiście, staje się blokująca. >>> Swoją drogą, nie masz na myśli "compare and exchange"? >> ale nie o to dokładnie. >> wiadomo, że prefiks “lock” blokuje procesor (czy cokolwiek) >> ·wewnętrznie·, ale mam na myśli typowe zastosowania tej instrukcji >> (tak, ‘and exchange’). ta instrukcja w algorytmach ‘lock–free’ >> występuje zwykle jako warunek pętli, co wydaje się, że działa tak samo >> jak każdy inny mechanizm blokowania. > Typowe przykłady zastosowania ssą ;) (Tzn zazwyczaj robi się na tym taki > mutex z aktywnym oczekiwaniem.) > > Rozważmy kolejkę fifo służącą do przekazywania komunikatów między n > producentami a k konsumentami: > standardowo) > blokujesz dostęp do kolejki > wstawiasz element > odblokowujesz dostęp > > blokowanie jak sama nazwa wskazuje uniemożliwia innym równoległy dostęp, > jeżeli zderzą się 4 procesy to 1 wejdzie do sekcji krytycznej a reszta > pójdzie spać (co jest drogie - zmiana kontekstu) > > w podejściu lock-free) > próbujesz wstawić coś do kolejki > jeżeli próba się nie powiodła to ją ponawiasz > > cały czas nie blokujesz nikomu dostępu - jeżeli zderzą się 4 procesy to > 1 zakończy akcję z sukcesem a reszta ponowi próbę w następnym cyklu a > dzięki prefiksowi lock za każdym razem jednemu się powiedzie. > > O ile dobrze pamiętam to jest to działające wstawianie do listy > jednokierunkowej: > > extern "C" int enqueue(void *item,void *queue)__attribute__((fastcall)); > > section .text > global enqueue > ;edx - wskażnik na wskaźnik na kolejkę, ecx - wskaźnik na wstawiany > element enqueue: wskaźnik na adres pierwszego elementu kolejki. ;-) > mov eax,[edx] ;[**]ładujemy adres aktualnego ogona > pre: mov [ecx],eax ;[*]ustawiamy go jako poprzednika we > wstawianym elemencie > lock cmpxchg [edx],ecx ;staramy się podmienić wskaźnik na ogon > listy > jne pre ;jak się nie powiodło to ponawiamy > próbę ret > > koszt całości jest niewielki, mimo, że lock zaburza trochę przetwarzanie > strumieniowe (blokada magistrali) raczej nie ma gwarancji, że jednemu wątkowi się powiedzie w pier- wszym podejściu, chyba że w doborze instrukcji i ich ułożeniu uwzględnić docelową architekturę, by wydawało się, że dzięki jednoczesnemu przetwa- rzaniu kilku instrukcji przetworzy je w jednym cyklu. to co powyżej to jest właśnie blokada dostępu (czyli tzw. ‘lock’), ale przeniesiona na poziom instrukcji procesora architektury ‘cisc’, co nie oznacza, że automatycznie zawsze i w każdym przypadku ta- ka instrukcja jest wykonywana bez dodatkowych kosztów, niewidocznych dla programu. więc wydaje się, że odpowiedniejszą nazwą dla tego typu algorytmów byłaby ‘mutex—free’, czyli pozbycie się blokowania uniwersal- nego na rzecz blokowania wewnątrzprocesorowego. jakby zmierzanie do rozwiązań typu ‘clean box’, ale w rzeczywistości to jest zwykłe ‘black box’… ;-) a o co mi tak naprawdę chodzi? :-) tego można się dowiedzieć, zas- tanawiając się, kiedy ·nie· można zastosować instrukcji typu ‘compare and set’ i dlaczego —ale nie dlatego, że przenosi zbyt mało danych. i jak by wyglądał taki algorytm na procesor ‘risc’…? „―it's very suspicious… ―he's a garbage boy. get relax.” -- / qo |) :@=N%_g=v=a=g_eD_e=c()=d=8! =%!gN@8'Re. w8in/ad \ _x/ , ;h-%-a'hA'H4,X0'Xo~xo~xO,R`-%EXp01ITed: *-7/+eh / | ng `-%__%--'__%--'__%--~__%--^%B`/$qV3r[o; &GooMee L_._o_O_*_^_"_'_`_ -> http://thereis.notlong.com <- `L"EnOF"
Re: ‘lock–free’ aka odżywianie grupy asemblerowców :-)
Author: Michoo
Date: Mon, 11 Jan 2010 13:10
Date: Mon, 11 Jan 2010 13:10
60 lines
2948 bytes
2948 bytes
minięty czas pisze: > onegdaj ‟Michoo” rzecze: >> koszt całości jest niewielki, mimo, że lock zaburza trochę przetwarzanie >> strumieniowe (blokada magistrali) > raczej nie ma gwarancji, że jednemu wątkowi się powiedzie w pier- > wszym podejściu, chyba że w doborze instrukcji i ich ułożeniu uwzględnić > docelową architekturę, by wydawało się, że dzięki jednoczesnemu przetwa- > rzaniu kilku instrukcji przetworzy je w jednym cyklu. Przeczytaj dokumentację intela, ok? cmpxchg składa się z szeregu operacji mikrokodu oraz 2 dostępów do magistrali (wykonywanie tej instrukcji na rejestrach ma mało sensu). Faza 1: pobrania wartości z pod adresu i wykonanie porównania. Faza 2: zapisanie wyniku pod adres w pamięci LUB do rejestru. Ponieważ w 2 fazie nie zawsze jest zapis do pamięci pomiędzy nimi magistrala jest zwalniana - przy dużym, równoległym ruchu na procesorze 2 rdzeniowym wszystko się sypie w ułamku sekundy. Dodanie prefiksu lock powoduje zablokowanie dostępu do magistrali i danych w pamięci cache (cache coherency) na czas całej instrukcji. Czyli po prostu zapewnia ATOMOWE WYKONANIE instrukcji. Skoro atomowe, to ten kto pierwszy ją zaczął ten zatrzymał pipeline wszystkich innych na czas 2 dostępów do pamięci i wymusił u nich odświeżenie cache - jego nikt nie zatrzyma. > to co powyżej to jest właśnie blokada dostępu (czyli tzw. > ‘lock’), ale przeniesiona na poziom instrukcji procesora architektury > ‘cisc’, co nie oznacza, że automatycznie zawsze i w każdym przypadku ta- > ka instrukcja jest wykonywana bez dodatkowych kosztów, niewidocznych > dla programu. Napisałem, że koszta są - niewielkie. > więc wydaje się, że odpowiedniejszą nazwą dla tego typu > algorytmów byłaby ‘mutex—free’, czyli pozbycie się blokowania uniwersal- > nego na rzecz blokowania wewnątrzprocesorowego. jakby zmierzanie > do rozwiązań typu ‘clean box’, ale w rzeczywistości to jest zwykłe > ‘black box’… ;-) Jakbyś się dokształcił w kwestii tego jak działa arbitraż na magistrali, jak działa cache coherency protocol, jak wygląda zazwyczaj cykl rozkazowy, jak działa pipeline to byś doszedł do wniosku, że: a) wszystkie instrukcje są blokujące, bo w ich obrębie jest blokowana np. magistrala lub b) dodanie prefiksu lock sprawia, że jeden opcode jest tłumaczony na jedną instrukcję, a nie kilka. Potem moglibyśmy kontynuować dyskusję na temat zastosowań? > i jak by wyglądał taki algorytm na procesor ‘risc’…? Poczytaj specyfikację choćby arm7 (LDM). Tam jest zazwyczaj łatwiej, bo nie ma systemów wielordzeniowych i wystarcza zablokowanie przerwań do czasu ukończenia instrukcji. Jeżeli jest wiele procesorów/rdzeni/(dma) to już wchodzi jakiś arbitraż na magistrali i trzeba blokować równoległy do niej dostęp. -- Pozdrawiam Michoo
Re: ‘lock–free’ aka odżywianie grupy asemblerowców :-)
Author: =?iso-8859-2?q?m
Date: Tue, 12 Jan 2010 02:18
Date: Tue, 12 Jan 2010 02:18
72 lines
3806 bytes
3806 bytes
onegdaj âMichooâ rzecze: > miniÄty czas pisze: >> onegdaj âMichooâ rzecze: >>> koszt caÅoÅci jest niewielki, mimo, że lock zaburza trochÄ >>> przetwarzanie strumieniowe (blokada magistrali) >> raczej nie ma gwarancji, że jednemu wÄ tkowi siÄ powiedzie w >> pier- >> wszym podejÅciu, chyba że w doborze instrukcji i ich uÅożeniu >> uwzglÄdniÄ docelowÄ architekturÄ, by wydawaÅo siÄ, że dziÄki >> jednoczesnemu przetwa- rzaniu kilku instrukcji przetworzy je w jednym >> cyklu. > Przeczytaj dokumentacjÄ intela, ok? > > cmpxchg skÅada siÄ z szeregu operacji mikrokodu oraz 2 dostÄpów do > magistrali (wykonywanie tej instrukcji na rejestrach ma maÅo sensu). > Faza 1: pobrania wartoÅci z pod adresu i wykonanie porównania. Faza 2: > zapisanie wyniku pod adres w pamiÄci LUB do rejestru. > > Ponieważ w 2 fazie nie zawsze jest zapis do pamiÄci pomiÄdzy nimi > magistrala jest zwalniana - przy dużym, równolegÅym ruchu na procesorze > 2 rdzeniowym wszystko siÄ sypie w uÅamku sekundy. Dodanie prefiksu lock > powoduje zablokowanie dostÄpu do magistrali i danych w pamiÄci cache > (cache coherency) na czas caÅej instrukcji. Czyli po prostu zapewnia > ATOMOWE WYKONANIE instrukcji. > > Skoro atomowe, to ten kto pierwszy jÄ zaczÄ Å ten zatrzymaÅ pipeline > wszystkich innych na czas 2 dostÄpów do pamiÄci i wymusiÅ u nich > odÅwieżenie cache - jego nikt nie zatrzyma. > >> to co powyżej to jest wÅaÅnie blokada dostÄpu (czyli tzw. >> âlockâ), ale przeniesiona na poziom instrukcji procesora >> architektury âciscâ, co nie oznacza, że automatycznie zawsze i w każdym >> przypadku ta- ka instrukcja jest wykonywana bez dodatkowych >> kosztów, niewidocznych dla programu. > NapisaÅem, że koszta sÄ - niewielkie. > >> wiÄc wydaje siÄ, że odpowiedniejszÄ nazwÄ dla tego typu algorytmów >> byÅaby âmutexâfreeâ, czyli pozbycie siÄ blokowania uniwersal- nego na >> rzecz blokowania wewnÄ trzprocesorowego. jakby zmierzanie do >> rozwiÄ zaÅ typu âclean boxâ, ale w rzeczywistoÅci to jest zwykÅe >> âblack boxââ¦â;-) > JakbyÅ siÄ doksztaÅciÅ w kwestii tego jak dziaÅa arbitraż na magistrali, > jak dziaÅa cache coherency protocol, jak wyglÄ da zazwyczaj cykl > rozkazowy, jak dziaÅa pipeline to byÅ doszedÅ do wniosku, że: a) > wszystkie instrukcje sÄ blokujÄ ce, bo w ich obrÄbie jest blokowana np. > magistrala > lub > b) dodanie prefiksu lock sprawia, że jeden opcode jest tÅumaczony na > jednÄ instrukcjÄ, a nie kilka. > > Potem moglibyÅmy kontynuowaÄ dyskusjÄ na temat zastosowaÅ? > >> i jak by wyglÄ daÅ taki algorytm na procesor âriscââ¦? > Poczytaj specyfikacjÄ choÄby arm7 (LDM). Tam jest zazwyczaj Åatwiej, bo > nie ma systemów wielordzeniowych i wystarcza zablokowanie przerwaÅ do > czasu ukoÅczenia instrukcji. Jeżeli jest wiele procesorów/rdzeni/(dma) > to już wchodzi jakiÅ arbitraż na magistrali i trzeba blokowaÄ równolegÅy > do niej dostÄp. jesteÅ zwykÅym trolem, który przepisuje przepisane wiadomoÅci i do- ÅÄ cza tylko tekst âczytaj to!â (âREADME.TXTâ). byÅeÅ już w plonkowni- cy, ale chwilowo to zignorowaÅem, bo odpowiedziaÅeÅ na mój tekst techni- cznie ânigdy wiÄcej.â:-) nie rozumiesz caÅoÅci podanego przez siebie przykÅadu, a pouczanie innych do czytania tego co ty i nie rozumienia w taki sam sposób sobie darujâ¦â:-> heâheâhe⦠PLONK2 -- qo |) CPL<ÚtaDPL CPL==/>=codeDPL:conform'/nc';max=CPL! AV0ID bHp _x/ , CPL<=TSS,gateDPL CPL>=/=Þst_DPL:/(jmp&nc') ,RPL!- #GP -o0o | ng __ -- __ -- __ -- __ -- __ -- __ -- __ -- __ -x86-, EV3RY o0o ,__ -- __ -- Current/Requested/DescriptorPrivilegeLevel C/R/DPL , d4y m:#
Re: ‘lock–free’ aka odżywianie grupy asemblerowców :-)
Author: =?iso-8859-2?q?m
Date: Tue, 12 Jan 2010 02:53
Date: Tue, 12 Jan 2010 02:53
20 lines
1318 bytes
1318 bytes
onegdaj âminiÄty czasâ rzecze: > a o co mi tak naprawdÄ chodzi?â:-) tego można siÄ dowiedzieÄ, zas- > tanawiajÄ c siÄ, kiedy ·nie· można zastosowaÄ instrukcji typu âcompare > and setâ i dlaczego âale nie dlatego, że przenosi zbyt maÅo danych. > i jak by wyglÄ daÅ taki algorytm na procesor âriscââ¦? taka instrukcja w ogólnoÅci robi co nastÄpuje: używa danych globalnych do modyfikacji stanu lokalnego, a nastÄpnie warunkowo modyfikuje danÄ globalnÄ . ze wzglÄdu na koniecznoÅÄ synchronizacji różnych procesorów w Åwiecie rzeczywistymâ ta instrukcja w takiej postaci jak obecnie unie- możliwiaÅaby doÅÄ czanie niezależnych procesorów do architektury. two- rzenie bardzie zaawansowanych algorytmów wymaga powiÄkszania czÄÅci mo- dyfikujÄ cej stan lokalny, co powoduje wykonywanie przez procesory pracu- jÄ ce synchronicznieâ niepotrzebnych instrukcji i uniemożliwia skalowanie mocy obliczeniowej przez Åaczenie procesorów. ⦠-- qo |) CPL<ÚtaDPL CPL==/>=codeDPL:conform'/nc';max=CPL! AV0ID bHp _x/ , CPL<=TSS,gateDPL CPL>=/=Þst_DPL:/(jmp&nc') ,RPL!- #GP -o0o | ng __ -- __ -- __ -- __ -- __ -- __ -- __ -- __ -x86-, EV3RY o0o ,__ -- __ -- Current/Requested/DescriptorPrivilegeLevel C/R/DPL , d4y m:#
Re: ‘lock–free’ aka odżywianie grupy asemblerowców :-)
Author: Michoo
Date: Tue, 12 Jan 2010 12:54
Date: Tue, 12 Jan 2010 12:54
42 lines
1831 bytes
1831 bytes
minięty czas pisze: > onegdaj ‟Michoo” rzecze: >>> i jak by wyglądał taki algorytm na procesor ‘risc’…? >> Poczytaj specyfikację choćby arm7 (LDM). Tam jest zazwyczaj łatwiej, bo >> nie ma systemów wielordzeniowych i wystarcza zablokowanie przerwań do >> czasu ukończenia instrukcji. Jeżeli jest wiele procesorów/rdzeni/(dma) >> to już wchodzi jakiś arbitraż na magistrali i trzeba blokować równoległy >> do niej dostęp. > jesteś zwykłym trolem, który przepisuje przepisane wiadomości i do- > łącza tylko tekst „czytaj to!” (“README.TXT”). Wg. mnie to TY albo się nie znasz, albo (i) trolujesz. Co ma ALGORYTM do procesora risc? Algorytm jest jeden. Za pomocą CAE wstaw do ogona listy nowy element. (chyba) Wszystkie nowe procesory dostarczają odpowiednią instrukcję. Tak więc implementacja się różni właściwie jedynie składnią asma. > byłeś już w plonkowni- > cy, ale chwilowo to zignorowałem, bo odpowiedziałeś na mój tekst techni- > cznie —nigdy więcej. :-) To baaardzo ciekawe, skoro na pl.comp.lang.asm napisałem może z 3 posty? > nie rozumiesz całości podanego przez siebie przykładu, a pouczanie > innych do czytania tego co ty i nie rozumienia w taki sam sposób sobie > daruj… :-> he‐he‐he… Chcesz mnie 'zjechać'? Proszę bardzo, zapraszam, kilku osobom się to do tej pory nawet udało. Jedna prośba - merytorycznie - ODNIEŚ SIĘ DO MOJEGO TEKSTU - pokaż gdzie popełniłem błędy a nie przypieprzaj się personalnie "jesteś trolem". Link do intela - w którym miejscu napisałem coś błędnie o tej instrukcji? http://www.intel.com/software/products/documentation/vlin/mergedprojects/analyzer_ec/mergedprojects/reference_olh/mergedProjects/instructions/instruct32_hh/vc42.htm -- Pozdrawiam Michoo
Re: ‘lock–free’ aka odżywianie grupy asemblerowców :-)
Author: Marek Borowski
Date: Wed, 13 Jan 2010 14:16
Date: Wed, 13 Jan 2010 14:16
21 lines
870 bytes
870 bytes
On 2010-01-12 12:54, Michoo wrote: > minięty czas pisze: >> onegdaj ‟Michoo” rzecze: > >>>> i jak by wyglądał taki algorytm na procesor ‘risc’…? >>> Poczytaj specyfikację choćby arm7 (LDM). Tam jest zazwyczaj łatwiej, bo >>> nie ma systemów wielordzeniowych i wystarcza zablokowanie przerwań do >>> czasu ukończenia instrukcji. Jeżeli jest wiele procesorów/rdzeni/(dma) >>> to już wchodzi jakiś arbitraż na magistrali i trzeba blokować równoległy >>> do niej dostęp. >> jesteś zwykłym trolem, który przepisuje przepisane wiadomości i do- >> łącza tylko tekst „czytaj to!” (“README.TXT”). > Wg. mnie to TY albo się nie znasz, albo (i) trolujesz. Wez zobacz jego inne posty, belkot taki ze nie da sie czytac. Szkoda czasu na dyskusje, wyjasniles temat az za dobrze. Jesli gosciu nie rozmumie to juz jego problem. Pozdr Marek
Re: ‘lock–free’ aka odżywianie grupy asemblerowców :-)
Author: =?UTF-8?B?QW5kcn
Date: Mon, 15 Mar 2010 19:54
Date: Mon, 15 Mar 2010 19:54
21 lines
1145 bytes
1145 bytes
minięty czas pisze: > czy instrukcja ‘compare and set’ (oraz wszystkie podobne), > to nie jest instrukcja blokująca? co z tego, że sama w sobie nie blo- > kuje, jeśli i tak oparte na niej algorytmy używają jej jako blokera? > algorytmy, które zwą siebie mianem ‘lock—free’… to chyba tylko zwykła > reklama. Proponuję autorowi pytania, by zapoznał się z pojęciem ALGORYTMU NIEBLOKUJĄCEGO (i zrozumiał, o jakie "blokowanie" tu chodzi) i paradygmatami CAS, DCAS, CAS2, MCAS, CASN. W Pentium CMPXCHG jest realizacja paradygmatu CAS, zaś CMPXCHG8B - paradygmatu DCAS. W szczególności żeby zrozumiał różnicę między BLOKADĄ SYSTEMOWĄ nakładaną na zasoby, długotrwała i bez gwarancji zwolnienia, a blokadą dostępu do słowa pamięci na czas wykonywania jednej instrukcji. I ogólnie strategią przetwarzania nieblokującego (vide nieblokująca lista wiązana, nieblokująca kolejka, nieblokujący stos itd.) i jej różnicą w stosunku do klasycznego schematu ZABLOKUJ - PRZETWÓRZ - ODBLOKUJ. Proponuję 1. rodział książki "Perełki programowania gier", tom 6. z HELIONa.
Re: ‘lock–free’ aka odżywianie grupy asemblerowców :-)
Author: =?UTF-8?B?QW5kcn
Date: Tue, 16 Mar 2010 11:22
Date: Tue, 16 Mar 2010 11:22
12 lines
651 bytes
651 bytes
minięty czas pisze: > czy instrukcja ‘compare and set’ (oraz wszystkie podobne), > to nie jest instrukcja blokująca? co z tego, że sama w sobie nie blo- > kuje, jeśli i tak oparte na niej algorytmy używają jej jako blokera? > algorytmy, które zwą siebie mianem ‘lock—free’… to chyba tylko zwykła > reklama. Przykładem zastosowania algorytmu nieblokującego był funkcja $58 w DOS. Gdy zdarzyłoby się, że kilka procesów w sieci chciałoby równocześnie utworzyć plik o określonej nazwie (mało prawdopodobne, ale niewykluczone), to tylko jednemu się to uda, wszystkie inne dostaną kod powrotu 80.
Re: ‘lock–free’ aka odżywianie grupy asemblerowców :-)
Author: =?iso-8859-2?q?m
Date: Thu, 18 Mar 2010 14:30
Date: Thu, 18 Mar 2010 14:30
30 lines
1768 bytes
1768 bytes
onegdaj ‟Andrzej Grażyński” rzecze: >> czy instrukcja ‘compare and set’ (oraz wszystkie podobne), >> to nie jest instrukcja blokująca? co z tego, że sama w sobie nie >> blo- kuje, jeśli i tak oparte na niej algorytmy używają jej jako >> blokera? algorytmy, które zwą siebie mianem ‘lock—free’… to chyba >> tylko zwykła reklama. > Proponuję autorowi pytania, by zapoznał się z pojęciem ALGORYTMU > NIEBLOKUJĄCEGO (i zrozumiał, o jakie "blokowanie" tu chodzi) i > paradygmatami CAS, DCAS, CAS2, MCAS, CASN. W Pentium CMPXCHG jest > realizacja paradygmatu CAS, zaś CMPXCHG8B - paradygmatu DCAS. W > szczególności żeby zrozumiał różnicę między BLOKADĄ SYSTEMOWĄ nakładaną > na zasoby, długotrwała i bez gwarancji zwolnienia, a blokadą dostępu do > słowa pamięci na czas wykonywania jednej instrukcji. I ogólnie strategią > przetwarzania nieblokującego (vide nieblokująca lista wiązana, > nieblokująca kolejka, nieblokujący stos itd.) i jej różnicą w stosunku > do klasycznego schematu ZABLOKUJ - PRZETWÓRZ - ODBLOKUJ. > > Proponuję 1. rodział książki "Perełki programowania gier", tom 6. z > HELIONa. nie znam tych wszystkich skrócików ;-) , ale nie autor odpowiedzi się trochę wgłębi w list autora pytania… :-) czy czasem te różne paradyg- manty nie przenoszą po prostu tego samego blokowania na inne poziomy wi- doczności i szerokości, bardziej ukryte dla programisty? a to ciągle ta sama instrukcja logiczna. -- qo |) CPL: cs[0..1] (ss[0..1]) p lvl of curr code! _x/ , RPL: seg_sel[0..1] privilege lvl of seg_sel! | ng __ -- __ -- __ -- __ -- __ -- __ -- __ -x86-, ,__ -- __ -- DPL: 2._word_of_seg_desc[13..14]:`f seg_desc ,
Re: ‘lock–free’ aka odżywianie grupy asemblerowców :-)
Author: =?UTF-8?B?QW5kcn
Date: Fri, 19 Mar 2010 10:26
Date: Fri, 19 Mar 2010 10:26
115 lines
2140 bytes
2140 bytes
> nie znam tych wszystkich skrócików ;-) , ale nie autor odpowiedzi się > trochę wgłębi w list autora pytania… :-) czy czasem te różne paradyg- > manty nie przenoszą po prostu tego samego blokowania na inne poziomy wi- > doczności i szerokości, bardziej ukryte dla programisty? a to ciągle > ta sama instrukcja logiczna. Tak, przenoszą, z istotnymi różnicami: 0. Blokada realizowana jest w sposób sprzętowy 1. Nakładanie i zdejmowanie blokady nie jest odrębną częścią algorytmu rozwiązywania zadania, jest elementem atomu wchodzącego w skład tego algorytmu 2. Blokada nakładana jest na czas wykonywania jednej instrukcji 3. Istnieje gwarancja zdjęcia blokady, bo wykonywanie instrukcji musi się zakończyć (jeśli tak nie jest, mamy ogólną awarię sprzętową, co jest katastrofą dla całego systemu). 4. Nie istnieją problemy typowe dla synchronizacji, np. deadlock 5. Nie ma gwarancji uzyskania wyłącznego dostąpu do zasobu, nie ma więc gwarancji wykonania żądanej operacji. Dla wyjaśnienia: CAS - Compare And Swap: CAS(M, A, B) atomowe wykonanie sekwencji if M = A then M := B bądź if M = A then XCHG(M, B) bądź if M = A then M := B else A := M ( tak działa CMPXCHG) ---------- DCAS - double CAS jak wyżej, tylko dotyczy dwóch PRZYLEGŁYCH słów if DWORD(M1, M2) = DWORD(A1, A2) then DWORD(M1, M2) := DWORD(B1, B2) else DWORD(A1, A2) := DWORD(M1, M2) Tak działa CMPXCHG8B ------------ Casn Jak wyżej, tylko dotyczy zbioru N niezależnych o siebie słów: if {M1 .. Mn} = {A1 .. An} then {M1 .. Mn} := {B1 .. Bn} else {A1 .. An} := {M1 .. Mn} W szczególności CAS2 jest szczególnym przypadkiem CASn dla n=2 Zauważ, czym CAS2 różni się od DCAS. Przykład zastosowania: Do wielodostępnej listy jednokierunkowej, której pierwszy element wskazywany jest przez TOP, dołączamy na początek nowy rekord R: R: Record Next: <adres nastepnego rekordu> ... End; A := TOP; B := Addr(R); R.Next := A; CAS(TOP, A, B); { dlaczego nie mogę napisać CAS(TOP, R.Next , Addr(R)) ? )
Re: ‘lock–free’ aka odżywianie grupy asemblerowców :-)
Author: =?iso-8859-2?q?m
Date: Sat, 20 Mar 2010 13:06
Date: Sat, 20 Mar 2010 13:06
26 lines
1281 bytes
1281 bytes
onegdaj ‟Andrzej Grażyński” rzecze: > , przenoszą, z istotnymi różnicami: > 0. Blokada realizowana jest w sposób sprzętowy 1. :-> > 1. Nakładanie i zdejmowanie blokady nie jest odrębną częścią algorytmu > rozwiązywania zadania, jest elementem atomu wchodzącego w skład tego > algorytmu > 2. Blokada nakładana jest na czas wykonywania jednej instrukcji > 3. Istnieje gwarancja zdjęcia blokady, bo wykonywanie instrukcji musi > się zakończyć (jeśli tak nie jest, mamy ogólną awarię sprzętową, co jest > katastrofą dla całego systemu). > 4. Nie istnieją problemy typowe dla synchronizacji, np. deadlock > 5. Nie ma gwarancji uzyskania wyłącznego dostąpu do zasobu, nie ma więc > gwarancji wykonania żądanej operacji. od czasu podania przez ciebie skrótów zatrudniłem ‟Google” za reklamy z ‘vatem’ :-) i wynikło, że te skróciki mówią tylko różnych typach da- nych przenoszonych po fakcie zajcia warunku. teraz sobie pomyśl co się będzie działo dla dowolnie dużej liczby syn- chronicznie pracujących procesorów, gdy wszystkie wykonałyby dowolną z tych instrukcji na tej samej danej w równoległym algorytmie. nadal się skaluje bez kosztów? ;-) -- ―oh yea, i got it! ―oh, stupid! D. Icke
Re: ‘lock–free’ aka odżywianie grupy asemblerowców :-)
Author: =?UTF-8?B?QW5kcn
Date: Sat, 20 Mar 2010 17:33
Date: Sat, 20 Mar 2010 17:33
48 lines
2895 bytes
2895 bytes
minięty czas pisze: > onegdaj ‟Andrzej Grażyński” rzecze: >> , przenoszą, z istotnymi różnicami: >> 0. Blokada realizowana jest w sposób sprzętowy > 1. :-> >> 1. Nakładanie i zdejmowanie blokady nie jest odrębną częścią algorytmu >> rozwiązywania zadania, jest elementem atomu wchodzącego w skład tego >> algorytmu >> 2. Blokada nakładana jest na czas wykonywania jednej instrukcji >> 3. Istnieje gwarancja zdjęcia blokady, bo wykonywanie instrukcji musi >> się zakończyć (jeśli tak nie jest, mamy ogólną awarię sprzętową, co jest >> katastrofą dla całego systemu). >> 4. Nie istnieją problemy typowe dla synchronizacji, np. deadlock >> 5. Nie ma gwarancji uzyskania wyłącznego dostąpu do zasobu, nie ma więc >> gwarancji wykonania żądanej operacji. > od czasu podania przez ciebie skrótów zatrudniłem ‟Google” za reklamy > z ‘vatem’ :-) i wynikło, że te skróciki mówią tylko różnych typach da- > nych przenoszonych po fakcie zajcia warunku. > teraz sobie pomyśl co się będzie działo dla dowolnie dużej liczby syn- > chronicznie pracujących procesorów, gdy wszystkie wykonałyby dowolną > z tych instrukcji na tej samej danej w równoległym algorytmie. nadal > się skaluje bez kosztów? ;-) A co by się działo, gdy każdy z tych procesorów realizował proces bazujący na klasycznych blokadach? Algorytm nieblokujący musi być przygotowany na to, że nie uda mu się wykonanie pewnej operacji operującej na chronionym zasobie. Oczywiście mógłby w pętli próbować aż do skutku, ale to jest jeszcze gorsze niż klasyczne blokady (które wynaleziono właśnie po to, by takich pętli unikać). Jeśli proces nie ma w danej chwili nic lepszego do roboty (a zwykle jednak ma), to może odczekać LOSOWY interwał czasu i spróbować ponownie. Ta LOSOWOŚĆ ma chronić przed tym by np. kilkadziesiąt procesorów w jednej chwili chciało wykonać np. CMPXCHG na tym samym słowie pamięci Jednym z paradygmatów przetwarzania równoległego jest dystans informacyjny, czyli odległość w czasie między ustaleniem JAKĄ OPERACJĘ należy wykonać, a zapotrzebowaniem na WYNIKI tej operacji, na przykład ustalenie klucza wczytywanego rekordu, a zapotrzebowaniem na zawartość tego rekordu. Zapoczątkowujemy asynchroniczne czytanie, a gdy dochodzimy do momentu, gdy zawartość wspomnianego rekordu staje się istotna, upewniamy się, że wczytywanie się zakonczyło albo czekamy na jego zakończenie. Jeżeli rozpatrzymy przypadek nieblokującego dodawania rekordu na szczyt listy, to istnieje dystans czasowy między wyprodukowaniem rekordu a momentem, kiedy MUSI się ów rekord znaleźć w tej liście. W trakcie tego interwalu proces może robić inne pożyteczne rzeczy i okresowo probować dodać rekord do listy. Nie marnuje się czasu na oczekiwanie na blokadzie.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads