Oddiy siklni parallellashtirish
Yuqori darajadagi tushunchalar yetarli: oddiy siklni parallel ravishda bajarishni ko'rsatadigan oddiy parallel dasturni ko'rib chiqamiz. 2.1-misolni ko'rib chiqing: ko'paytirish-qo'shish yoki ko'pincha deyilganidek, sakso qolli sikl (" bir aniqlikdagi a*x plus y; uchun). Haqiqiy py da y o'zgaruvchisi massivdir, lekin soddalik uchun bu yerda y faqat skalyar o'zgaruvchi sifatida berilgan.
Saxyga o’xshash xalqaga namuna
subroutine saxpy(z, a, x, y, n)
integer i, n
real z(n), a, x(n), y
do i = 1, n
z(i) = a * x(i) + y
enddo
return
end
2.1-misoldagi sikl hech qanday bog'liqlikka ega emas. Boshqacha qilib aytganda, bitta siklni takrorlash natijasi boshqa iteratsiya natijasiga bog'liq emas. Bu shuni anglatadiki, ikki xil iteratsiya bir vaqtning o'zida ikkita turli protsessor tomonidan bajarilishi mumkin. 2.2-misolda ko'rsatilganidek, parallel do konstruktsiyasi yordamida bu siklni parallellashtiramiz .
Saxpyga o'xshash halqa OpenMP yordamida parallellashtirilganda.
subroutine saxpy(z, a, x, y, n)
integer i, n
real z(n), a, x(n), y
!$omp parallel do
do i = 1, n
z(i) = a * x(i) + y
enddo
return
end
Ko'rib turganimizdek, dastlabki dasturga yagona o'zgartirish parallel do direktivasi qo'shilishi hisoblanadi. Ushbu direktivadan so'ng do sikli konstruktsiyasi kelishi kerak va do siklining takrorlanishi bir vaqtning o'zida bir nechta bog’lanmalar bo'ylab bajarilishini bildiradi. OpenMP kompilyatori iplar to'plamini yaratishi va parallel bajarish uchun do siklining iteratsiyasini ushbu iplar bo'ylab taqsimlashi kerak. Ish vaqtining bajarilishini batafsil tavsiflashdan oldin, dastlabki ketma-ket dasturdagi minimal o'zgarishlarga e'tibor bersak. Bundan tashqari, asl dastur o'zgarishsiz qoladi. OpenMP bo'lmagan kompilyator yordamida kompilyatsiya qilinganda, parallel do direktivasi shunchaki e'tiborga olinmaydi va dastur ketma-ket va to'g'ri ishlashda davom etadi.
|