Hirdetés
. Hirdetés

Feldspar - egy új nyelv digitális jelfeldolgozáshoz

|

Gyorsabb fejlesztés - kevesebb programhiba.

Hirdetés

Valljuk be őszintén – legyen szó akár okostelefonra írt alkalmazásról vagy webszerverről –, általában azt tartjuk legfontosabbnak, hogy mit tud az adott szoftver, milyen a sebessége és mennyire stabil. Kevesebben érdeklődnek az iránt, hogy milyen algoritmusok működnek a háttérben, az pedig végképp ritkán fordul meg a fejünkben, hogy milyen technológia segítségével fejlesztették a kérdéses programot, mely programozási nyelvek segítették a fejlesztők munkáját, milyen a szoftver felépítése.

Hajlamosak vagyunk a feltett kérdések fölött elsiklani, pedig hosszabb távon ezek lényegesen befolyásolják, hogy mennyire sikerül gyors és stabil rendszert létrehozni, mennyire lesz könnyű a hibák javítása, az új szolgáltatások implementációja és a szoftver adaptálása a piacon megjelenő új hardverekhez. Márpedig ezek a tényezők határozzák meg a szolgáltatás minőségét és megbízhatóságát, s ezek a felhasználók számára is közvetlenül érezhetők.

Feldspar
Feldspar

Gyorsabb fejlesztés – kevesebb programhiba

Különösen fontos kérdések ezek a sebességkritikus beágyazott rendszerek esetén. Gondoljunk például a mobilhálózatok bázisállomásainak szoftvereire, amelyek – többek között – a rádiójelek feldolgozásáért, zajszűréséért, kódolásáért, tömörítéséért felelnek. A mobilhálózaton érkező adatokat valós időben kell feldolgozni, ami azt jelenti, hogy az egyes adatcsomagokhoz szigorú időkorlátok vannak érvényben. Ez érthető, hiszen egyszerű felhasználóként sem fogadnánk el, ha a szoftverek lassúsága miatt érezhető késéseket észlelnénk telefonálás közben. Ezekre a kihívásokra speciális célhardver igénybevétele a megoldás. Az architektúrák különleges szolgáltatásait azonban csak akkor sikerül érdemben kihasználni, ha a választott programozási nyelv hozzáférhetővé teszi az elérhető, speciális processzorutasításokat, és hozzáférést biztosít a memóriakezelés részleteihez. Ez a gyakorlatban igen alacsony szintű, általában C, sőt, időnként assembly nyelvű programozást jelent.

Pedig az elmúlt évtizedek során a programozási nyelvek izgalmas fejlődésen mentek keresztül. Gondolhatunk az objektumorientált programozás sikerére, ami lehetővé teszi, hogy a világnak a szoftver számára fontos objektumait könnyedén modellezhessük a programunkban. A programozó alkotómunkája így már sokkal közelebb áll a megoldandó probléma kérdéseihez, mint magához a hardverhez, ami majd végül futtatja az adott alkalmazást. Az absztrakciós szint emelésének eredménye a gyorsabb fejlesztés és kevesebb programhiba. Ugyanezt éri el egy másik, nagyon ígéretes paradigma, a funkcionális programozás is. A funkcionális programozási nyelvekben a függvény a központi fogalom. A teljes program függvények megfelelő kompozíciójából (azaz egyszerű függvények összetettebb funkciókká történő összekapcsolásából) áll. Ehhez pedig az adott programozási nyelvek igen kifinomult eszköztárat biztosítanak a fejlesztők számára.

Nézzünk erre egy konkrét példát! A skaláris szorzás művelet két vektort (azaz n számból álló számsorozatot) szoroz össze úgy, hogy összeszorozza az egyik vektor első elemét a másik első elemével, a másodikat a másodikkal stb., majd a kapott szorzatokat összeadja. A legtöbb programozási nyelven ezt egy ciklus segítségével programoznánk le, amely minden lépésben összeszoroz egy-egy elemet a két vektorból, és eltárolja az eredményt, majd egy másik ciklusban összeadnánk a kapott eredményeket. Ennél ügyesebb megoldás, ha rögtön az első ciklusban elvégezzük az összegzést is, így nem kell a részeredményeket tárolni. Azonban mindkét esetben fel kell írni magát a ciklust, figyelni kell a ciklusszámláló karbantartására és a vektorok indexelésére.

