OpenMP - OpenMP

OpenMP
OpenMP -logo
Alkuperäinen kirjoittaja OpenMP Architecture Review Board
Kehittäjä (t) OpenMP Architecture Review Board
Vakaa julkaisu
5.1 / 13. marraskuuta 2020 ; 9 kuukautta sitten ( 2020-11-13 )
Käyttöjärjestelmä Monialustainen
Alusta Monialustainen
Tyyppi Laajennus C , C ++ ja Fortran ; API
Lisenssi Eri
Verkkosivusto openmp .org

OpenMP ( Open Multi-Processing ) on ohjelmointirajapinta (API), joka tukee monen alustan jaetun muistin multiprosessointiväyläarkkitehtuurilla ohjelmointi C , C ++ , ja Fortran , monilla alustoilla, opetus-sarja arkkitehtuurit ja käyttöjärjestelmissä , kuten Solaris , AIX , HP-UX , Linux , macOS ja Windows . Se koostuu joukosta kääntäjäohjeita , kirjastorutiinit ja ympäristömuuttujat, jotka vaikuttavat ajon aikana.

OpenMP hallinnoi voittoa tavoittelematon teknologia konsortio OpenMP Arkkitehtuuri Review Board (tai OpenMP ARB ), yhteisesti määritelty laaja väylä johtava tietokoneen laitteiston ja ohjelmiston valmistajien, kuten Arm , AMD , IBM , Intel , Cray , HP , Fujitsu , Nvidia , NEC , Red Hat , Texas Instruments ja Oracle Corporation .

OpenMP käyttää kannettavaa , skaalautuva malli, joka antaa ohjelmoijille yksinkertainen ja joustava käyttöliittymä kehittää rinnakkain sovelluksia alustoille vaihtelevat standardin pöytätietokoneen että supertietokoneen .

Hakemuksen rakennettu hybridi malli rinnakkain ohjelmointia voidaan ajaa klusteri käyttäen sekä OpenMP ja Message Passing Interface (MPI), siten, että OpenMP käytetään rinnakkaisuuden sisällä (monivuotinen-core) solmu, kun MPI käytetään yhdensuuntaisuuden välillä solmujen . On myös pyritty käyttämään OpenMP: tä ohjelmistoja jaetuissa jaetuissa muistijärjestelmissä , kääntämään OpenMP MPI: ksi ja laajentamaan OpenMP: tä muille kuin jaetuille muistijärjestelmille.

Design

Esimerkki monisäikeisyydestä, jossa ensisijainen säie haarautuu pois lukuisista säikeistä, jotka suorittavat koodilohkoja rinnakkain.

OpenMP on toteutuksen monisäikeisyyden , menetelmä parallelizing jolloin ensisijaisen kierteen (käskyjen sarja suoritetaan peräkkäin) haarukat määrätyn määrän osa -threads ja järjestelmä jakaa tehtävän joukossa. Säikeet suoritetaan sitten samanaikaisesti , ja ajonaikainen ympäristö jakaa säikeet eri prosessoreille.

Koodin osa, joka on tarkoitettu toimimaan rinnakkain, on merkitty vastaavasti kääntäjädirektiivillä, joka saa säikeet muodostumaan ennen osion suorittamista. Jokaiseen säikeeseen on liitetty tunnus , joka voidaan saada käyttämällä funktiota (nimeltään omp_get_thread_num()). Säikeen tunnus on kokonaisluku ja ensisijaisen säikeen tunnus on 0 . Rinnakkaiskoodin suorittamisen jälkeen säikeet yhdistyvät takaisin ensisijaiseksi säikeeksi, joka jatkuu edelleen ohjelman loppuun.

Oletuksena jokainen säie suorittaa rinnakkaisen koodiosan itsenäisesti. Työnjakorakenteita voidaan käyttää tehtävän jakamiseen säikeiden kesken siten, että jokainen säie suorittaa sille varatun osan koodista. Sekä tehtävien rinnakkaisuus että tietojen rinnakkaisuus voidaan saavuttaa käyttämällä OpenMP: tä tällä tavalla.

