Кіріспе

OpenMP (Open Multi Processing) – C, C++ және Fortran тілдерінде көп платформалы ортақ жадты көп процессорлық бағдарламалауды қолдайтын, көптеген платформаларда, нұсқаулар жиынтығы архитектуралары мен операциялық жүйелерде, соның ішінде Solaris, AIX, FreeBSD, HP UX, Linux, macOS және Windows жүйелерінде қолданылатын бағдарламалау интерфейсі (API). Ол компилятор директиваларының жиынтығынан, кітапхана функцияларынан және орындалу уақытына әсер ететін орта айнымалыларынан тұрады. OpenMP коммерциялық емес технология консорциумы OpenMP Architecture Review Board (немесе OpenMP ARB) арқылы басқарылады, оны жетекші компьютерлік жабдықтар мен бағдарламалық қамтамасыз ету өндірушілерінің кең спектрі бірлесіп анықтайды, соның ішінде Arm, AMD, IBM, Intel, Cray, HP, Fujitsu, Nvidia, NEC, Red Hat, Texas Instruments және Oracle Corporation. OpenMP-ді MPI-ге аудару және ортақ жадысы жоқ жүйелер үшін OpenMP-ді кеңейту мақсатында әзірленген.

Дизайн

OpenMP – көп жіптілік жүзеге асыру, параллельдеу әдісі, онда негізгі жіп (бір-бірінен тізбектеп орындалатын нұсқаулар тізбегі) белгілі бір санға бағынышты жіптерді бөліп шығарады және жүйе тапсырманы олардың арасына бөледі. Содан кейін жіптер бір уақытта орындалады, ал орындалу ортасы жіптерді әртүрлі процессорларға тағайындайды. Параллель орындалуға тиіс код бөлігі тиісінше компилятор директивасымен белгіленеді, ол бөлім орындалғанға дейін жіптерді құрайды. 3.0 нұсқасы 2008 жылдың мамырында жарияланды. 3.0 нұсқасындағы жаңа мүмкіндіктерге тапсырмалар және тапсырма құрылымы ұғымдары кіреді, бұл OpenMP 2.0-ның көп бөлігін құраған параллель цикл құрылымдарынан тыс OpenMP-нің ауқымын кеңейтеді. 4.0 нұсқасы 2013 жылдың шілдесінде жарияланды. Ол келесі мүмкіндіктерді қосады немесе жақсартады: үдеткіштерді қолдау; атомдық операциялар; қателерді өңдеу; жіптердің процессорға байланыстылығы; тапсырма кеңейтімдері; пайдаланушы анықтаған қысқарту; SIMD қолдауы; Fortran 2003 қолдауы. Қазіргі нұсқасы – 5.2, ол 2021 жылдың қараша айында жарияланды. 6.0 нұсқасы 2024 жылы жариялануға жоспарланған. Барлық компиляторлардың (және операциялық жүйелердің) соңғы нұсқалардың толық мүмкіндіктерін қолдамайтынын ескеріңіз.

Негізгі элементтер

OpenMP негізгі элементтері – жіптерді құру, жұмыс жүктемесін тарату (жұмысты бөлісу), дерек ортасын басқару, жіптерді синхрондау, пайдаланушы деңгейіндегі орындалу уақыты және орта айнымалылары болып табылады. C/C++ тілінде OpenMP #pragma директиваларын пайдаланады. OpenMP-ге тән прагмалар төменде тізімделген.

Қоршаған ортаның айнымалылары

OpenMP қолданбаларының орындалу мүмкіндіктерін өзгерту әдісі. Циклдардың қайталану кестесін, жіптердің бастапқы санын және т.б. басқару үшін пайдаланылады. Мысалы, OMP NUM THREADS қолданба үшін жіптер санын көрсетуге қолданылады.

Орындау күтулері

OpenMP-ді N процессорлық платформада қолданып, параллельдеу арқылы бағдарламаны іске қосқанда N есе жылдамдыққа қол жеткізуді күтуге болады. Дегенмен, мына себептерге байланысты мұндай жағдай сирек кездеседі: егер тәуелділік болса, процесс өзіне қажетті деректер есептелгенше күтуге мәжбүр. Егер бірнеше процесс параллель емес ортақ ресурс (мысалы, жазуға арналған файл) бөліссе, олардың сұраныстары тізбектей орындалады. Сондықтан, әрбір жіп басқа жіп ресурсты босатқанша күтуі керек. Бағдарламаның үлкен бөлігі OpenMP арқылы параллельдеуге келмейді, демек жылдамдықтың теориялық жоғарғы шегі Амдал заңымен шектеледі. Симметриялық көппроцессорлық (SMP) жүйедегі N процессордың есептеу қуаты N есеге артуы мүмкін, бірақ жад өткізгіштігі әдетте N есеге ұлғая қоймайды. Көбінесе бастапқы жад жолы бірнеше процессорлармен ортақ пайдаланылады және олар ортақ жад өткізгіштігі үшін бәсекелескенде өнімділіктің төмендеуі байқалуы мүмкін. Параллель есептеудегі соңғы жылдамдыққа әсер ететін көптеген басқа да мәселелер OpenMP-ге де қатысты, мысалы, жүктемені бөлу және синхронизация шығындары. OpenMP-ні шақырғанда компилятордың оптимизациясы тиімді болмауы мүмкін. Бұл жиі жағдайда OpenMP белгісізсіз компиляцияланған сол кодтан баяу жұмыс істейтін OpenMP бағдарламасына әкелуі мүмкін (ол толығымен тізбектей болады).

Сызық афинитеті

Кейбір өндірушілер OpenMP жіптерін нақты процессорлық ядролармен байланыстыру үшін процессорлық байланыстыруды (processor affinity) орнатуды ұсынады. Бұл жіптердің ядролар арасында көшірілуін және контексттік ауысу шығындарын азайтады. Сондай-ақ, деректердің локалдығын жақсартады және ядролар (немесе процессорлар) арасындағы кэш сәйкестігі трафигін төмендетеді.