Rinnakkaisohjelmointi

Wikiopistosta
Kuva 1. Rinnakkaisohjelmointi usean ohjelman ja datan tapauksessa (Multiple Program Multiple Data).

Takaisin sivulle Rinnakkaisprosessointi


Johdanto[muokkaa]

Rinnakkaisohjelmoinnissa pyritään hyödyntämään esim. useista prosessoreista ja muistiyksiköistä koostuvan laitteistoarkkitehtuurin suomat suorituskykyedut. Vaikka rinnakkaisohjelmointi onkin sarjamuotoiseen tietojen käsittelyarkkitehtuuriin tarkoitettuun ohjelmointiin verrattuna haastavampaa, se tuo mukanaan useita etuja. Rinnakkaisohjelmoinnin hyödyntäminen vaativassa laskennassa, kuten mallinnuksessa, simuloinneissa, optimoinnissa, automatisoinnissa sekä monimutkaisten reaalimaailman ongelmien ratkaisussa, on edistänyt tutkimus- ja kehittämistoiminnan tuottavuutta ja vaikuttavuutta yhteiskunnan ja liike-elämän hyväksi. Moniydinprosessorien yleistyttyä kuluttajakäyttöisiin laitteisiin sarjamuotoisen ohjelmoinnin tuotokset haaskaavat useissa tapauksissa laitteistoresursseja ja energiaa rinnakkaisohjelmointia hyödyntäviin sovelluksiin verrattuna.

Vaativassa, laskentatehoa tai suuria datamassoja käsittelevässä, laskennassa rinnakkaisohjelmoinnin avulla pystytään ratkaisemaan haastavia tehtäviä nopeasti aikaa ja tätä kautta rahaa säästäen. Tämän lisäksi rinnakkaisprosessointia hyödyntävissä arkkitehtuureissa on mahdollista hyödyntää edullisia, jo massatuotannossa olevia komponentteja, jotka alentavat laskennan kiinteitä kustannuksia. Seuraavan kuvauksen tavoitteena on esitellä rinnakkaisohjelmoinnin malleja, suunnittelua, toteutusta ja yleiskäsitteistöä näitä tekniikoita mahdollisesti tarvitseville.

Rinnakkaisohjelmoinnin mallit[muokkaa]

Rinnakkaisohjelmointi toimii prosessori-, muisti- ja muuta laitteistoarkkitehtuuria korkeammalla abstraktiotasolla hyödyntäen suunnitellun järjestelmän tarjoamia palveluja. Ohjelmointiin on kehitetty malleja, joilla pyritään mahdollisimman suureen riippumattomuuteen laitteistoarkkitehtuurista, vaikkei tähän aina päästäkään. Rinnakkaisohjelmoinnin mallien arvoa ja hyödynnettävyyttä arvioidaan sen mukaan, kuinka toimivia ne ovat eri arkkitehtuureissa ja kuinka tehokkaita luodut ohjelmat ovat.

Yleisesti ottaen rinnakkaisohjelmoinnin mallit jaetaan sen mukaan, kuinka ohjelmoidut prosessit ovat vuorovaikutuksessa ja kuinka ratkaistavaa ongelmaa on lähestytty. Ohjelmoitujen prosessit voivat olla vuorovaikutuksessa jaetun muistin, viestinvälityksen tai käytetyn kääntäjän luomien, usein implisiittisten, sääntöjen avulla. Vastaavasti ongelmanratkaisun kautta rinnakkaisohjelmointia lähestyttäessä prosessit rakentuvat suoritettavien tehtävien rinnakkaisen suorituksen, rinnakkaisen datan tai kääntäjän asettamien rinnakkaisuussääntöjen mukaan. Rinnakkaisohjelmoinnin malleja ovat esim.:

  • jaettuja muistiresursseja ilman säikeitä (Shared Memory, without threads),
  • säikeistystä (Threads),
  • hajautettua muistia ja viestinvälitystä (Distributed Memory / Message Passing),
  • rinnakkaisdataa (Data Parallel),
  • hybridiohjelmointia (Hybrid),
  • yksi ohjelma monta dataa (Single Program Multiple Data) ja
  • useita ohjelmia sekä datoja (Multiple Program Multiple Data), esim. kuva 1.


Rinnakkaisohjelmoinnin suunnittelu[muokkaa]

Rinnakkaisohjelmoitujen ohjelmien suunnittelu ja kehitys on perinteisesti ollut hyvin manuaalista työtä. Ohjelmoija on ollut vastuussa sekä rinnakkaistamismahdollisuuksien tunnistamisesta että toteutuksesta. Tämä tehtävä on ollut monesti aikaa vievä, monimutkainen ja virhealtis iteratiivinen prosessi. Erityyppisiä työkaluja on kuitenkin sittemmin kehitetty kääntäjiin automatisoimaan tätä kehitystyötä. Näiden työkalujen käyttö tulee monesti kuitenkin kyseeseen jo olemassa olevan sarjamuotoisen ohjelmakoodin ollessa kyseessä, tai silloin, kun toimitaan äärimmäisen tiukalla budjetilla. Täysautomaattisen rinnakkaistuksen riskejä ovat mm. väärät valinnat ja heikko rinnakkaisprosessoinnin optimointi, heikko käännetyn sovelluksen suorituskyky, heikko toteutuksen joustavuus, rajallinen esim. toistorakenteisiin keskittyvä rinnakkaistaminen, puutteellinen rinnakkaistuksen toteutus automatisoidun kääntäjän diagnostiikan pohjalta. Em. syistä johtuen manuaaliset rinnakkaistuksen suunnittelumenetelmät onkin hyvä tuntea.

Suosituksia rinnakkaisohjelmoinnin suunnitteluun[muokkaa]

  • Ratkaistavaan ongelmaan ja mahdolliseen vanhaan sarjamuotoiseen ohjelmakoodiin tutustuminen: mitkä ovat algoritmin laskentaintensiivisimmät kohdat (hotspots) ja mitkä ovat laskentaprosessin suurimmat pullonkaulat (bottlenecks), kuten luku-, kirjoitus- ja tiedonsiirto-operaatiot.
  • Laskentatehtävän osittaminen toiminnallisuuden (functional decomposition) että datan (domain decomposition) osalta.
  • Tiedonsiirtotarpeiden tunnistaminen ja tiedonsiirron luonti eri laskennallisten tehtävien ja laskennan välitulosten välille.
  • Datan ja laskennan välitulosten riippuvuuksien tunnistaminen ja laskentatehtävien samanaikaisuusvaatimusten tunnistaminen ja tehtävien synkronointi.
  • Kuormantasaus eri laskentatehtävien välillä, jolloin esim. osa prosessoreista ei jää vajaakäytölle.
  • Laskentatehon-, tiedonsiirron- ja synkronisoinnin suhteen arviointi (granularity: fine-grain parallellism, coarse-grain parallellism).
  • Rinnakkaisohjelmoidun ohjelmiston suorituskyvyn hienosäätö, johon löytyy omia työkalujaan.
  • Datan lukuun ja kirjoitukseen tarvittavan ajan arviointi ja optimointi huomioiden esim. käytettävissä olevat tiedonsiirtonopeudet, muistilaitteet ja tiedostojärjestelmät.
  • Testauksen ja debuggauksen suunnittelu huomioiden laskennan ja koodin skaalautumistarpeet.

Takaisin sivulle Rinnakkaisprosessointi

Lähteet[muokkaa]


Takaisin sivulle Rinnakkaisprosessointi