Ajonaikainen ympäristö jakaa säikeet prosessoreille käytön, koneen kuormituksen ja muiden tekijöiden mukaan. Ajonaikainen ympäristö voi määrittää säikeiden määrän ympäristömuuttujien perusteella tai koodi voi tehdä sen käyttämällä toimintoja. OpenMP toiminnot sisältyvät otsikkotiedosto leimatun omp.h in C / C ++ .

Historia

OpenMP Architecture Review Board (ARB) julkaisi ensimmäisen API -spesifikaationsa OpenMP for Fortran 1.0 lokakuussa 1997. Seuraavan vuoden lokakuussa he julkaisivat C/C ++ -standardin. Vuonna 2000 Fortran -määritysten versio 2.0 ja C/C ++ -määritysten versio 2.0 julkaistiin vuonna 2002. Versio 2.5 on yhdistetty C/C ++/Fortran -määritys, joka julkaistiin vuonna 2005.

Versioon 2.0 saakka OpenMP määritti ensisijaisesti tapoja rinnastaa erittäin säännölliset silmukat, kuten ne tapahtuvat matriisisuuntautuneessa numeerisessa ohjelmoinnissa , jossa silmukan iteraatioiden lukumäärä tiedetään syöttöhetkellä. Tämä tunnistettiin rajoitukseksi, ja toteutuksiin lisättiin erilaisia ​​tehtävien rinnakkaisia ​​laajennuksia. Vuonna 2005 pyrittiin standardoimaan tehtävien rinnakkaisuus, joka julkaisi vuonna 2007 ehdotuksen, joka sai inspiraatiota Cilkin , X10: n ja Chapelin tehtävien rinnakkaisuudesta .

Versio 3.0 julkaistiin toukokuussa 2008. 3.0: n uusiin ominaisuuksiin sisältyy tehtävien käsite ja tehtävärakenne , mikä laajentaa merkittävästi OpenMP: n laajuutta rinnakkaissilmukkarakenteiden ulkopuolelle, jotka muodostivat suurimman osan OpenMP 2.0: sta.

Eritelmän versio 4.0 julkaistiin heinäkuussa 2013. Se lisää tai parantaa seuraavia ominaisuuksia: kiihdyttimien tuki ; atomiikka ; virheiden käsittely; langan affiniteetti ; tehtävien laajennukset; käyttäjän määrittämä vähennys ; SIMD -tuki; Fortran 2003 -tuki.

Nykyinen versio on 5.1, julkaistu marraskuussa 2020.

Huomaa, että kaikki kääntäjät (ja käyttöjärjestelmät) eivät tue kaikkia uusimman version ominaisuuksia.

Keskeiset elementit

Kaavio OpenMP -rakenteista

OpenMP: n ydinelementtejä ovat rakenteet säikeiden luomiseen, työmäärän jakamiseen (työnjako), dataympäristön hallinta, säikeiden synkronointi, käyttäjätason ajonaikaiset rutiinit ja ympäristömuuttujat.

C/C ++: ssa OpenMP käyttää #pragmaa . OpenMP -käytännöt on lueteltu alla.

Langan luominen

Pragma omp -suuntausta käytetään haarukoimaan lisäkierteitä rakenteen sisältämien töiden suorittamiseksi rinnakkain. Kuvan alkuperäinen langan se merkitään master lanka , jossa on kierre ID 0.

Esimerkki (C -ohjelma): Näytä "Hei, maailma". käyttämällä useita säikeitä.

#include <stdio.h>
#include <omp.h>

int main(void)
{
    #pragma omp parallel
    printf("Hello, world.\n");
    return 0;
}

Käytä lippua -fopenmp kääntääksesi GCC: n avulla:

$ gcc -fopenmp hello.c -o hello

Tulos tietokoneessa, jossa on kaksi ydintä ja siten kaksi säiettä:

Hello, world.
Hello, world.

Tulos voi kuitenkin myös olla sekava, koska kilpailuolosuhteet johtuvat kahdesta langasta, jotka jakavat vakiotuloksen .

Hello, wHello, woorld.
rld.

(Onko printflangankestävä, riippuu toteutuksesta. C ++ std::coutsen sijaan on aina langaturvallinen.)

Työnjakorakenteet