A Haskell nyelv

Napjaink egyik legkifinomultabb funkcionális programozási nyelve a Haskell. Élesben használják például banki alkalmazásokban is, de az akadémiai szektor is előszeretettel fordul ehhez a nyelvhez a kutatások során. Haskellben a skaláris szorzás az alábbi egysoros függvényre egyszerűsödik:

scalarProduct vec1 vec2 = sum (zipWith (*) vec1 vec2)

A vec1 és vec2 a két vektor, amelynek skaláris szorzatát ki szeretnénk számolni. A program szinte pontosan a művelet matematikaórán szokásos definícióját mintázza: a két vektort a szorzás (*) művelet segítségével össze kell „cipzározni” (zipWith), majd az eredményeket össze kell adni (sum). Haskellben tehát a programozó figyelhet magára a megoldandó problémára és a választott algoritmusra a technikai részletek helyett.

Célterület: digitális jelfeldolgozás

Vajon lehet-e a modern programozási nyelvek technikáit alkalmazni az olyan sebességkritikus beágyazott rendszerek programozásához, mint a korábban említett bázisállomások szoftverei? Ezt a kérdést igyekszik megválaszolni az ELTE Szoftvertechnológiai Laboratóriumának egyik kutatócsoportja a göteborgi Chalmers Egyetem csapatával együttműködve egy kutatás-fejlesztési projektben, amelyet az Ericsson kezdeményezett és finanszírozott. A projekt részben az ELTE-Soft Kft. KMOP-1.1.2-08/1–2008–0002 jelű, az Európai Unió által társfinanszírozott pályázatában valósul meg.

A projekt célterülete a digitális jelfeldolgozás (DSP – Digital Signal Processing), ami az Ericsson rádiós részlegének alapvető fontosságú tudományterülete. A legtöbb DSP-algoritmus számsorozatokon vagy mátrixokon végez műveleteket. Mint a skaláris szorzás fenti példája alapján is sejthető, a Haskell nyelv kiválóan alkalmas az ilyen tulajdonságú algoritmusok kompakt leírására. Miért ne lehetne mobilhálózatok bázisállomásainak szoftvereit Haskellben fejleszteni? Sajnos a nyelv számos olyan – egyébként nagyon kényelmes – lehetőséget tartalmaz, amelyek miatt a Haskell fordítóprogramjai nem képesek olyan hatékony tárgykód előállítására, amely a speciális hardverkörnyezet lehetőségeit kihasználva megfelelne a rendszerrel szemben támasztott követelményeknek. Másként fogalmazva: a Haskell – és vele együtt számos más, magas szintű programozási nyelv – túl általános ahhoz, hogy DSP-algoritmusokat egyszerre kényelmesen és hatékonyan programozhassunk velük.

Az úgynevezett általános célú programozási nyelvekkel (GPL, General Purpose Language) szemben ilyen esetben az alkalmazásterület-specifikus nyelvek (DSL – Domain Specific Language) kerülnek előtérbe. Ezek egyetlen problémakör kifejezését célozzák meg: lemondanak a tetszőleges programozási feladat megoldásáról, cserébe a kiválasztott területen a többi nyelvnél kifejezőbbek és hatékonyabbak lehetnek. Ilyen DSL például az adatbázisok kezelésére használt SQL is: soha nem fogunk SQL-ben grafikus felhasználói felületeket programozni, de a relációs adatbázisok témakörében kiemelkedően hatékony nyelv.

Az ELTE-n futó projekt azt tűzte ki célul, hogy kiválogassa a Haskell nyelvnek a DSP-algoritmusok programozásához leghatékonyabbnak bizonyuló eszközeit, kiegészítse azokat a hiányzó, speciális eszközkészlettel, és ezeket egy új, alkalmazásterület-specifikus nyelvvé gyúrja össze. A svéd partneregyetemen szokás, hogy a közreműködésükkel kidolgozott programozási nyelveket ásványokról nevezik el. Korábban született már például Lava és Obsidian nyelv is.

Mi az a Feldspar?

