arckép

Neuwirth István

programtervező informatikus MSc – ELTE

Computational and Software Techniques MSc – Cranfield, UK

Elérhetőség
pitta2@gmail.com
+36 30 329 3039

Valid XHTML 1.0 Transitional

Valid CSS!

.NET Parallel Extensions

Kitekintés a jövőbe

A jelen legnagyobb szoftverfejlesztési problémája a többszálú programok hatékony fejlesztése. Erre adhat választ a .Net következő verziójában megjelenő Parallel keretrendszer.

A számítógépek teljesítménynövekedésének fenntartása jelenleg az egyre kisebb mérettartományok fizikai korlátai miatt a processzorok, illetve magjaik számának növelésével érhető el. Azonban a nagyobb számítási kapacitás kihasználásához az alkalmazások párhuzamosítására, a több magra optimalizált, illetve felkészített algoritmusokra van szükség. Sokáig a programoknak csak egy kis töredéke – jellemzően nagy teljesítményigényű, például grafikus szoftver – volt felkészítve a több magon történő futásra, a többi program jellemzően kihasználatlanul hagyta ezeket a lehetőségeket. Mostanra egyre javul a helyzet, azonban a párhuzamos programok írása külön ismereteket igényel, a futás közben előforduló hibák a nemdeterminisztikusság miatt jóval nehezebben deríthetők fel.

A törekvések könnyen használható apparátus és végső soron az egyes nyelvek esetén natív támogatás kidolgozására irányulnak. A .NET keretrendszerben eddig is több osztály állt a programozók rendelkezésére szálkezeléssel, szinkronizációval kapcsolatban, saját szálmenedzselő rendszere kiválóan használható aszinkron hívások megvalósítására is, azonban a Microsoft Parallel Extensions osztályai ennél előrébb mutatóak.

Ez a kiterjesztés 3.5-ös keretrendszerre telepíthető, ezután System.Threading komponensre mutató referencia hozzáadása szükséges. Segítségével LINQ lekérdezések, felsorolások iterálása, illetve taszkok párhuzamosítása oldható meg egyszerűen. A szálak menedzselését, a rendelkezésre álló magok közötti optimális elosztást és a szinkronizációt automatikusan elvégzi. A System.Threading névtér Parallel osztálya párhuzamosított ciklusok végrehajtását segíti. (For és foreach szerkezetek.) Az alábbi példák mutatják, h a korábbi kódról milyen egyszerű áttérni párhuzamosan futó kódra:

for (int i = 0; i < 10; ++i)
{
a[i] = Muvelet(a[i]);
}
int[] szamok = new[] { 12, 13, 104, 15 };
var q = from p in szamok where Prim(p) select p;
foreach (var e in q) MessageBox.Show(e.ToString());
Parallel.For(0, 10, i =>
{
a[i] = Muvelet(a[i]);
});

int[] szamok = new[] { 12, 13, 104, 15 };
var q = from p in szamok.AsParallel() where Prim(p) select p;
foreach (var e in q) MessageBox.Show(e.ToString());

Természetesen vannak bizonyos megkötések és néhány esetben a párhuzamos kód akár lassabb is lehet (nem megfelelő helyen használva).

A fentiek egy része előreláthatólag a C# 4.0 nyelvi újdonságai közé fog tartozni, de a most bemutatott kiegészítéssel már jelenleg is olyan könnyen írhatunk például párhuzamos for ciklust, mint normál for ciklust. Az Intel, Microsoft és sok más cég egyetemekkel karöltve fejleszti a konkurens programok előállítását segítő eszközöket, hogy a közeljövőben várható, akár több tucat magot is tartalmazó processzorokra könnyen, gyorsan és hibamentesen lehessen fejleszteni.