Käytetään määrittämään itsenäisen työn määrittäminen yhdelle tai kaikille säikeille.

  • omp for tai omp do : käytetään silmukan iteraatioiden jakamiseen säikeiden kesken, joita kutsutaan myös silmukkarakenteiksi.
  • osiot : peräkkäisten mutta riippumattomien koodilohkojen määrittäminen eri säikeille
  • single : kun määritetään koodilohko, joka suoritetaan vain yhdellä säikeellä, lopuksi esitetään este
  • isäntä : samanlainen kuin yksittäinen, mutta koodilohko suoritetaan vain isäntälangalla, eikä lopulta ole esteitä.

Esimerkki: alustaa suuren matriisin arvon rinnakkain käyttämällä jokaista säiettä osan työstä

int main(int argc, char **argv)
{
    int a[100000];

    #pragma omp parallel for
    for (int i = 0; i < 100000; i++) {
        a[i] = 2 * i;
    }

    return 0;
}

Tämä esimerkki on kiusallisen rinnakkainen ja riippuu vain i : n arvosta . OpenMP rinnakkain lipun kertoo OpenMP järjestelmä voi jakaa tähän tehtävään keskuudesta työkierteistä. Jokainen säie saa yksilöllisen ja yksityisen version muuttujasta. Esimerkiksi kahdella työntekijälangalla yhdelle säikeelle voidaan antaa i -versio, joka kestää 0–49999, kun taas toinen saa version, joka on 50000–999999.

Vaihtoehtoiset direktiivit

Vaihtoehtoiset direktiivit on yksi OpenMP 5.0 -määrityksen tärkeimmistä ominaisuuksista, joiden avulla ohjelmoijat voivat parantaa suorituskyvyn siirrettävyyttä. Ne mahdollistavat OpenMP -käytännön ja käyttäjäkoodin mukauttamisen käännöshetkellä. Määritelmä määrittelee piirteet, jotka kuvaavat toteutuksen tarjoamia aktiivisia OpenMP-rakenteita, suorituslaitteita ja toiminnallisuutta, piirteisiin ja käyttäjän määrittämiin ehtoihin perustuvia kontekstivalitsimia sekä metadirektiivin ja ilmoittavat, että käyttäjät voivat ohjelmoida saman koodialueen muunnosdirektiiveillä .

  • Metadirective on suoritettava direktiivi, ehdollisesti päättää toiseen direktiiviin käännöksen yhteydessä valitsemalla useista direktiivistä variantit perustuu piirteet, jotka määrittelevät OpenMP kunnossa tai yhteydessä.
  • Toteaa variantti direktiivi on samanlaisia toimintoja kuin metadirective mutta valitsee toiminnon variantti puhelun-sivusto, joka perustuu yhteydessä tai käyttäjän määrittämä olosuhteissa.

Kahden varianttidirektiivin tarjoama mekanismi varianttien valitsemiseksi on helpompi käyttää kuin C/C ++ -esikäsittely, koska se tukee suoraan varianttien valintaa OpenMP: ssä ja mahdollistaa OpenMP -kääntäjän analysoida ja määrittää lopullisen direktiivin varianttien ja kontekstin perusteella.

// code adaptation using preprocessing directives

int v1[N], v2[N], v3[N];
#if defined(nvptx)     
 #pragma omp target teams distribute parallel loop map(to:v1,v2) map(from:v3)
  for (int i= 0; i< N; i++) 
     v3[i] = v1[i] * v2[i];  
#else 
 #pragma omp target parallel loop map(to:v1,v2) map(from:v3)
  for (int i= 0; i< N; i++) 
     v3[i] = v1[i] * v2[i];  
#endif


// code adaptation using metadirective in OpenMP 5.0

int v1[N], v2[N], v3[N];
#pragma omp target map(to:v1,v2) map(from:v3)
  #pragma omp metadirective \
     when(device={arch(nvptx)}: target teams distribute parallel loop)\
     default(target parallel loop)
  for (int i= 0; i< N; i++) 
     v3[i] = v1[i] * v2[i];

Lausekkeet