Az új nyelv a Feldspar (földpát) elnevezést kapta, amely egyben tökéletes betűszó is: Functional Embedded Language for Digital Signal Processing and Parallelism, azaz funkcionális beágyazott nyelv digitális jelfeldolgozáshoz és párhuzamossághoz. A munka 2009-ben kezdődött, azóta a nyelv és a hozzá tartozó fordítóprogram több szabadon elérhető, nyílt forráskódú verziója került kiadásra. Ezek a http://feldspar.inf.elte.hu/ oldalról elérhetők.

A digitális jelfeldolgozás területén a kísérletezéshez jó terep a hangfeldolgozás. Feldsparban számos olyan algoritmust implementált az egyetemi kutatócsoport, amely valós időben alakítja át a – például mikrofonból érkező – hangot. A csoportban részt vevő hallgatók még egy vizualizációs alkalmazást is készítettek (1. kép), amelyben élőben lehet szerkeszteni a Feldspar programokat, lefordítani őket, és meghallgatni a hatást.

Térjünk vissza a skaláris szorzás példájához: az előbbiekben leírt Haskell implementáció egyben érvényes Feldspar program is. A Feldspar fordítóprogramja ebből a függvényből egy C99 szabványnak megfelelő C függvényt készít, ráadásul garantálja a programozónak, hogy a vektorelemek szorzását és a szorzatok összeadását egyetlen ciklusban végzi el, azaz az említett két megoldás közül az „okosabbat” állítja elő. A program hatékonyságát ezen túlmenően számos további optimalizációs eljárás javítja. Jó néhány processzor támogatja például az úgynevezett SIMD (Single Instruction, Multiple Data – egy utasítás, több adat) műveleteket. Ezek segítségével például egy szorzás helyett négy vagy nyolc számpár összeszorzását végezhetjük el egyszerre, jelentősen gyorsítva a programot. C-ben programozva ez a programkód jelentős átalakításával jár, ami nehezen karbantarthatóvá teszi a kódot. Feldsparban elegendő a skaláris szorzás függvényének típusát módosítani, amelyben előírjuk, hogy a műveleteket például négyesével csoportosítva szeretnénk elvégezni: a fordítóprogram pedig a kért hardverre specializálva generálja az optimalizált C kódot.

A DSP-algoritmusok leírása azonban önmagában még nem elég: ezeket teljes rendszerré kell szervezni, figyelni a párhuzamosítási lehetőségekre, a memóriakezelésre, a feladatok ütemezésére. A feladat megoldásához az ELTE-csapat az úgynevezett adatfolyam-gráfokat hívta segítségül. Ezek olyan hálózatok, amelyek csúcspontjaiban egy-egy adatfeldolgozó algoritmus található, a csúcsok közötti élek pedig azt szabályozzák, hogy az egyik feldolgozási lépés kimenetét melyik másik algoritmusnak kell továbbítani. Egy ilyen gráf minden csúcspontjában található programot akár külön processzormag is futtathat. Ha azonban kevesebb a rendelkezésre álló feldolgozóegység, mint a feladatok száma, akkor dönteni kell a sorrendről. Ez az ütemezés problémaköre, ahol a megoldás kidolgozása során rengeteg kísérletet, teljesítménytesztet kellett elvégezni. Ehhez valódi, többmagos hardverre volt szükség. Ebben a projektben a 2. képen látható, 4 GB memóriával és 64 processzormaggal rendelkező Tilera kártyát használták fel.

A Feldspar nyelvet és fordítóprogramját jelenleg az Ericsson svédországi részlege vette górcső alá: arra kíváncsiak, hogy a cég számára fontos alkalmazásokat mennyire könnyen, illetve milyen hatékonysággal lehet az új nyelven megvalósítani. A kísérlet eredményétől függ majd az eredmények további, ipari hasznosítása.

A szerző az ELTE Szoftvertechnológiai Laboratórium tanársegédje.

Hirdetés
0 mp. múlva automatikusan bezár Tovább az oldalra »

Úgy tűnik, AdBlockert használsz, amivel megakadályozod a reklámok megjelenítését. Amennyiben szeretnéd támogatni a munkánkat, kérjük add hozzá az oldalt a kivételek listájához, vagy támogass minket közvetlenül! További információért kattints!

Engedélyezi, hogy a https://www.computertrends.hu értesítéseket küldjön Önnek a kiemelt hírekről? Az értesítések bármikor kikapcsolhatók a böngésző beállításaiban.