OpenMP (Open Multi-Processing) — це набір директив компілятора, бібліотечних процедур та змінних середовища, які призначені для програмування багатопоточних застосунків на багатопроцесорних системах із спільною пам'яттю на мовах C, та Fortran.
Тип | прикладний програмний інтерфейс |
---|---|
Автор | OpenMP Architecture Review Board |
Розробник | OpenMP Architecture Review Board |
Стабільний випуск | 4.0 (23 липня 2013 ) |
Платформа | крос-платформовий |
Операційна система | крос-платформовий |
Мова програмування | C, , Fortran |
Ліцензія | різні |
Вебсайт | openmp.org |
|
Розробку специфікації OpenMP ведуть кілька великих виробників обчислювальної техніки та програмного забезпечення, робота яких регулюється некомерційною організацією, названою OpenMP Architecture Review Board (ARB). Детальна специфікація OpenMP міститься на сторінці [ 24 квітня 2008 у Wayback Machine.]. Специфікації для мов Fortran і C/C++ з'явилися відповідно в жовтні 1997 року і жовтні 1998 року.
Опис
OpenMP можна розглядати як високорівневу надбудову над Pthreads (або аналогічними бібліотеками потоків). POSIX-інтерфейс для організації потоків Pthreads підтримується широко (практично на всіх UNIX-системах), проте з багатьох причин не підходить для практичного паралельного програмування:
- немає підтримки Fortran
- дуже низький рівень
- немає підтримки паралелізму за даними
- механізм потоків спочатку розроблявся не для цілей організації паралелізму
OpenMP реалізує паралельні обчислення за допомогою багатопотоковості, в якій «головний» (master) потік створює набір підлеглих (slave) потоків і завдання розподіляється між ними. Передбачається, що потоки виконуються паралельно на машині з декількома процесорами (кількість процесорів не обов'язково має бути більше або дорівнювати кількості потоків).
Завдання, що виконуються потоками паралельно, так само як і дані, необхідні для виконання цих завдань, описуються за допомогою спеціальних директив препроцесора відповідної мови — прагм. Наприклад, ділянка коду на мові Fortran, яка повинна виконуватися кількома потоками, кожна з яких має свою копію змінної N, передує наступній !$OMP PARALLEL PRIVATE(N)
Кількість створюваних потоків може регулюватися як самою програмою за допомогою виклику бібліотечних процедур, так і ззовні, за допомогою змінних оточення.
Переваги
- За рахунок ідеї «інкрементального розпаралелювання» OpenMP ідеально підходить для розробників, що прагнуть швидко розпаралелювати свої обчислювальні програми з великими паралельними циклами. Розробник не створює нову паралельну програму, а просто послідовно додає в текст програми OpenMP-директиви.
- При цьому, OpenMP — досить гнучкий механізм, що надає розробникові великі можливості контролю над поведінкою паралельної програми.
- Передбачається, що OpenMP-програма на однопроцесорній платформі може бути використана як послідовна програма, тобто немає необхідності підтримувати послідовну та паралельну версії. Директиви OpenMP просто ігноруються послідовним компілятором, а для виклику процедур OpenMP можуть бути підставлені заглушки (stubs), текст яких приведений в специфікаціях.
- Однією з переваг OpenMP розробники вважають підтримку так званих «orphan» (відірваних) директив, тобто директиви синхронізації і розподілу роботи можуть не входити безпосередньо в лексичний контекст паралельної області.
Ключові елементи
Ключовими елементами OpenMP є
- конструкції для створення потоків (директива parallel),
- конструкції розподілу роботи між потоками (директиви DO / for та section),
- конструкції для керування роботою з даними (вираз shared і private),
- конструкції для синхронізації потоків (директиви critical atomic і barrier),
- процедури бібліотеки підтримки часу виконанню (наприклад, omp_get_thread_num),
- змінні оточення (наприклад, OMP_NUM_THREADS).
Приклади програм
Нижче наведені приклади програм з використанням директив OpenMP:
C
У цій програмі два вектора (a і b) додаються паралельно десятьма потоками.
#include <stdio.h> #include <omp.h> #define N 100 int main(int argc, char *argv[]) { float a[N], b[N], c[N]; int i; omp_set_dynamic(0); // заборонити змінювати число потоків за допомогою змінної оточення omp_set_num_threads(10); // встановити число потоків у 10 // ініціалізуємо вектори for (i = 0; i < N; i++) { a[i] = i * 1.0; b[i] = i * 2.0; } // обчислюємо суму векторів #pragma omp parallel shared(a, b, c) private(i) { #pragma omp for for (i = 0; i < N; i++) c[i] = a[i] + b[i]; } printf ("%f\n", c[10]); return 0; }
Fortran
Аналогічна програма на мові Фортран
program main use omp_lib implicit none integer, parameter :: rp = kind(1.0) integer, parameter :: N=100 real(rp), dimension(1:N) :: a,b,c integer :: i call omp_set_dynamic(.false.) ! заборонити змінювати число нитей за допомогою змінної оточення call omp_set_num_threads(10) ! встановити число нитей у 10 ! ініціалізуємо вектори do i=1,N a(i)=i*1.0_rp b(i)=i*2.0_rp enddo ! обчислюємо суму векторів !$omp parallel do shared(a, b, c) private(i) do i=1,N c(i)=a(i)+b(i) enddo !$omp end parallel do write(*,'(f10.6)') c(10) end program main
Існуючі реалізації
OpenMP підтримується багатьма комерційними компіляторами.
Компілятори Oracle Solaris Studio, v12.3, підтримують офіційно специфікацію OpenMP 3.1 — з покращеною продуктивністю під ОС Solaris та обмеженим числом платформ під ОС Linux
Visual C++ 2005 підтримує OpenMP у редакціях Professional і Team System.
GCC 4.2 підтримує OpenMP 2.5, а деякі дистрибутиви (такі як Fedora Core 5 gcc [ 20 травня 2007 у Wayback Machine.]) включили підтримку в свої версії GCC 4.1. Починаючи з GCC 4.4 підтримується стандарт OpenMP 3.0 а з версії GCC 4.7 — OpenMP 3.1
В універсальному комплексі від Intel об'єднано компілятори C++ та Фортран, бібліотеки оптимізації та паралелізації, включаючи OpenMP 3.1 (починаючи з версії компіляторів 12.1), а також засоби перевірки помилок та продуктивності, зневаджувач і профайлер для останніх поколінь багатоядерних процесорів.
Приклад реалізації
Компілятори Sun Studio створюють окрему процедуру з вихідного коду, розташованого під директивою parallel, а замість самої директиви вставляють виклик процедури __mt_MasterFunction_ бібліотеки libmtsk, передаючи їй адресу штучно створену. Таким чином, розподілювані (shared) дані можуть бути передані останній за посиланням, а власні (private) оголошуються всередині цієї процедури, опиняючись незалежні від своїх копій в інших нитях.
Процедура __mt_MasterFunction_ створює групу нитей (кількістю 9 у наведеному вище прикладі на мові C), які будуть виконувати код конструкції parallel, а нить, що викликала їх, стає головною у групі. Потім головна нить організовує роботу підлеглих нитей, після чого починає виконувати код користувача сама. Коли код буде виконаний, головна нить викликає процедуру _mt_EndOfTask_Barrier_ що синхронізує її з іншими.
Інструменти
- VivaMP — Статичний аналізатор Сі/Сі++ коду для виявлення помилок в програмах, побудованих на технології OpenMP для ОС Windows.
Примітки
- http://openmp.org/wp/about-openmp/ [ 9 серпня 2013 у Wayback Machine.] About the OpenMP ARB and OpenMP.org
- http://openmp.org/wp/2013/07/openmp-40/ [ 23 серпня 2013 у Wayback Machine.] OpenMP 4.0 Specification Released
- http://openmp.org/wp/openmp-compilers/ [ 17 липня 2013 у Wayback Machine.] OpenMP Compilers
- . Архів оригіналу за 20 липня 2008. Процитовано 3 червня 2009.
- (PDF). Архів оригіналу (PDF) за 16 травня 2013. Процитовано 3 вересня 2012.
- . Архів оригіналу за 23 квітня 2008. Процитовано 3 червня 2009.
- . Архів оригіналу за 17 вересня 2012. Процитовано 3 вересня 2012.
Посилання
- OpenMP.org — Офіційний сайт OpenMP Architecture Review Board [ 30 грудня 2014 у Wayback Machine.]
- Что такое OpenMP? [ 1 лютого 2008 у Wayback Machine.] (рос.)
- Введение в OpenMP: API параллельных программ для многопроцессорных систем с общей памятью [ 10 листопада 2007 у Wayback Machine.] (рос.)
- OpenMP и C++ [ 17 січня 2009 у Wayback Machine.] (рос.)
- Учебный курс — Параллельное программирование с использованием OpenMP [ 20 квітня 2008 у Wayback Machine.] (рос.)
- OpenMP Support in Sun Studio Compilers and Tools [ 26 жовтня 2007 у Wayback Machine.] (англ.)
- Статья «32 подводных камня OpenMP при программировании на Си++» (рос.)
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Було запропоновано статтю Синхронізація в OpenMP до цієї статті або розділу, але, можливо, це варто додатково . Пропозиція з червня 2017. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
OpenMP Open Multi Processing ce nabir direktiv kompilyatora bibliotechnih procedur ta zminnih seredovisha yaki priznacheni dlya programuvannya bagatopotochnih zastosunkiv na bagatoprocesornih sistemah iz spilnoyu pam yattyu na movah C C ta Fortran OpenMPTip prikladnij programnij interfejsAvtor OpenMP Architecture Review BoardRozrobnik OpenMP Architecture Review BoardStabilnij vipusk 4 0 23 lipnya 2013 10 rokiv tomu 2013 07 23 Platforma kros platformovijOperacijna sistema kros platformovijMova programuvannya C C FortranLicenziya rizniVebsajt openmp org Mediafajli u Vikishovishi Rozrobku specifikaciyi OpenMP vedut kilka velikih virobnikiv obchislyuvalnoyi tehniki ta programnogo zabezpechennya robota yakih regulyuyetsya nekomercijnoyu organizaciyeyu nazvanoyu OpenMP Architecture Review Board ARB Detalna specifikaciya OpenMP mistitsya na storinci 24 kvitnya 2008 u Wayback Machine Specifikaciyi dlya mov Fortran i C C z yavilisya vidpovidno v zhovtni 1997 roku i zhovtni 1998 roku OpisOpenMP mozhna rozglyadati yak visokorivnevu nadbudovu nad Pthreads abo analogichnimi bibliotekami potokiv POSIX interfejs dlya organizaciyi potokiv Pthreads pidtrimuyetsya shiroko praktichno na vsih UNIX sistemah prote z bagatoh prichin ne pidhodit dlya praktichnogo paralelnogo programuvannya nemaye pidtrimki Fortran duzhe nizkij riven nemaye pidtrimki paralelizmu za danimi mehanizm potokiv spochatku rozroblyavsya ne dlya cilej organizaciyi paralelizmu OpenMP realizuye paralelni obchislennya za dopomogoyu bagatopotokovosti v yakij golovnij master potik stvoryuye nabir pidleglih slave potokiv i zavdannya rozpodilyayetsya mizh nimi Peredbachayetsya sho potoki vikonuyutsya paralelno na mashini z dekilkoma procesorami kilkist procesoriv ne obov yazkovo maye buti bilshe abo dorivnyuvati kilkosti potokiv Zavdannya sho vikonuyutsya potokami paralelno tak samo yak i dani neobhidni dlya vikonannya cih zavdan opisuyutsya za dopomogoyu specialnih direktiv preprocesora vidpovidnoyi movi pragm Napriklad dilyanka kodu na movi Fortran yaka povinna vikonuvatisya kilkoma potokami kozhna z yakih maye svoyu kopiyu zminnoyi N pereduye nastupnij OMP PARALLEL PRIVATE N Kilkist stvoryuvanih potokiv mozhe regulyuvatisya yak samoyu programoyu za dopomogoyu vikliku bibliotechnih procedur tak i zzovni za dopomogoyu zminnih otochennya Perevagi Za rahunok ideyi inkrementalnogo rozparalelyuvannya OpenMP idealno pidhodit dlya rozrobnikiv sho pragnut shvidko rozparalelyuvati svoyi obchislyuvalni programi z velikimi paralelnimi ciklami Rozrobnik ne stvoryuye novu paralelnu programu a prosto poslidovno dodaye v tekst programi OpenMP direktivi Pri comu OpenMP dosit gnuchkij mehanizm sho nadaye rozrobnikovi veliki mozhlivosti kontrolyu nad povedinkoyu paralelnoyi programi Peredbachayetsya sho OpenMP programa na odnoprocesornij platformi mozhe buti vikoristana yak poslidovna programa tobto nemaye neobhidnosti pidtrimuvati poslidovnu ta paralelnu versiyi Direktivi OpenMP prosto ignoruyutsya poslidovnim kompilyatorom a dlya vikliku procedur OpenMP mozhut buti pidstavleni zaglushki stubs tekst yakih privedenij v specifikaciyah Odniyeyu z perevag OpenMP rozrobniki vvazhayut pidtrimku tak zvanih orphan vidirvanih direktiv tobto direktivi sinhronizaciyi i rozpodilu roboti mozhut ne vhoditi bezposeredno v leksichnij kontekst paralelnoyi oblasti Klyuchovi elementiKlyuchovimi elementami OpenMP ye konstrukciyi dlya stvorennya potokiv direktiva parallel konstrukciyi rozpodilu roboti mizh potokami direktivi DO for ta section konstrukciyi dlya keruvannya robotoyu z danimi viraz shared i private konstrukciyi dlya sinhronizaciyi potokiv direktivi critical atomic i barrier proceduri biblioteki pidtrimki chasu vikonannyu napriklad omp get thread num zminni otochennya napriklad OMP NUM THREADS Prikladi programNizhche navedeni prikladi program z vikoristannyam direktiv OpenMP C U cij programi dva vektora a i b dodayutsya paralelno desyatma potokami include lt stdio h gt include lt omp h gt define N 100 int main int argc char argv float a N b N c N int i omp set dynamic 0 zaboroniti zminyuvati chislo potokiv za dopomogoyu zminnoyi otochennya omp set num threads 10 vstanoviti chislo potokiv u 10 inicializuyemo vektori for i 0 i lt N i a i i 1 0 b i i 2 0 obchislyuyemo sumu vektoriv pragma omp parallel shared a b c private i pragma omp for for i 0 i lt N i c i a i b i printf f n c 10 return 0 Fortran Analogichna programa na movi Fortran program main use omp lib implicit none integer parameter rp kind 1 0 integer parameter N 100 real rp dimension 1 N a b c integer i call omp set dynamic false zaboroniti zminyuvati chislo nitej za dopomogoyu zminnoyi otochennya call omp set num threads 10 vstanoviti chislo nitej u 10 inicializuyemo vektori do i 1 N a i i 1 0 rp b i i 2 0 rp enddo obchislyuyemo sumu vektoriv omp parallel do shared a b c private i do i 1 N c i a i b i enddo omp end parallel do write f10 6 c 10 end program mainIsnuyuchi realizaciyiOpenMP pidtrimuyetsya bagatma komercijnimi kompilyatorami Kompilyatori Oracle Solaris Studio v12 3 pidtrimuyut oficijno specifikaciyu OpenMP 3 1 z pokrashenoyu produktivnistyu pid OS Solaris ta obmezhenim chislom platform pid OS Linux Visual C 2005 pidtrimuye OpenMP u redakciyah Professional i Team System GCC 4 2 pidtrimuye OpenMP 2 5 a deyaki distributivi taki yak Fedora Core 5 gcc 20 travnya 2007 u Wayback Machine vklyuchili pidtrimku v svoyi versiyi GCC 4 1 Pochinayuchi z GCC 4 4 pidtrimuyetsya standart OpenMP 3 0 a z versiyi GCC 4 7 OpenMP 3 1 V universalnomu kompleksi vid Intel ob yednano kompilyatori C ta Fortran biblioteki optimizaciyi ta paralelizaciyi vklyuchayuchi OpenMP 3 1 pochinayuchi z versiyi kompilyatoriv 12 1 a takozh zasobi perevirki pomilok ta produktivnosti znevadzhuvach i profajler dlya ostannih pokolin bagatoyadernih procesoriv Priklad realizaciyiKompilyatori Sun Studio stvoryuyut okremu proceduru z vihidnogo kodu roztashovanogo pid direktivoyu parallel a zamist samoyi direktivi vstavlyayut viklik proceduri mt MasterFunction biblioteki libmtsk peredayuchi yij adresu shtuchno stvorenu Takim chinom rozpodilyuvani shared dani mozhut buti peredani ostannij za posilannyam a vlasni private ogoloshuyutsya vseredini ciyeyi proceduri opinyayuchis nezalezhni vid svoyih kopij v inshih nityah Procedura mt MasterFunction stvoryuye grupu nitej kilkistyu 9 u navedenomu vishe prikladi na movi C yaki budut vikonuvati kod konstrukciyi parallel a nit sho viklikala yih staye golovnoyu u grupi Potim golovna nit organizovuye robotu pidleglih nitej pislya chogo pochinaye vikonuvati kod koristuvacha sama Koli kod bude vikonanij golovna nit viklikaye proceduru mt EndOfTask Barrier sho sinhronizuye yiyi z inshimi InstrumentiVivaMP Statichnij analizator Si Si kodu dlya viyavlennya pomilok v programah pobudovanih na tehnologiyi OpenMP dlya OS Windows Primitkihttp openmp org wp about openmp 9 serpnya 2013 u Wayback Machine About the OpenMP ARB and OpenMP org http openmp org wp 2013 07 openmp 40 23 serpnya 2013 u Wayback Machine OpenMP 4 0 Specification Released http openmp org wp openmp compilers 17 lipnya 2013 u Wayback Machine OpenMP Compilers Arhiv originalu za 20 lipnya 2008 Procitovano 3 chervnya 2009 PDF Arhiv originalu PDF za 16 travnya 2013 Procitovano 3 veresnya 2012 Arhiv originalu za 23 kvitnya 2008 Procitovano 3 chervnya 2009 Arhiv originalu za 17 veresnya 2012 Procitovano 3 veresnya 2012 PosilannyaOpenMP org Oficijnij sajt OpenMP Architecture Review Board 30 grudnya 2014 u Wayback Machine Chto takoe OpenMP 1 lyutogo 2008 u Wayback Machine ros Vvedenie v OpenMP API parallelnyh programm dlya mnogoprocessornyh sistem s obshej pamyatyu 10 listopada 2007 u Wayback Machine ros OpenMP i C 17 sichnya 2009 u Wayback Machine ros Uchebnyj kurs Parallelnoe programmirovanie s ispolzovaniem OpenMP 20 kvitnya 2008 u Wayback Machine ros OpenMP Support in Sun Studio Compilers and Tools 26 zhovtnya 2007 u Wayback Machine angl Statya 32 podvodnyh kamnya OpenMP pri programmirovanii na Si ros Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi Bulo zaproponovano priyednati stattyu Sinhronizaciya v OpenMP do ciyeyi statti abo rozdilu ale mozhlivo ce varto dodatkovo obgovoriti Propoziciya z chervnya 2017