Koska OpenMP on jaetun muistin ohjelmointimalli, useimmat OpenMP -koodin muuttujat näkyvät oletuksena kaikille säikeille. Mutta joskus yksityiset muuttujat ovat välttämättömiä kilpailuolosuhteiden välttämiseksi, ja arvot on siirrettävä peräkkäisen osan ja rinnakkaisalueen (rinnakkain suoritettava koodilohko) välillä, joten tietoympäristön hallinta otetaan käyttöön tietojen jakamisen attribuuttilausekkeina liittämällä ne OpenMP -direktiivi. Erilaisia ​​lausekkeita ovat:

Tietojen jakamisen attribuuttilausekkeet
  • jaettu : rinnakkaisalueen ulkopuolelta ilmoitetut tiedot jaetaan, mikä tarkoittaa, että kaikki säikeet voivat nähdä ja käyttää niitä samanaikaisesti. Oletuksena kaikki työnjakoalueen muuttujat jaetaan lukuun ottamatta silmukan iterointilaskuria.
  • yksityinen : rinnakkaisalueella ilmoitetut tiedot ovat yksityisiä jokaiselle säikeelle, mikä tarkoittaa, että jokaisella säikeellä on paikallinen kopio ja sitä käytetään väliaikaisena muuttujana. Yksityistä muuttujaa ei alusteta eikä arvoa ylläpidetä käytettäväksi rinnakkaisalueen ulkopuolella. Oletuksena OpenMP -silmukkarakenteiden silmukka iterointilaskurit ovat yksityisiä.
  • oletusarvo : mahdollistaa ohjelmoija todetaan, että oletus tietoa rajauksen sisällä rinnakkain alueella on joko jaettu tai ei yhtään C / C ++, tai jaettu , firstprivate , yksityinen , tai ei mitään Fortran. Ei mitään -vaihtoehto pakottaa ohjelmoijan ilmoittamaan jokaisen muuttujan rinnakkaisalueelta tietojen jakamisen attribuuttilausekkeiden avulla.
  • firstprivate : kuten yksityinen paitsi alustettu alkuperäiseen arvoon.
  • lastprivate : kuten yksityinen paitsi alkuperäinen arvo päivitetään rakentamisen jälkeen.
  • pienennys : turvallinen tapa yhdistää töitä kaikista kierteistä rakentamisen jälkeen.
Synkronointilausekkeet
  • kriittinen : oheinen koodilohko suoritetaan vain yhdellä säikeellä kerrallaan, eikä sitä suoriteta samanaikaisesti useilla säikeillä. Sitä käytetään usein jaettujen tietojen suojaamiseen kilpailuolosuhteilta .
  • atomic : muistin päivitys (kirjoita tai lue-muokkaa-kirjoita) seuraavassa ohjeessa suoritetaan atomisesti. Se ei tee koko lausunnosta atomista; vain muistin päivitys on atomi. Kääntäjä saattaa käyttää erityisiä laitteisto -ohjeita paremman suorituskyvyn saavuttamiseksi kuin käytettäessä kriittistä .
  • järjestetty : strukturoitu lohko suoritetaan siinä järjestyksessä, jossa iteraatiot suoritettaisiin peräkkäisessä silmukassa
  • este : jokainen säie odottaa, kunnes kaikki muut ryhmän säikeet ovat saavuttaneet tämän pisteen. Työnjakorakenteessa on implisiittinen esteiden synkronointi lopussa.
  • nowait : määrittää, että säikeet, jotka suorittavat määrätyn työn, voivat jatkaa odottamatta ryhmän kaikkien säikeiden valmistumista. Tämän lausekkeen puuttuessa säikeet kohtaavat esteiden synkronoinnin työnjakorakenteen lopussa.
Ajoituslausekkeet
  • aikataulu (tyyppi, pala) : Tästä on hyötyä, jos työnjakorakenne on do-loop tai for-loop. Työnjakorakenteen iteraatiot osoitetaan säikeille tämän lausekkeen määrittämän ajoitusmenetelmän mukaisesti. Kolme aikataulutyyppiä ovat:
  1. staattinen : Täällä kaikki säikeet allokoidaan iteraatioille ennen kuin ne suorittavat silmukka -iteroinnit. Iteraatiot on oletusarvoisesti jaettu säikeiden kesken tasaisesti. Kokonaisluvun määrittäminen parametrille chunk varaa kuitenkin tiettyjen säikeiden vierekkäisten iteraatioiden kappalemäärän.
  2. dynaaminen : Tässä osa iteraatioista on varattu pienemmälle määrälle säikeitä. Kun tietty säie on päättänyt sille varatun iteraation, se palaa hakemaan toisen ketjun jäljellä olevista iteraatioista. Parametri pala määrittelee määrä peräkkäisiä iteraatioita, jotka osoitetaan langan kerrallaan.
  3. ohjattu : Suuri osa vierekkäisistä iteraatioista varataan jokaiselle säikeelle dynaamisesti (kuten yllä). Palan koko pienenee eksponentiaalisesti jokaisen peräkkäisen jako minimikoko määritetty parametri palan
