Openmp

OpenMP ( Open Multi-Processing ) on ​​avoin standardi C- , C ++- ja Fortran - ohjelmien rinnakkaisuudelle . Antaa kuvauksen joukosta kääntäjäkäskyjä , kirjastoproseduureja ja ympäristömuuttujia , jotka on tarkoitettu monisäikeisten sovellusten ohjelmointiin moniprosessorijärjestelmissä, joissa on jaettu muisti .

Standardin määrittelyn on kehittänyt voittoa tavoittelematon OpenMP Architecture Review Board (ARB) [1] , johon kuuluvat kaikki suuret prosessorivalmistajat sekä joukko supertietokonelaboratorioita ja yliopistoja. Ensimmäinen versio spesifikaatiosta julkaistiin vuonna 1997, tarkoitettu vain Fortranille, seuraavana vuonna julkaistiin versio C- ja C++-versioille.

OpenMP toteuttaa rinnakkaislaskennan monisäikeistyksen avulla , jossa pääsäie luo joukon orjasäikeitä ja tehtävä jaetaan niiden kesken  . Säikeiden oletetaan kulkevan rinnakkain koneessa, jossa on useita prosessoreita (prosessorien lukumäärän ei tarvitse olla suurempi tai yhtä suuri kuin säikeiden lukumäärä).

Säikeiden rinnakkain suorittamat tehtävät sekä näiden tehtävien suorittamiseen tarvittavat tiedot on kuvattu käyttämällä vastaavan kielen esiprosessorin erityisiä direktiivejä - "pragma". Esimerkiksi Fortran-koodin osaa, joka on suoritettava useilla säikeillä, joista jokaisella on oma kopio muuttujasta N, edeltää seuraava käsky:!$OMP PARALLEL PRIVATE(N)

Luotujen säikeiden määrää voidaan säädellä sekä itse ohjelmalla kutsumalla kirjastoproseduureja että ulkopuolelta käyttämällä ympäristömuuttujia.

Standardin keskeiset elementit:

Esimerkkejä

Fortran-77-ohjelma, joka luo aiemmin tuntemattoman määrän säikeitä (sen määrittää ympäristömuuttuja OMP_NUM_THREADSennen ohjelman käynnistämistä), joista jokainen tulostaa tervehdyksen oman numeronsa kanssa; johtava säie (numeroitu 0) tulostaa myös säikeiden kokonaismäärän, mutta vasta sen jälkeen, kun ne kaikki ovat "läpäisseet" käskyn BARRIER:

OHJELMAN HELLO INTEGER ID , NTHRDS INTEGER OMP_GET_THREAD_NUM , OMP_GET_NUM_THREADS C $ OMP RINNAKKAISET YKSITYISKOHTAINEN ( ID ) ID = OMP_GET_THREAD_NUM ( ) PRINT * , ' HELLO WORLD FROM THREAD ' ( ) * BRINTER ID 0 . _ _ _ _ , 'THERE ARE' , NTHRDS , 'KÄYT' LOPPU IF C$OMP END RINNAKKAISET LOPPU

C-ohjelma, joka lisää kymmenen säiettä array a-to-array b(käännetty gcc-4.4:llä ja myöhemmin -fopenmp -lipulla ):

#include <stdio.h> #include <omp.h> #define N 100 int main ( int argc , char * argv []) { kaksinkertainen a [ N ], b [ N ], c [ N ]; int i ; omp_set_dynamic ( 0 ); // estää openmp-kirjastoa muuttamasta säikeiden määrää suorituksen aikana omp_set_num_threads ( 10 ); // aseta säikeiden lukumääräksi 10 // alusta taulukot kohteelle ( i = 0 ; i < N ; i ++ ) { a [ i ] = i * 1,0 ; b [ i ] = i * 2,0 ; } // laskee taulukoiden summa #pragma omp rinnakkaiselle jaetulle(a, b, c) private(i) arvolle ( i = 0 ; i < N ; i ++ ) c [ i ] = a [ i ] + b [ i ]; printf ( "%f \n " , c [ 10 ]); paluu 0 ; }

Toteutukset

Monet nykyaikaiset kääntäjät tukevat OpenMP:tä.

Sun Studion kääntäjät tukevat OpenMP 2.5 -spesifikaatiota [2] ja tukevat Solaris -käyttöjärjestelmää ; Linux - tuki on suunniteltu seuraavaan julkaisuun[ määritä ] . Nämä kääntäjät luovat erillisen proseduurin direktiivin alla olevasta lähdekoodista parallelja lisäävät itse direktiivin sijaan kutsun __mt_MasterFunction_kirjastoproseduuriin libmtskvälittäen sille keinotekoisesti luodun osoitteen. Siten jaetut ( jaettu ) data voidaan välittää viimeisenä viittauksella, ja omat ( yksityiset ) ilmoitetaan tämän menettelyn sisällä, jotka ovat riippumattomia niiden kopioista muissa säikeissä. Proseduuri __mt_MasterFunction_luo lankaryhmän (numero 9 yllä olevassa C-esimerkissä), joka suorittaa rakenteen koodin parallel, ja sitä kutsuneesta säikeestä tulee ryhmän pääsäike. Sitten pääsäike järjestää orjasäikeiden työn, minkä jälkeen se alkaa suorittaa itse käyttäjäkoodia. Kun koodi on valmis, pääsäie kutsuu rutiinia _mt_EndOfTask_Barrier_, joka synkronoi sen muiden kanssa.

Visual C++ 2005 ja 2008 tukevat OpenMP 2.0:aa Professional- ja Team System -versioissa, 2010 Professional-, Premium- ja Ultimate-versioissa, 2012 kaikissa versioissa [3] .

GCC 4.2 on ottanut käyttöön OpenMP-tuen C:lle, C++:lle ja Fortranille (perustuu gfortranille ), ja jotkin jakelut (kuten Fedora Core 5) ovat sisällyttäneet tuen GCC 4.1:een. Clang ja LLVM 3.7 tukevat OpenMP 3.1:tä . [4] .

Intel C++ Compiler , Intel Fortran Compiler ja Intel Parallel Studio tukevat OpenMP-versiota 3.0 sekä Intel Cluster OpenMP:tä hajautetun muistin ohjelmointiin. Toteutuksia on myös IBM XL -kääntäjässä, PGI:ssä (Portland-ryhmä), Pathscalessa, HP-kääntäjässä[ määritä ] .

Katso myös

Muistiinpanot

  1. OpenMP Architecture Review Boardin virallinen verkkosivusto (downlink) . Käyttöpäivä: 15. tammikuuta 2008. Arkistoitu alkuperäisestä 20. heinäkuuta 2008. 
  2. 1. OpenMP API:n esittely (Sun Studio 12: OpenMP API User's Guide) - Sun Microsystems
  3. Visual C++ -versiot . Käyttöpäivä: 15. tammikuuta 2008. Arkistoitu alkuperäisestä 23. huhtikuuta 2008.
  4. OpenMP.org » Blogiarkisto » Clang 3.7:ssä on täysi OpenMP 3.1 -tuki . openmp.org. Haettu 3. syyskuuta 2015. Arkistoitu alkuperäisestä 5. syyskuuta 2015.

Linkit

Intel Software Network  (Venäjä) viva64.com  (venäjä) Muut lähteet