Algoritmul estomparea

Ca parte a cursului „Programare distribuită“ pe Coursera întâlnit cu un loc de muncă interesant, care mi-a placut simplitatea și concizia deciziei sale, pe care am decis să împartă.

Deci, sarcina: să pună în aplicare calcule algoritm de estompare trebuie să ruleze în paralel. Sarcina nu este un mod artificial-formare: funcția estompare pot fi găsite acum în fiecare dintre primele aplicații concepute pentru lucrul cu grafica.

culoare RGBA - versiunea clasica de reprezentare a culorilor. Un pixel este reprezentat de patru valori (0 la 255): roșu, verde, albastru - culoarea corespunzătoare, alfa - transparență. Prin urmare, avem nevoie de un tip care să reprezinte pixeli și funcții care ar permite de a extrage fiecare componentă a tipului RGBA. Nu uita despre „pachetul“ a tuturor componentelor într-un singur RGBA valoare.

Ne imaginăm tipul RGBA pixeli, care, la rândul său, este un număr de 32 de biți.

Algoritmul estomparea

În continuare, avem nevoie de punerea în aplicare a imaginii. Imaginea este compusă din pixeli de tip RGBA. Este necesar să se pună în aplicare de navigare în imaginea folosind sistemul de coordonate. De fapt, tot ceea ce avem nevoie - este date despre lățimea și înălțimea imaginii, precum și funcțiile de actualizare și regăsire a unui singur pixel.

Așa că am ajuns la cel mai important - la pătare. Blur va efectua cel mai simplu mod: calculul unei valori medii de canale de culoare de toți pixelii vecine. Gradul de pătare este controlat de valoarea razei. Raza - este numărul de pixeli pe care le „apuca“ pe fiecare parte a pixelului țintă pentru a calcula valorile medii.

Adică, atunci când raza unității se calculează valorile medii de zece pixeli (9 țintă + vecine). La punerea în aplicare a metodei nu trebuie să uităm că nu putem permite ieșirea frontierei de imagine. Începem să pună în aplicare.

Să începem cu o semnătură metodă. Metoda trebuie să ia o imagine, coordonatele punctului care trebuie să fie neclară, iar raza. Returnează un nou tip de pixel RGBA.

Pentru concizie tip cap pentru stocarea coordonatelor pixelilor.

În continuare avem nevoie pentru a calcula coordonatele dreptunghiului în care toți pixelii sunt utilizate pentru a calcula valoarea medie. Pe de o parte a punctului din stânga sus al dreptunghiului este limitat la limitele imaginii, pe de altă parte - punctul de tinta noastra. Punctul inferior din dreapta sunt de asemenea limitate la punctul țintă și prima graniță este apoi, respectiv imagini. Pentru „cutoff“ metoda valorii de punere în aplicare clemă.

Sub rezerva restricțiilor de mai sus acum putem găsi coordonatele dreptunghiului.

Șeful 4 al contorului de stocare a componentelor de culoare, și un contor comun pentru a ști cât de mult, de fapt, ne-am ocolit pixeli.

Sunt foarte puține. Iterarea rândul dreptunghiului calculat prin actualizarea bateriei și un contor.

Algoritmul estomparea

Comasarea, aducând un nou RGBA-pixeli.

Algoritmul estomparea

Acum, un pic de reflecție cu privire la posibilitatea de a paraleliza sarcina.

Calcularea estompare individuale pixel - o sarcină foarte ușoară, astfel încât ideea de a rezolva într-un fir separat poate fi eliminată imediat. Trebuie să bată imaginea sectorului. Dar cât de mult și în ce mod? Prima întrebare se poate răspunde pe baza faptului că, chiar și supercalculator foarte abrupt are un număr infinit de nuclee de procesare. Adică, noi trebuie să pornească de posibilitățile de resurse disponibile. Dacă avem un opt mașini - este corect să se presupună că, în general, problema nu este transportă o deasupra capului mare pe combinarea rezultatelor de calcul al subactivități, în cazul în care calculele sunt făcute în 8 fire, va fi decis mai rapid decât soluția într-un singur fir. Am tras concluzia că este important ca utilizatorul să ofere posibilitatea de a alege numărul de fire, în conformitate cu resursele disponibile. Astfel, avem nevoie pentru a împărți imaginea în N sectoare de aproximativ identice, unde N - numărul de fire de decizie, și apoi paralel pentru a estompa toate aceste sectoare.

Cum de a sparge această imagine? Aceasta depinde de punerea în aplicare a imaginii în sine. Am implementat versiunea cea mai primitivă: matrice unidimensională de pixeli. Astfel, chiar dacă unii pixeli aleatorii vor fi transferate sub-sarcinile această performanță nu este aproape afectată. Vă puteți concentra pe codul concizie. Cel mai naiv și ușor de pus în aplicare opțiunea - o neclaritate în același sub-sarcină un anumit interval de coloane sau rânduri. Mai departe.

Metoda neclaritate ia două imagini (sursă și țintă), raza de neclaritate și gama coloanele (de la și la). Iterarea primele coloane, apoi pixelii individuali, obținute prin actualizarea imaginea țintă pixeli neclare.

Ea a plecat pentru a rula pe sarcina selectată. Am coborât intervale de punere în aplicare pentru subactivități generație, din cauza trivialitate sale. Doar nu va arăta codul care implementează programarea sarcinilor, deoarece aceasta nu se aplică la subiect de astăzi. Pentru fiecare interval de coloană lansează o nouă sarcină (sarcină). Apoi, trebuie doar să așteptați pentru orice calcule.

În această implementare a algoritmului este terminat. Este posibil să experimenteze cu numărul de fluxuri. În acest caz, foarte bine sa arătat hiper-threading de la Intel (fiecare nucleu suportă două flux logic). În cazul meu (y 4 core procesor fizic) 8 fluxuri ale sarcinii tratate cu 40-50% mai repede decât 4. Dar nu se dă creșterea în continuare a fluxului măsurabil accelerație.

Algoritmul estomparea

Vă mulțumesc pentru lectură.

articole similare