JOS ohjaus
  • jos : Tämä saa säikeet rinnastamaan tehtävän vain, jos ehto täyttyy. Muussa tapauksessa koodilohko suoritetaan sarjassa.
Alustus
  • firstprivate : tiedot ovat yksityisiä jokaiselle säikeelle, mutta alustetaan käyttämällä muuttujan arvoa käyttäen samaa nimeä pääsäikeestä.
  • lastprivate : tiedot ovat yksityisiä jokaiselle säikeelle. Tämän yksityisen datan arvo kopioidaan globaaliin muuttujaan, joka käyttää samaa nimeä rinnakkaisalueen ulkopuolella, jos nykyinen iterointi on rinnakkaispiirin viimeinen iterointi. Muuttuja voi olla sekä firstprivate ja lastprivate .
  • threadprivate : Tiedot ovat maailmanlaajuisia tietoja, mutta ne ovat yksityisiä kullakin rinnakkaisalueella ajon aikana. Langan ja yksityisen välinen ero on threadprivate -järjestelmään liittyvä maailmanlaajuinen laajuus ja rinnakkaisten alueiden säilytetty arvo.
Tietojen kopiointi
  • copyin : samanlainen firstprivate varten oma muuttujia, threadprivate muuttujia ei alustettu, ellei käyttäen copyin siirtää arvon vastaava globaalien muuttujien. Ei copyout on tarpeen, koska arvon threadprivate muuttuja säilyy koko suorituksen koko ohjelman.
  • copyprivate : käytetään yksittäisten kanssa, jotta voidaan tukea tietoarvojen kopiointia yhden säikeen ( yksittäisen säikeen) yksityisistä objekteista vastaaviin objekteihin ryhmän muissa säikeissä.
Vähennys
  • pienennys (operaattori | sisäinen: luettelo) : muuttujalla on paikallinen kopio jokaisessa säikeessä, mutta paikallisten kopioiden arvot tiivistetään (pienennetään) globaaliksi jaetuksi muuttujaksi. Tämä on erittäin hyödyllistä, jos tietty toiminto (määritetty operaattorissa tälle lausekkeelle) muuttujalla suoritetaan iteratiivisesti, joten sen arvo tietyllä iteraatiolla riippuu sen arvosta aikaisemmassa iteraatiossa. Operatiiviseen lisäykseen johtavat vaiheet rinnastetaan, mutta säikeet päivittävät globaalin muuttujan säieturvallisella tavalla. Tätä vaaditaan rinnastettaessa toimintojen ja differentiaaliyhtälöiden numeerista integrointia yleisenä esimerkkinä.
Muut
  • flush : Tämän muuttujan arvo palautetaan rekisteristä muistiin tämän arvon käyttämiseksi rinnakkaisen osan ulkopuolella
  • master : Suorittaa vain päälanka (säie, joka haarautui pois kaikista muista OpenMP -direktiivin suorittamisen aikana). Ei implisiittistä estettä; muita tiimin jäseniä (säikeitä) ei tarvita.

Käyttäjätason ajonaikaiset rutiinit

Käytetään säikeiden lukumäärän muokkaamiseen/tarkistamiseen, sen havaitsemiseen, onko suorituskonteksti rinnakkaisalueella, kuinka monta prosessoria nykyisessä järjestelmässä, lukituksen asettaminen/poistaminen, ajoitustoiminnot jne.

Ympäristömuuttujat

