🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
16 messages
16 total messages Started by minięty czas Fri, 08 Jan 2010 13:48
‘lock–free’ aka odżywianie grupy asemblerowców :-)
#2046
Author: minięty czas
Date: Fri, 08 Jan 2010 13:48
10 lines
1477 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<=dataDPL CPL==/>=codeDPL:conform'/nc';max=CPL! AV0ID bHp
    _x/ ,     CPL<=TSS,gateDPL CPL>=/==dest_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 :-)
#2047
Author: Bogdan (bogdro)
Date: Fri, 08 Jan 2010 17:10
17 lines
1869 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 :-)
#2048
Author: minięty czas
Date: Fri, 08 Jan 2010 17:58
18 lines
2225 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 :-)
#2049
Author: Michoo
Date: Sun, 10 Jan 2010 22:30
59 lines
3661 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 :-)
#2050
Author: minięty czas
Date: Mon, 11 Jan 2010 10:16
83 lines
5304 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 :-)
#2051
Author: Michoo
Date: Mon, 11 Jan 2010 12:10
59 lines
4002 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 :-)
#2052
Author: minięty czas
Date: Tue, 12 Jan 2010 02:18
71 lines
4829 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<=dataDPL CPL==/>=codeDPL:conform'/nc';max=CPL! AV0ID bHp
    _x/ ,     CPL<=TSS,gateDPL CPL>=/==dest_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 :-)
#2055
Author: minięty czas
Date: Tue, 12 Jan 2010 02:53
19 lines
2332 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<=dataDPL CPL==/>=codeDPL:conform'/nc';max=CPL! AV0ID bHp
    _x/ ,     CPL<=TSS,gateDPL CPL>=/==dest_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 :-)
#2053
Author: Michoo
Date: Tue, 12 Jan 2010 11:54
41 lines
2905 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 :-)
#2054
Author: Marek Borowski
Date: Wed, 13 Jan 2010 13:16
20 lines
2068 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 :-)
#2056
Author: Andrzej Grażyński
Date: Mon, 15 Mar 2010 18:54
20 lines
2085 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 :-)
#2061
Author: Andrzej Grażyński
Date: Tue, 16 Mar 2010 10:22
11 lines
1610 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 :-)
#2057
Author: minięty czas
Date: Thu, 18 Mar 2010 14:30
29 lines
2713 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 :-)
#2058
Author: Andrzej Grażyński
Date: Fri, 19 Mar 2010 09:26
112 lines
3229 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 :-)
#2059
Author: minięty czas
Date: Sat, 20 Mar 2010 13:06
25 lines
2298 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 :-)
#2060
Author: Andrzej Grażyński
Date: Sat, 20 Mar 2010 16:33
47 lines
3962 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