13.1. Parallel va ketma-ket sohalar
Dastur ishga tushirilganda yagona oqim-master yoki "asosiy" oqim paydo boʻladi, bu dasturni birinchi operatordan boshlaydi. Asosiy oqim va faqat u barcha ketma-ket dastur sohalarini bajaradi. Parallel sohaga kirganda, qoʻshimcha oqimlar paydo boʻladi.
parallel direktivasi. Parallel soha parallel direktiva yordamida aniqlanadi (parallel ... end parallel).
С dasturlash tilida:
#pragma omp parallel [opsiya[[,]opsiya]...]
Opsiyalar oʻrnida quyidagilar ishlatilishi mumkin:
• if (shart) - shart boʻyicha parallel hududning bajarilishi. Parallel hududga kirish faqat ma’lum bir shart bajarilganda amalga oshiriladi. Agar shart bajarilmasa, direktiva ishlamaydi va dastur avvalgi rejimda ishlashni davom ettiradi;
• num_threads (butun ifoda) - parallel hududni bajaradigan oqimlar sonini aniq belgilash; sukut boʻyicha, omp_set_num_threads() funksiyasi bilan oʻrnatilgan oxirgi qiymat yoki OMP_NUM_THREADS oʻzgaruvchining qiymati tanlanadi;
• default(private|firstprivate|shared|none)- sinfi aniq belgilanmagan parallel hududdagi barcha oʻzgaruvchilarga mos ravishda private, firstprivate yoki shared klasslari belgilanadi; none parallel hududdagi barcha oʻzgaruvchilarga aniq sinf tayinlanishi kerakligini bildiradi; C dasturlash tilida faqat shared yoki none variantlari ishlatiladi;
• private(roʻyxat) - har bir oqimda mahalliy nusxalari hosil qilinadigan oʻzgaruvchilar roʻyxatini belgilaydi; roʻyxatdagi mahalliy oʻzgaruvchilar nusxalarining boshlangʻich qiymati aniqlanmagan;
• firstprivate (roʻyxat) - har bir oqimda mahalliy nusxa hosil qilinadigan oʻzgaruvchilar roʻyxatini belgilaydi; oʻzgaruvchilarning mahalliy nusxalari ushbu oʻzgaruvchilarning qiymatlari bilan asosiy ipda ishga tushiriladi;
• shared (roʻyxat) - barcha oqimlar uchun umumiy oʻzgaruvchilar roʻyxatini belgilaydi;
• copyin (roʻyxat) - threadprivate deb e’lon qilingan oʻzgaruvchilar roʻyxatini belgilaydi, ular parallel hududga kirishda oqim-masterda mos keladigan oʻzgaruvchilar qiymatlari bilan initsializatsiya qilinadi;
• reduction(operator:roʻyxat) - operator va umumiy oʻzgaruvchilar roʻyxatini belgilaydi; har bir oqimda har bir oʻzgaruvchi uchun mahalliy nusxalar yaratiladi; mahalliy nusxalar operator turiga mos ravishda inisializatsiya qilinadi (additiv operatsiyalar uchun - 0 yoki uning analoglari, multiplikativ operatsiyalar uchun - 1 yoki uning analoglari); koʻrsatilgan operator parallel hududning barcha operatorlari bajarilgandan soʻng oʻzgaruvchilarning mahalliy nusxalari ustida bajariladi; operator: C tili uchun - +, *, -,&, |, ^, &&, ||; operatorlarni bajarish tartibi aniqlanmagan, shuning uchun natija har ishga tushirishda farq qilishi mumkin.
Parallel sohaga kirishda yangi OMP_NUM_THREADS-1 oqimlar paydo boʻladi, har bir oqim oʻzining noyob raqamini oladi va asosiy oqim 0 raqamini oladi va guruhning asosiy oqimiga ("master") aylanadi. Qolgan oqimlar 1 dan OMP_NUM_THREADS-1 gacha butun sonlarni raqam sifatida qabul qiladi. Berilgan parallel sohani bajaruvchi oqimlar soni ular sohadan chiqmaguncha oʻzgarishsiz qoladi. Parallel sohani tark etganda, yashirin sinxronizatsiya amalga oshiriladi va asosiydan tashqari barcha oqimlar yoʻq qilinadi.
Barcha ochilgan oqimlar parallel sohaga mos keladigan bir xil kodni bajaradi. SMP tizimida oqimlar turli protsessorlar boʻylab taqsimlanadi deb taxmin qilinadi (ammo bu odatda operatsion tizimning boshqaruvida boʻladi).
1-misol parallel direktivasining ishlatilishini koʻrsatadi. Bu kodni bajarish natijasida asosiy oqim "Ketma-ket maydon 1" matnini chop etadi, keyin parallel direktivasi boʻyicha yangi oqimlar paydo boʻladi, ularning har biri "Parallel maydon" matnini chop etadi, soʻngra ochilgan oqimlar tugatiladi va asosiy oqim-master "Ketma-ket maydon 2" matnini chop etadi.
1-misol. С tilida parallel soha bilan ishlash.
Do'stlaringiz bilan baham: |