Ülevaade objektorienteeritud paralleelprogrammeerimise raamistikust Charm++

Date

2012

Journal Title

Journal ISSN

Volume Title

Publisher

Tartu Ülikool

Abstract

Eksisteerib palju võimsaid superarvuteid ja samas ka keerulisi algoritme, mis tõesti võimsust vajavad. Probleem seisneb selles, et riistvara ei jõua tarkvara arenguga sammu pidada ja tihti tekib vajadus suuremale jõudlusele. Lahenduseks oleks ülesannete või tööde jagamine olemasolevate ressursside vahel. Näiteks oleks väga keeruline luua protsessor, mis oleks 1000 GHz, kuid pole probleem luua tuhat 1 GHz protsessorit. Paralleelarvutuste mõte seisnebki selles, et ei peaks eksponentsiaalselt võimsamaid riistvara komponente looma, vaid kasutada efektiivselt olemasolevaid. Käesoleva töö eesmärgiks on anda ülevaade paralleelprogrammeerimise raamistikust Charm++. Kuid enne selle raamistiku ülevaate andmist, kirjeldatakse paralleel-programmeerimisest üldisemalt. Tuuakse näide maatriksite korrutamisest jagatud protsessorite peal ja seda kahe mudeli peal: MPI ja Charm++. Charm++ on objektorienteeritud paralleel-programmeerimise raamistik, mis baseerub C++ keelel, kuid lihtsamalt võib öelda, et Charm++ on teek, mis lubab C++ objektidel suhelda omavahel efektiivsemalt. Charm++ raamistikule pani aluse L.V. Kale koos oma arendaja tiimiga paralleelprogrammeerimise laboratooriumis. Umbes sada inimest on panustanud sellesse projekti keskmiselt 15 aasta jooksul. [1] Charm++ raamistikku kasutades on näiteks ehitatud järgmised suured rakendused: • NAMD – Not Another Molecular Dynamics programm, mis on dünaamiline molekulaar simulatsiooni pakett. [2] • Center for Simulation of Advanced Rockets kasutab füüsilise simulatsiooniks koodi, mis kasutab samuti Charm++ raamistikku. [3] Charm++ programmeerimise mudel sarnaneb CORBA, Java RMI või näiteks RPC mudelile, kuid siiski on see teek mõeldud suure jõudlusega masinatele, mis on disainitud paralleelarvutuste läbiviimiseks. Charm++ kasutab „üks programm, palju andmeid“ (SPMD – single program, multiple data) programmeerimise mudelit, mille tegi kuulsaks MPI (Message Passing Ingerface). [1] Sõnumi saatmise liides ehk MPI ilmus esimesena standardi nime all 1994 aastal ja selle üks põhilisi eesmärke on täita paralleelarvutusi jagatud ressursside vahel. MPI funktsionaalsus on äärmiselt ulatusrikas ja pakub programmeerijale: • Sidet punktist punkti (Point-to-point communication) • Kollektiivset sidet (Collective communication) • Ühepoolset sidet (One-sided communication) • Paralleelset sisendit ja väljundit (Parallel I/O) • Dünaamilist protsessi juhtimist (Dynamic process management) [7] Charm++ eelis MPI ees on see, et eksisteerib keeruline iseärasus lihtsustamaks rakendusest sõltumatut objekti ümberasustamist (application-independent object migration). MPI standardit kasutades on see samuti võimalik, kuid nõuab keerulist programmeerimist ja pidevat koormuse jälgimist. Charm++ parim iseärasus seisneb selles, et seda raamistikku võib võtta kui lisandit MPI standardile, sest eksisteerib AMPI (Adaptive Message Passing Interface), mis lubab MPI koodi jooksutada otse Charm++ raamistikku kasutades. [1] Järgnevas töös antakse põhiline ülevaade mõlemast paralleelprogrammeerimise tehnikast. MPI standardit käsitletakse otse koodinäidetega ja seletatakse lahti iga funktsiooni tähtsus ühes tavalises paralleelselt käivitatavast programmist. Charm++ raamistikule lähenetakse rohkem teoreetilisema osaga, kus alguses pannakse rõhku struktuurile ja lõpus antakse ülevaade, kuidas programmeerida Charm++ programm. Selles töös kirjeldatakse ka Charm++ struktuuri, mida saab kokku võtta viie sõltumatu objekti kategorisatsiooniga: 1. Järjestikused objektid (nagu ka C++) 2. Chare objektid – samaaegselt käivituvad objektid 3. Chare järjend – kogum chare objektidest ja neid objekte saab järjendis individuaalselt käivitada 4. Chare grupid – kogum chare objektidest, mis on iga protsessori grupi liige 5. Sõnumid – infovahetusega tegelevad objektid [7] Töö koosneb kirjalikust ja praktilisest osast. Kirjalik osa on rohkem teoreetilisem ja ära jagatud kolme peatüki vahel. Kirjaliku osa eesmärgiks on anda kindel ülevaade paralleel-programmeerimisest kasutades selleks kahte erinevat lähenemist. Töö praktiline osa koosneb kahest paralleelselt käivitatavast programmist, kus esimene on kirjutatud MPI standardit kasutades ja teine Charm++ raamistikku. Lisatud on ka õpetused, kuidas endale sellised keskkonnad paigaldada, et sooritada samu paralleelarvutusi. Esimeses peatükis antakse ülevaade paralleelprogrammeerimise kasutusest tänapäeval ja kuidas kirjutada koodi, mis arvutaks paralleelselt. Esmalt kirjeldatakse populaarsemat paralleelprogrammeerimise stiili, milleks on MPI standard ja selles stiilis koode kirjutatakse C keeles. Kui tavalist koodi käivitatakse järjest ja iga funktsioon ootab oma täitmise lõpetamist, siis mõistlikum on kirjutada mitteblokeeruvaid funktsioone paralleelprogrammeerimisel. Näha on ka kuidas tekivad lihtsad järjekorra probleemid, ehk ei ole teada kus ja millised andmed millises järjekorras töödeldakse, kui just ei kasutata mingeid sünkroniseerimis- tehnikaid. Teises peatükis kirjeldatakse selle töö põhilist osa – ülevaadet Charm++ raamistikust. Ülevaate andmiseks kirjeldatakse raamistiku ülesehitust, struktuuri ja kindlasti ka iseäraseid tunnuseid. Alustatakse väikseimatest objektidest ja sealt edasi kirjeldatakse juba nende objektide järjendit ning kuidas need objektid suhtlevad omavahel. Seal tulevad välja ka Charm++ raamistiku erinevused võrreldes MPI liidesega. Kolmandas peatükis muutub teoreetiline osa natukene praktilisemaks. Kirjeldatakse kuidas Charm++ programm käivitatakse ja kuidas kulgeb selle käivitusprotsess. Lihtsate näidete abil demonstreeritakse, kuidas programmeerija ei pea teadma tervet käitussüsteemi, vaid piisab teadmisest, kuidas luua objekte, mida saab ümber migreerida. Lisana on välja toodud kaks programmi: C keeles kirjutatud maatriksite korrutamine (MPI liidese demonstratsioon) ja C++ keeles kirjutatud maatriksite korrutamine (Charm++ raamistiku demonstratsioon). Mõlemad programmid kasutavad sama algoritmi paralleelselt arvutamiseks ja mõlemad on kirjutatud mitteblokeeruvaid funktsioone kasutades. Samuti on lisana esitatud õpetused, kuidas paigaldada vastav keskkond ja neid programme paralleelselt käivitada.
The aim of this bachelor thesis is to give and overview of parallel programming and what does running programs in parallel mean. Today most of the parallel programs are written in MPI, but that does not mean that there does not exist another parallel programming models. This work gives short overview of another great parallel programming framework which is Charm++. Charm++ is an object oriented parallel programming framework written in C++. Basically this document is divided into theoretical and practical part. In theoretical part there are described common parallel programming problems and solutions in both models – MPI and Charm++. There is also practical part of this document and it consists of programs written in C (for MPI) and in C++ (for Charm++). Also included the tutorials how to set up Charm++ and MPI environments on Linux (tested with Ubuntu). In the first chapter there is described that parallel programming is divided into data parallelism and task parallelism. All the giving examples and programs use mainly data parallelism. As mentioned in first paragraph the best way to solve matrix multiplication is to divide the first matrix to set of rows and the second matrix to columns. Now every processor will have only one row and column to multiply and in the end all the calculated results are collected together. The second chapter is about Charm++ and its structure. It is important to know all the concepts before programming and this bachelor thesis describes all of those main categories of objects. Charm++ consists of five major disjoint categories of objects: 1. Sequential objects 2. Chares 3. Chare groups 4. Chare arrays 5. messages Third chapter describes how to write Charm++ code and how to compile it that the Charm++ Runtime System does most of the job. In this chapter there is also mentioned what are the differences between C++ code and Charm++ code. All the needed functions are described to program a matrix multiplication. Also those programs are in the end of this work.

Description

Keywords

Citation