Parallel FX II DIO – PLINQ


PLINQ – Parallel LINQ

U prethodnom dijelu upoznali smo se sa TPL – bibliotekom za paralelno programiranje pod .NET Framework-om. Ovaj post obradit će korištenje PLINQ paralelno izvršavanje LINQ upita. Ukoliko želite saznati više informacije o LINQ pogledajte prethodne postove ili reference koje su pobrojane u tim postovima. Paralelno izvršavanje LINQ upita implementirano je na dva od 4 osnovna izvora podataka i to:

· LINQ to Objects, i

· LINQ to XML.

Promjene implementacije upita iz LINQ u PLINQ su minorne i ne zahtjevaju drastično prilagođavanje. Svako korištenje PLINQ upita nad objektima potrebno je implementirati IparallelEnumerable interfejs koji čini sastavni dio PLINQ koji je implementiran preko proširenih metoda.

Nabrojimo osnovne značajke PLINQ:

· PLINQ – iskorištava novu generaciju hardvera korištenjem LINQ upita

· PLINQ podržava sve .NET upite koji se koriste u LINQ,

· Minimalna promjena u implementaciji u odnosu na klasičnu implementaciju LINQ

U prethodnom postu smo vidjeli sastav System.Threading.dll u smislu korištenja TPL. PLINQ je implementiran u dva osnovna prostora imena i to: System.LINQ i System.LINQ.Parallel.

Na samom početku pokrenimo jedan jednostava primjer izvršavanje LINQ upita i pokušajmo ga implementirati u paralelnom obliku.

Npr. Pretpostavimo da imamo polje prirodnih brojeva od 1-500.000, i želimo da nad tim poljem da izvršimo nekoliko LINQ upita. Pretpstavimo da želimo izračunati koliko prostih brojeva se nalazi u intervalu od 1 do 500.000.

Implementacija sa klasičnim LINQ upitom izgleda kao na sljedećoj slici:

clip_image002[4]

Rezultat ove implementacije prikazan je na sljedećoj slici:

clip_image004[4]

Vidimo da je traženje prostih brojeva u određenom intervali poprilično zahtjevna operacija i ona iznosi oko 1 minut.

Kako ovu implementaciju učiniti bržom, ako posjedujemo multy core processor. Ova implemenacija na QUAD codre procesoru trebala bi u najmanju ruku da bude 4 puta brža, paralelnom implementacijom LINQ upita. Da bi smo implementirali paralelnu verziju jedino je potrebno da našoj implementaciji pozovemo samo jednu proširenu metodu i to upit.AsParallel(). Sa ovim pozivom cijela naša implementacija je prilagođena paralelnom izvršavanju LINQ upita. Sljedeći kod implementira PLINQ:

clip_image006[4]

Rezultat i vrijeme za koje se izvršila operacija prebrojavanja prostih brojeva:

clip_image008[4]

Paralelna verzija se izvršila za 15 sekundi tačno 4 puta brže. Zamislite koliko vremena bi uštedjeli ako bi smo prebrojavali proste brojeve u intervali od 1 do million ili više.

Zaista, ovo je nevjerojatno na kako jednostava i očigledan način se implementira paralelno izvršavanje LINQ upita.

PLINQ kao i cjelokupna biblioteka ParallelFX u toku izvršavanje koda formira onoliko niti koliko postoji procesora na dotičnom PC. U slučaju prethodnog primjera formirane su 4 niti obzirom da se primjer izvršavao na Quad Core mašini. Medjutim, PLINQ dozvoljava i da se specificira tačan broj niti neovisno o broju procesora koji sadrži PC. Ovo možemo implementirati preko argumeta int degreeOfParallelism kojim sepiciramo konkretan broj paralelnih niti. Da bi smo prethodni primjer izvršili sa 3 paralelne niti implementacija je prikazana na sljedećoj slici:

clip_image010[4]

Kao što smo i čekivali rezultat je 3 puta brzi u odnosu na klasični LINQ upit:

clip_image012[4]

Postavlja se pitanje šta ako za argument stavimo broj veći od broja procesara koji posjeduje PC. Rezultat će biti približan rezultatu od 15 sekundi. U principu Parallel FX je formirao 16 paralelni niti i one su se raspodijelile na dostupne procesore. Ovo znači da specificiranje argumenta većeg od broja procesora nema značenja. Jedina svrha ovog argument je da se paralelizam smanji sa maksimalnog broja procesora da bi se nekoj drugoj operaciji dala mogućnost paralelnog izvršavanja.

Za kraj ovog posta nužno je spomenuti da zbog paralelizma obrada podataka u listama ili kolekcijama, ne izvršava se po indeksu i u tom slučaju paralelna obrada podataka nasumice uzima stavke iz kolekcija i manipuliše snjima. Da bi smo se uvjerili u to u prethodnom primjeru potražimo proste brojeve od 1 do 20 i ispisimo ih onim redom kojim ih je PLINQ upit i pronašao.

Rezultat je da na sljeećoj slici:

clip_image014[4]

Vidimo da prvi pros broj koji je pronažen je 7, pa zatim 3, 5 2 itd. Ovo znači da sortiranje kolekcija u paralelnim izvršavanjaima se mora posebno tretirati. Medjutim AsParallel proširena metoda ima drugi i posljednji argument ParallelQueryOptions, kojim kontrolišemo sortiranje kolekcije. Ako bi đeljeli da naši prosti brojevi budi pohranjeni u kolekciju uzlaznim redom po veličini tada bi pozvali metodu na sljedeći način:

clip_image016[4]

Sa ovim smo i pobrojali sve argument koji se mogu pojaviti prilikom poziva AsParallel proširene metode. Naravno prethodni i zadnji argument mogu se prosljeđivati i u kombinaciji.

Na kraju ako koga zanima implementacija metode pretraživanja prostih brojeva korištene u primjeru evo listing:

clip_image018[4]

PDF verziju cjelokupnog članka možete skinuti ovdje.

References

1. http://msdn2.microsoft.com/en-us/magazine/cc163340.aspx

2. http://en.wikipedia.org/wiki/Task_Parallel_Library#TPL

3. http://www.danielmoth.com/Blog/

4. API Reference Help

5. http://msdn2.microsoft.com/en-gb/concurrency

6. http://channel9.msdn.com/showpost.aspx?postid=347531

7. http://spellcoder.com/blogs/bashmohandes/archive/2007/10/14/8530.aspx

8. http://channel9.msdn.com/Showpost.aspx?postid=231495

9. http://channel9.msdn.com/Showpost.aspx?postid=361088

10. http://channel9.msdn.com/Showpost.aspx?postid=361092

11. http://channel9.msdn.com/Showpost.aspx?postid=361091

12. http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=1986&SiteID=1

13. http://blogs.msdn.com/pfxteam/

14. http://msdn.microsoft.com/en-us/magazine/cc163329.aspx

About Bahrudin Hrnjica

PhD in Mechanical Engineering, Microsoft MVP for .NET. Likes .NET, Math, Mechanical Engineering, Evolutionary Algorithms, Blogging.

Posted on 04/05/2008, in .NET, C# and tagged , , , . Bookmark the permalink. Leave a comment.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s