Openmp

OpenMP ( Open Multi-Processing ) er en åben standard til parallelisering af programmer i C , C++ og Fortran . Giver en beskrivelse af et sæt kompileringsdirektiver , biblioteksprocedurer og miljøvariabler , der er beregnet til programmering af flertrådede applikationermultiprocessorsystemer med delt hukommelse .

Standardens specifikationer er udviklet af non-profit organisationen OpenMP Architecture Review Board (ARB) [1] , som omfatter alle større processorproducenter, samt en række supercomputing-laboratorier og universiteter. Den første version af specifikationen blev udgivet i 1997, kun beregnet til Fortran, året efter udkom en version til C og C++.

OpenMP implementerer parallel computing ved hjælp af multithreading , hvor mastertråden opretter et sæt slavetråde , og opgaven fordeles mellem  dem . Tråde formodes at køre parallelt på en maskine med flere processorer (antallet af processorer behøver ikke være større end eller lig med antallet af tråde).

De opgaver, der udføres af tråde parallelt, såvel som de data, der kræves for at udføre disse opgaver, er beskrevet ved hjælp af særlige direktiver fra præprocessoren af ​​det tilsvarende sprog - "pragmas". For eksempel er en sektion af Fortran-kode, der skal udføres af flere tråde, som hver har sin egen kopi af variablen N, foranstillet af følgende direktiv:!$OMP PARALLEL PRIVATE(N)

Antallet af oprettede tråde kan reguleres både af programmet selv ved at kalde biblioteksprocedurer og udefra ved at bruge miljøvariabler.

Nøgleelementer i standarden:

Eksempler

Et Fortran-77-program, der opretter et hidtil ukendt antal tråde (det bestemmes af en miljøvariabel OMP_NUM_THREADSfør programmet startes), som hver udskriver en hilsen sammen med sit eget nummer; den indledende tråd (nummereret 0) udskriver også det samlede antal tråde, men først efter at alle har "bestået" direktivet BARRIER:

PROGRAM HEJ INTEGER ID , NTHRDS INTEGER OMP_GET_THREAD_NUM , OMP_GET_NUM_THREADS C $ OMP PARALLEL PRIVATE ( ID ) ID = OMP_GET_THREAD_NUM ( ) UDSKRIV * , ' HEJ VERDEN FRA THREAD ' , ID C $ IF OMP . _ _ _ _ , 'DER ER' , NTHRDS , 'THREADS' END IF C$OMP END PARALLEL END

C-program, der tilføjer ti tråde array a-to-array b(kompileret med gcc-4.4 og senere med -fopenmp flaget ):

#include <stdio.h> #include <omp.h> #define N 100 int main ( int argc , char * argv []) { dobbelt a [ N ], b [ N ], c [ N ]; int i ; omp_set_dynamic ( 0 ); // forhindrer openmp-biblioteket i at ændre antallet af tråde under udførelse omp_set_num_threads ( 10 ); // sæt antallet af tråde til 10 // initialiser arrays for ( i = 0 ; i < N ; i ++ ) { a [ i ] = i * 1,0 ; b [ i ] = i * 2,0 ; } // beregn summen af ​​arrays #pragma omp parallel for shared(a, b, c) private(i) for ( i = 0 ; i < N ; i ++ ) c [ i ] = a [ i ] + b [ i ]; printf ( "%f \n " , c [ 10 ]); returnere 0 ; }

Implementeringer

OpenMP understøttes af mange moderne compilere.

Sun Studio-kompilere understøtter OpenMP 2.5-specifikationen [2] med understøttelse af Solaris -operativsystemet ; Linux- support planlagt til næste udgivelse[ angiv ] . Disse kompilatorer opretter en separat procedure fra kildekoden, der er placeret under direktivet parallel, og i stedet for selve direktivet indsætter de et kald til __mt_MasterFunction_biblioteksproceduren libmtskog giver den adressen på en kunstigt oprettet. Således kan delte ( delte ) data videregives sidst ved reference, og egne ( private ) erklæres i denne procedure, idet de er uafhængige af deres kopier i andre tråde. Proceduren __mt_MasterFunction_opretter en gruppe af tråde (nummer 9 i C-eksemplet ovenfor), der vil udføre koden for konstruktionen parallel, og tråden, der kaldte den, bliver hovedtråden i gruppen. Derefter organiserer hovedtråden arbejdet med slavetrådene, hvorefter den begynder at udføre selve brugerkoden. Når koden er færdig, kalder hovedtråden en rutine _mt_EndOfTask_Barrier_, der synkroniserer den med de andre.

Visual C++ 2005 og 2008 understøtter OpenMP 2.0 i Professional og Team System-udgaver, 2010 i Professional, Premium og Ultimate-udgaver, 2012 i alle udgaver [3] .

GCC 4.2 har introduceret OpenMP-understøttelse for C, C++ og Fortran (baseret på gfortran ), og nogle distributioner (såsom Fedora Core 5) har inkluderet understøttelse i GCC 4.1. Clang og LLVM 3.7 understøtter OpenMP 3.1 . [4] .

Intel C++ Compiler , Intel Fortran Compiler og Intel Parallel Studio understøtter OpenMP version 3.0 samt Intel Cluster OpenMP til distribueret hukommelsesprogrammering. Der er også implementeringer i IBM XL compiler, PGI (Portland group), Pathscale, HP compilere[ angiv ] .

Se også

Noter

  1. OpenMP Architecture Review Board officielle hjemmeside (downlink) . Dato for adgang: 15. januar 2008. Arkiveret fra originalen 20. juli 2008. 
  2. 1. Introduktion til OpenMP API (Sun Studio 12: OpenMP API User's Guide) - Sun Microsystems
  3. Visual C++ Editions . Dato for adgang: 15. januar 2008. Arkiveret fra originalen 23. april 2008.
  4. OpenMP.org » Blogarkiv » Clang 3.7 vil have fuld OpenMP 3.1-understøttelse . openmp.org. Hentet 3. september 2015. Arkiveret fra originalen 5. september 2015.

Links

Intel Software Network  (russisk) viva64.com  (russisk) Andre kilder