Menetelmä OpenMP -sovellusten suoritusominaisuuksien muuttamiseksi. Käytetään silmukka iteraatioiden ajoituksen, säikeiden oletusmäärän jne. Hallintaan . Esimerkiksi OMP_NUM_THREADS käytetään määrittämään sovelluksen säikeiden määrä.

Toteutukset

OpenMP on toteutettu monissa kaupallisissa kääntäjissä. Esimerkiksi Visual C ++ 2005, 2008, 2010, 2012 ja 2013 tukevat sitä (OpenMP 2.0, Professional-, Team System-, Premium- ja Ultimate -versioissa) sekä Intel Parallel Studio eri prosessoreille. Oracle Solaris Studion kääntäjät ja työkalut tukevat uusimpia OpenMP -määrityksiä ja tuottavuuden parannuksia Solaris -käyttöjärjestelmille (UltraSPARC ja x86/x64) ja Linux -alustoille. Portland -konsernin Fortran-, C- ja C ++ -kääntäjät tukevat myös OpenMP 2.5: tä. GCC on myös tukenut OpenMP: tä versiosta 4.2 lähtien.

Kääntäjät, jotka toteuttavat OpenMP 3.0: n:

  • GCC 4.3.1
  • Mercurium -kääntäjä
  • Intel Fortran- ja C/C ++ -versiot 11.0 ja 11.1, Intel C/C ++ ja Fortran Composer XE 2011 sekä Intel Parallel Studio.
  • IBM XL -kääntäjä
  • Sun Studio 12 -päivitys 1 sisältää OpenMP 3.0: n täyden toteutuksen
  • Moniprosessorilaskenta ( "MPC") .)

Useat kääntäjät tukevat OpenMP 3.1: tä:

  • GCC 4.7
  • Intel Fortran- ja C/C ++ -kääntäjät 12.1
  • IBM XL C/C ++ -kääntäjät AIX: lle ja Linuxille, V13.1 ja IBM XL Fortran -kääntäjät AIX: lle ja Linuxille, V14.1
  • LLVM/Clang 3.7
  • Absoft Fortran Compilers v. 19 Windowsille, Mac OS X: lle ja Linuxille

Kääntäjät, jotka tukevat OpenMP 4.0: ta:

  • GCC 4.9.0 C/C ++: lle, GCC 4.9.1 Fortranille
  • Intel Fortran- ja C/C ++ -kääntäjät 15.0
  • IBM XL C/C ++ Linuxille, V13.1 (osittain) ja XL Fortran Linuxille, V15.1 (osittain)
  • LLVM/Clang 3.7 (osittainen)

Useita kääntäjiä, jotka tukevat OpenMP 4.5: tä:

  • GCC 6 C/C ++: lle
  • Intel Fortran- ja C/C ++ -kääntäjät 17.0, 18.0, 19.0
  • LLVM/Clang 12

Osittainen tuki OpenMP 5.0: lle:

  • GCC 9 C/C ++: lle
  • Intel Fortran- ja C/C ++ -kääntäjät 19.1
  • LLVM/Clang 12

Automaattisesti rinnakkaiset kääntäjät, jotka tuottavat OpenMP-direktiivien mukaisen lähdekoodin:

Useat profiilit ja virheenkorjaajat tukevat nimenomaan OpenMP: tä:

Hyvät ja huonot puolet

Plussat:

  • Kannettava monisäikeinen koodi (C/C ++: lla ja muilla kielillä on tyypillisesti kutsuttava alustakohtaiset primitiivit, jotta saadaan monisäikeinen).
  • Yksinkertainen: sinun ei tarvitse käsitellä viestien välittämistä kuten MPI .
  • Tietojen asettelu ja hajoaminen käsitellään automaattisesti direktiiveillä.
  • Skaalautuvuus verrattavissa MPI : hen jaetun muistin järjestelmissä.
  • Inkrementaalinen rinnakkaisuus: voi toimia yhdessä ohjelman osassa kerrallaan, koodin dramaattisia muutoksia ei tarvita.
  • Yhtenäinen koodi sekä sarja- että rinnakkaissovelluksille: OpenMP -rakenteita käsitellään kommentteina, kun käytetään peräkkäisiä kääntäjiä.
  • Alkuperäisiä (sarja) koodilausekkeita ei yleensä tarvitse muuttaa, kun ne rinnastetaan OpenMP: hen. Tämä vähentää mahdollisuutta vahingossa lisätä bugeja.
  • Sekä karkearakeinen että hienorakeinen rinnakkaisuus ovat mahdollisia.
  • Epäsäännöllisissä monifysiikan sovelluksissa, jotka eivät noudata pelkästään SPMD- laskentatapaa, kuten tiiviisti kytketyissä nestehiukkasjärjestelmissä , OpenMP: n joustavuus voi olla suuri suorituskykyetu MPI: hen nähden .
  • Voidaan käyttää eri kiihdyttimissä, kuten GPGPU ja FPGA .

