Chapel Group 15
Chapel on korkean asteen abstraktiotason ohjelmointikieli, joka on tarkoitettu pääasiassa rinnakkaisuuden (engl. parallelism) ohjelmoimiseen korkean tuotannon ympäristöissä suuren kokoluokan järjestelmillä. Chapelin nimi tulee akronyymistä Cascade High Productivity Language. Se on melko uusi kieli, sillä sen kehittäminen aloitettiin vuona 2002 ja ensimmäinen versio siitä valmistui vuonna 2012. Chapel ei ole vielä tuotantoasteella vaan prototyyppivaiheen implementaatiossa. Chapel on kehitetty moniytimisen rinnakkaisen laskennan helpottamiseksi ja tehostamiseksi isoilla järjestelmillä. Sen suunnittelussa ja toteutuksessa on otettu huomioon siirrettävyys, mikä mahdollistaa sen käyttämisen moniytimisillä tietokoneilla, clustereissa ja pilvialustoilla sekä superkoneilla, joille se alunperin suunniteltiin. Kehittäjien tarkoituksena on ollut tehdä Chapelista ohjelmointikieli, joka soveltuu monenkaltaiseen rinnakkaiseen ohjelmointiin. Tällä hetkellä se mahdollistaa data-rinnakkaisen (engl. data parallelism), tehtävärinnakkaisen (engl. task-parallelism) ja synkronisaatioon perustuvan rinnakkaisen ohjelmoimisen siten, että näihin voitaisiin vielä lisätä tuki sisäkkäiselle rinnakkaisuudelle (engl. nested parallelism). Chapel pyrkii myös hyödyntämään paremmin niin ohjelmistotason kuin laitteistotasonkin tarjoamaa ja mahdollistamaa rinnakkaisuutta. Historia Chapelin kehittäminen alkoi 2002 DARPAn High Productivity Computing Systemsin (HPCS) ohjelmassa. Sitä kehitettiin tässä ohjelmassa vuoteen 2011 saakka. Ohjelmaan sisältyi viisi tiimiä, joita jokaista johti laitteistovalmistaja. Näitä olivat Cray Inc., Hewlett-Packard, IBM, SGI, ja Sun. Ohjelman tarkoitus oli haastaa tiimit parantamaan korkean tuotannon tietokonelaskennan tuottavuutta. 2003 ohjelma eteni toiseen vaiheeseen, jossa Crayn johtama tiimi alkoi kehittää Chapelia, IBM X10:ä ja Sun Fortressia. Crayn projekti sai nimekseen Cascade. Sitä johti Crayn silloinen johtava tutkija Burton Smith, joka oli skeptinen uuden ohjelmointikielen suunnittelun suhteen HPCS-ohjelman alaisuudessa. Smithin mielipiteeseen vaikutti skeptisismi, voisiko pelkkien laitteistovalmistajien suunnittelema ohjelmointikieli menestyä. Hän kuitenkin muutti mielensä, kun selvisi, että suurin osa HPC-kielistä oli alun perin kehitetty laitteistovalmistajien toimesta. Vuoden 2003 alussa Crayn tiimi ilmoitti, että sen tarkoituksena on suunnitella uusi ohjelmointikieli. Chapelin suunnittelusta vastasi pääpiirteissään neljä henkilöä - David Callahan Craylta, CalTechin/JPL:n edustaja Hans Zima, Brad Chamberlain University of Washingtonin ZPLprojektista ja John Plevyak -, joiden taustoja sen ominaisuuskokoelma mukailee. Callahan vastasi kielen kokonaisvaltaisesta visiosta ja monisäikeisestä suoritusmodelista kevyen datakeskeisen synkronisaation kera. Zima toi kieleen HPC-näkökulmaa, Chamberlain keskittyi indeksijoukkoihin ensimmäisen luokan kansalaisina ja Plevyakin osaaminen täydensi kieltä
automaattisen tietotyypin tunnistamisen osalta, minkä Smith koki olevan avaintekijä onnistuneen rinnakkaisen ohjelmointikielen toteuttamisessa. Vuodesta 2003 vuoteen 2006 projekti oli vaiheessa, jossa tiimin jäsenet yrittivät löytää yhteistä näkemystä uudesta ohjelmointikielestä. Vuosien 2006-2008 aikana Chapelin design ja kääntäjäarkkitehtuuri alkoivat stabiloitua. Tämä mahdollisti muun muassa ensimmäisten tehtävä-rinnakkaisten ohjelmien ajon huhtikuussa 2006, ensimmäisten hajautettujen-muistitehtävä-rinnakkaisten (engl. distributed-memory task-parallel) ohjelmien ajon heinäkuussa 2007 ja ensimmäisten hajautettujen-muisti-data-rinnakkaisten (engl. distributed-memory data-parallel) ohjelmien ajon syyskuussa 2008. Vuosina 2008-2012 tiimi keskittyi kiinnostuksen herättämiseen ja palautteen keräämiseen. Tänä aikana Chapel siirtyi myös avoimen lähdekoodin tuotantoon. HPCS-ohjelman päättyessä loppuvuodesta 2012 Cascade-projekti oli saavuttanut Chapelin muodossa ohjelmalliset vaatimukset ja herättänyt mielenkiintoa HPC-piireissä. Suosion johdosta tiimi sitoutui viiden vuoden kehittämisjaksoon, jonka tarkoituksena on kehittää tutkimustason prototyyppisestä ohjelmointikielestä implementaatio korkean tuotannon ympäristöön. Kielen ominaisuudet Paradigmat Chapelin voidaan katsoa hyödyntävän useampaa ohjelmointiparadigmaa. Vaikka se on tehty rinnakkaiseen ohjelmointiin, se mahdollistaa olio-orientoituneen ohjelmoinnin ja sisältää myös automaattisen tietotyypin selvityksen sekä ominaisuuksia geneeriseen ohjelmointiin. Kielen rakenne Chapel on rakenteeltaan lohkomainen imperatiivinen ohjelmointikieli. Chapelin syntaksi muistuttaa C-kielen syntaksia. Lausekkeet erotellaan puolipistein, ja lohkot erotellaan aaltosuluilla. Ehtolauseet ovat samankaltaisia C:n kanssa. Edellä mainittujen ominaisuuksien takia se on helpohko opittava esimerkiksi aiemmin C:llä, C++:lla, Javalla, Fortranilla tai Pythonille ohjelmoinneille. Sen rinnakkaisuusominaisuudet ovat saaneet kuitenkin vaikutteita ZPL:stä, High-Performance Fortranista (HPF) sekä Cray MTA/Cray XMT laajennuksista C:lle ja Fortranille. Tietotyypit Chapelin perustietotyypit ovat oletuksena 64-bittisiä. Tyypit ovat bool, int, uint, liukuluvuista real ja imag, complex sekä string. Kaikki tietotyypeillä on oletusarvot, jotka muuttujat saavat, jos käyttäjä ei ole initialisoinut niille arvoja. Chapelissa on myös array ja range-tyyppiset rakenteet, jotka voivat sisältää useita perustyyppejä. Domain-tyypit voivat pitää sisällään useita erityyppisiä alkioita ja olla myös kaksiulotteisia. Muita kielen tietotyyppejä ovat tuplet,
numeroidut tyypit (engl. enumerated types) ja tyyppiunionit. Chapel tukee myös oliota ja tietue- (engl. record) tyyppejä. Tietuetyypit noudattavat arvosemantiikkaa ja oliot viitesemantiikkaa. Chapelissa ohjelmoija voi esittää ja käyttää hajautettuja tietorakenteita kuin ne olisivat lokaaleja tietorakenteita. Näitä kutsutaan globaalin näkyvyyden tietorakenteiksi (engl. globalview data structures), koska ne voidaan alustaa koko ohjelman käyttämällä tiedolla ja niitä voi käsitellä globaalein indeksein säikeissä. Koska suuren skaalan ohjelmat ovat usein dataintensiivisiä, Chapel tarjoaa useita globaalin näkyvyyden taulukoita, joita ovat esimerkiksi suorakulmaiset (engl. rectangular), hajanaiset (engl. sparse), assosiatiiviset ja epämuodolliset (engl. unstructured) taulukot. Silmukkarakenteet Chapelin for-silmukkarakenne on toteutettu kahdella lauseella niin, että ensimmäinen lause esittelee iterointimuuttujan ja toinen lause iterointisäännön. Iterointimuuttuja on silmukan lokaalimuuttuja. Silmukoissa voidaan käyttää myös yeld-avainsanaa, jolloin tieto voidaan palauttaa ulos silmukasta silmukan suorituksen jatkuessa eteenpäin sen jälkeen. Coforall-silmukka on rinnakkaistettu niin, että jokainen silmukan iteraatio on oma tehtävänsä eli oma prosessinsa. Silmukassa on sisäänrakennettu synkronisaatio siten, että se odottaa kaikkien iteraatioiden valmistumisen ennen sitä kutsuneen prosessin jatkumista. Forall-silmukka on vastaavasti rinnakkaistettu niin, että se tekee optimaalisen määrän tehtäviä riippuen esimerkiksi käytettävän laitteiston ytimien määrästä. Proseduurit Funktioiden syntaksi on hyvin samankaltainen esimerkiksi C++ kanssa. Parametrit voivat olla tyypittämättömiä funktioiden esittelyssä, ja on mahdollista tehdä funktioita, jotka ottavat rajoittamattoman määrän parametreja. Funktioiden polymorfismi on myös mahdollista eli kutsuttavista määritellyistä samannimisistä funktioista valitaan yksi ajon aikana. Funktioiden parametrinvälitys toimii arvosemantiikalla ja paluuarvoja voidaan palauttaa return tai yeldavainsanojen avulla. Rinnakkaisuus Rinnakkaisuus toteutetaan tehtävien (engl. task) avulla. Tehtävät ovat anonyymejä ja ne kirjoitetaan omiin lohkoihinsa ohjelmassa. Avoinsana begin aloittaa uuden tehtävän. Tehtävien valmistumista voidaan myös valvoa, ja avainsana sync kertoo ohjelmalle, että prosessin kaikki sisäiset tehtävät täytyy suorittaa loppuun ennen suorituksen jatkamista. Synkronisointimuuttujat (engl. sychronization variable) tallentavat normaalin sisältönsä lisäksi tilan (full/empty), jonka avulla voidaan vartioida, saako muuttujaan lukea tai kirjoittaa. Synkronointimuuttujien avulla voidaan varmistaa, että ohjelma toimii oikein, jos samoja muuttujia käsitellään useissa tehtävissä rinnakkain. Atomisen muuttujat (engl. atomic
variables) sisältävät joukon operaatioita, jotka voidaan suorittaa prosessorilla yhdellä käskyllä, niin että muut tehtävät eivät voin nähdä tai vaikuttaa keskeneräisiin arvoihin. Begin-avainsanalla aloitetun tehtävän lisäksi Chapel mahdollistaa rakenteellisen tehtävärinnakkaisuuden (engl. strutured task parallelism). Cobegin-avainsanalla voidaan aloittaa yhden lohkon sisällä kaikkien sen rungon sisältämien lausekkeiden rinnakkainen ajo erillisissä tehtävissä. Cobegin ei takaa missä järjestyksessä eri tehtävät suoritetaan tai valmistuvat. Muistinvaraaminen Ohjelman aikana olioita tallennetaan pinotyyppisiin rakenteisiin muistissa ja tietueita paikallisen suorituksen muistitilaan eli pinoon (engl. stack). Chapelissa on mahdollista määritellä paikallisia muistialueita (engl. locales). Näitä muistialueita voi sitten välittää muille tehtäville, jolloin tehtävät voivat käsitellä niitä kuin paikallisia muuttujia. Globaalin näkymän taulukoita muodostetaan paikallisten muistialueiden avulla. Niitä pystytään indeksoimaan paikallisilla domain-indekseillä ja paikalliset domain-indeksit voivat ulottua myös oman normaalin paikallisen muistialueen ulkopuolelle, jolloin saadaan käsiteltyä taulukoiden arvoja myös muiden tehtävien alueilta. Kehityksen kohteet tulevaisuudessa Chapelissa on joitakin kehittämiskohteita. Esimerkiksi virheilmoitusten välittämisessä on vielä ongelmia. Tulevaisuudessa kieleen kehitetään muun muassa työkaluja, joilla voidaan tunnistaa yksittäisiä tehtäviä tai tehtäväryhmiä, ja mahdollisuuksia antaa tehtäviä tietyille ytimille. Lähteitä: http://chapel.cray.com/docs/latest/index.html http://chapel.cray.com/publications/pmfpc-chapel.pdf http://www.cray.com/blog/chapel-productive-parallel-programming/ http://chapel.cray.com/docs/latest/examples/index.html