Haittoja:

  • Vaara vaikeiden virheenkorjausten synkronointivirheiden ja kilpa -olosuhteiden käyttöönotosta .
  • Vuodesta 2017 lähtien se toimii tehokkaasti vain jaetun muistin moniprosessorialustoilla (katso kuitenkin Intelin Cluster OpenMP ja muut jaetut muistialustat ).
  • Edellyttää kääntäjää, joka tukee OpenMP: tä.
  • Muistiarkkitehtuuri rajoittaa skaalautuvuutta.
  • Ei tukea vertailuun ja vaihtoon .
  • Luotettava virheiden käsittely puuttuu.
  • Puuttuu hienorakeisia mekanismeja lankaprosessorin kartoituksen ohjaamiseen.
  • Suuri mahdollisuus kirjoittaa vahingossa vääriä jakokoodeja .

Suorituskykyodotukset

Voidaan odottaa saavan N -kertaisen nopeuden, kun suoritetaan OpenMP -ohjelmaa rinnakkaistettu ohjelma N -prosessorialustalla. Tämä tapahtuu kuitenkin harvoin seuraavista syistä:

  • Kun riippuvuus on olemassa, prosessin on odotettava, kunnes tiedot, joista se riippuu, lasketaan.
  • Kun useat prosessit jakavat ei-rinnakkaisen todistusresurssin (kuten kirjoitettavan tiedoston), niiden pyynnöt suoritetaan peräkkäin. Siksi jokaisen säikeen on odotettava, kunnes toinen säie vapauttaa resurssin.
  • OpenMP ei voi rinnastaa suurta osaa ohjelmasta, mikä tarkoittaa, että nopeuden teoreettinen yläraja on rajoitettu Amdahlin lain mukaan .
  • Symmetrisen moniprosessorin (SMP) prosessoreilla voi olla N -kertainen laskentateho, mutta muistin kaistanleveys ei yleensä skaalaudu N -kertaiseksi. Usein useat prosessorit jakavat alkuperäisen muistireitin ja suorituskyvyn heikkeneminen voi ilmetä, kun he kilpailevat jaetun muistin kaistanleveydestä.
  • Monet muut yleiset ongelmat, jotka vaikuttavat rinnakkaislaskennan lopulliseen nopeutukseen, koskevat myös OpenMP: tä, kuten kuormituksen tasaus ja synkronointi.
  • Kääntäjän optimointi ei välttämättä ole yhtä tehokasta OpenMP: tä kutsuttaessa. Tämä voi yleensä johtaa siihen, että yksisäikeinen OpenMP-ohjelma toimii hitaammin kuin sama koodi, joka on koottu ilman OpenMP-lippua (joka on täysin sarjaliikenne).

Langan affiniteetti

Jotkut toimittajat suosittelevat prosessorin affiniteetin asettamista OpenMP -säikeille, jotta ne voidaan liittää tiettyihin suoritinytimiin. Tämä minimoi säikeiden siirtymisen ja kontekstinvaihtokustannukset ytimien välillä. Se parantaa myös datapalvelua ja vähentää ytimien (tai prosessorien) välimuistin yhtenäisyysliikennettä.

Vertailuarvot

Erilaisia ​​vertailuarvoja on kehitetty osoittamaan OpenMP: n käyttöä, testaamaan sen suorituskykyä ja arvioimaan oikeellisuutta.

Yksinkertaisia ​​esimerkkejä

Suorituskyvyn vertailuarvoja ovat:

Oikeuden vertailuarvoja ovat:

Katso myös

Viitteet

Lue lisää

Ulkoiset linkit