logo

MPI bilan taqsimlangan xotirali dasturlash

Загружено в:

08.08.2023

Скачано:

0

Размер:

1028.509765625 KB
MPI bilan taqsimlangan xotirali dasturlash
3.1.1 Ishni boshlash
3.1.2 Tuzish va bajarish
3.1.3 MPI dasturlari
3.1.4 MPI Init va MPI yakunlash 1.Eslatib o'tamiz, xabarlarni uzatish dasturlarida bitta asosiy xotirada 
ishlaydigan dastur juftlik odatda jarayon deb ataladi va ikkita jarayon funksiyalarni 
chaqirish orqali muloqot qilishi mumkin: bir jarayon jo‘natish funksiyasini, ikkinchisi 
esa qabul qilish funksiyasini chaqiradi. amalga oshirish MPI deb ataladi, ya'ni
Message-Passing Interface qisqartmasi . MPI yangi dasturlash tili emas. U 
C, C++ va Fortran tillaridan chaqiriladigan funksiyalar kutubxonasini belgilaydi
dasturlari . Biz MPI ning turli xil yuborish va qabul qilish funksiyalari haqida bilib 
olamiz.
Biz ko'proq ishtirok etishi mumkin bo'lgan ba'zi "global" aloqa funktsiyalari 
haqida bilib olamiz ikkita jarayondan ko'ra . Ushbu funktsiyalar jamoaviy aloqalar deb 
ataladi . Ushbu MPI funktsiyalarining barchasini o'rganish jarayonida biz ba'zilari 
haqida ham bilib olamiz
3.1.1 Ishni boshlash
Ehtimol, ko'pchiligimiz ko'rgan birinchi dastur "salom, dunyo" ning bir varianti edi.
Kernighan va Ritchie klassik matnidagi dastur [29]:
#include < stdio.h >
int main(void) f
printf ( "salom, dunyonn ");
qaytish 0; Keling , MPI-dan biroz foydalanadigan “salom, dunyo”ga o'xshash dastur yozaylik. 
Buning o'rniga
Har bir jarayon shunchaki xabarni chop etishi uchun biz buni amalga oshirish uchun 
bitta jarayonni belgilaymiz chiqish , va boshqa jarayonlar unga xabarlarni yuboradi va u
chop etadi.
Parallel dasturlashda bu jarayonlar uchun keng tarqalgan (standart deyish mumkin).
bilan aniqlanishi kerak. Shunday qilib, agar p jarayonlar mavjud bo'lsa, jarayonlar 0 , 1, 
darajalariga ega bo'ladi . Bizning parallel "salom, dunyo" uchun keling.
jarayoni belgilangan jarayonga o'tadi va boshqa jarayonlar unga xabarlar yuboradi. 
3.1.2 Tuzish va bajarish
Dasturni kompilyatsiya qilish va ishga tushirish tafsilotlari sizning tizimingizga bog'liq, 
shuning uchun siz mahalliy mutaxassis bilan tekshirish kerak bo'lishi mumkin . Biroq, 
qachon bo'lishimiz kerakligini eslang aniq , biz dastur manbasini yozish uchun matn 
muharriridan foydalanmoqdamiz deb taxmin qilamiz va 3.1.2-dastur: Jarayonlardan salomlarni chop etuvchi MPI dasturi
uchun buyruq qatori. Ko'pgina tizimlar mpicc deb nomlangan buyruqdan foydalanadi
kompilyatsiya uchun :
$ mpicc g devor yoki mpi salom mpi salom.c
Odatda, mpicc - bu C kompilyatori uchun o'ram bo'lgan skript . O'rash skripti
uning asosiy maqsadi qandaydir dasturni ishga tushirishdir. Bunday holda, dastur
C kompilyatoridir. Biroq, o'rash kompilyatorning ishlashini soddalashtiradi
kerakli sarlavhali fayllarni qayerdan topish va qaysi kutubxonalar bilan bog'lanish 
kerakligini ayting
ob'ekt fayli. Eslatib o'tamiz, dollar belgisi ($) qobiq so'rovidir, shuning uchun uni kiritmaslik kerak. 
Shuni ham esda tutingki, uchun biz Gnu C kompilyatoridan gcc foydalanamiz deb 
taxmin qilamiz va biz har doim variantlari -g, -Wall, va -o. Qo'shimcha ma'lumot uchun
yuqoridagi bo'limga qarang.
MPI bilan taqsimlangan xotirada dasturlash
Ko'pgina tizimlar mpiexec bilan dasturni ishga tushirishni ham qo'llab-quvvatlaydi :
$ mpiexec n <jarayonlar soni> ./ mpi salom
Shunday qilib , dasturni bitta jarayon bilan ishga tushirish uchun biz yozamiz
$ mpiexec n 1 ./ mpi salom
va dasturni to'rtta jarayon bilan ishga tushirish uchun biz yozamiz
$ mpiexec n 4 ./ mpi salom
Bitta jarayon bilan dasturning chiqishi bo'ladi
0/1 jarayondan salom!
va to'rtta jarayon bilan dasturning chiqishi bo'ladi
0/4 jarayondan salom!
1/4 jarayondan salom!
2/4 jarayondan salom!
3/4 jarayondan salom!
Qanday qilib mpiexecni chaqirishdan bir yoki bir nechta salomlashishga erishamiz? The
mpiexec buyrug'i tizimga <jarayonlar soni> misollarini ishga tushirishni aytadi
bizning < mpi salom> dasturimiz. Shuningdek, u tizimga qaysi yadro har biri ishlashi 
kerakligini aytishi mumkin
dasturning namunasi . Jarayonlar bajarilgandan so'ng, MPI amalga oshiriladi
jarayonlar bir-biri bilan aloqa qilishiga ishonch hosil qilish haqida g'amxo'rlik qiladi.
Katalog protokollari yordamida kesh muvofiqligini saqlashning asosiy komponentlari 
4.3-rasmda ko'rsatilgan. Protsessorlar bilan bog'langan mahalliy keshlar mahalliyga ega 
saqlangan umumiy o'zgaruvchilarning nusxalarini yangilashni muvofiqlashtirish uchun 
kesh kontrollerlari   mahalliy keshlar. Markaziy boshqaruvchi kesh kogerentligini asosiy 
yo'lga qo'yish uchun javobgardir tizimi uchun. Umumiy xotiraning bir qismi belgilovchi
yozuvlarni saqlaydigan katalogdir har bir umumiy blokning holati. Katalogdagi har bir  yozuvning tuzilishi bog'liq foydalanilgan katalog protokolini amalga oshirish tafsilotlari
bo'yicha. Markaziy boshqaruvchi   mahalliy kesh so'rovlarini bajaradi va umumiy 
o'zgaruvchilar holatidagi har qanday o'zgarishlar haqida mahalliy kesh 
boshqaruvchilarini xabardor qilish uchun javobgardir.   X etiketli bit yangilanish 
ma'lumotlarini ( B ) har biriga tarqatish kerakligini bildiradi protsessor yoki ma'lumotlar
yo'q - translyatsiya (NB). Shakldan ko'ramizki, agar blok ko'rsatilgan yozuvga mos 
keladigan o'zgartirilsa, keyin faqat protsessorlardagi keshlar 1 va 4 bu o'zgarish haqida 
xabardor bo'lishi kerak.
3.1.3 MPI dasturlari
Keling , dasturni batafsil ko'rib chiqaylik. Kuzatish kerak bo'lgan birinchi narsa - bu C
dastur . Masalan, u stdio.h va string.h standart C sarlavha fayllarini o'z ichiga oladi .
U boshqa har qanday C dasturlari kabi asosiy funksiyaga ham ega. Biroq, juda ko'p
dasturning yangi qismlari . 3-qator mpi.h sarlavha faylini o'z ichiga oladi. Bu
MPI funksiyalarining prototiplari, so'l ta'riflar, tip ta'riflari va boshqalarni o'z ichiga 
oladi ; unda MPI dasturini tuzish uchun zarur bo'lgan barcha ta'riflar va deklaratsiyalar 
mavjud.
Kuzatish kerak bo'lgan ikkinchi narsa, MPI tomonidan belgilangan barcha 
identifikatorlar bilan boshlanadi
MPI qatori . Pastki chiziqdan keyingi birinchi harf funksiya uchun katta harf bilan 
yoziladi nomlar va MPI-belgilangan turlar. MPI bilan belgilangan makroslar va 
konstantalardagi barcha harflar katta harf bilan yozilgan, shuning uchun MPI tomonidan
nima aniqlangani va nima ekanligi haqida hech qanday savol yo'q.
foydalanuvchi dasturi tomonidan belgilanadi . Keling , dasturni batafsil ko'rib chiqaylik. Kuzatish kerak bo'lgan birinchi 
narsa - bu  dastur . Masalan, u stdio.h va string.h standart C sarlavha fayllarini o'z ichiga
oladi .
U boshqa har qanday C dasturlari kabi asosiy funksiyaga ham ega. Biroq, juda ko'p
dasturning yangi qismlari . 3-qator mpi.h sarlavha faylini o'z ichiga oladi. Bu
MPI funksiyalarining prototiplari, so'l ta'riflar, tip ta'riflari va boshqalarni o'z ichiga 
oladi  unda MPI dasturini tuzish uchun zarur bo'lgan barcha ta'riflar va deklaratsiyalar 
mavjud.
Kuzatish kerak bo'lgan ikkinchi narsa, MPI tomonidan belgilangan barcha 
identifikatorlar bilan boshlanadi
MPI qatori . Pastki chiziqdan keyingi birinchi harf funksiya uchun katta harf bilan 
yoziladi nomlar va MPI-belgilangan turlar. MPI bilan belgilangan makroslar va 
konstantalardagi barcha harflar katta harf bilan yozilgan, shuning uchun MPI tomonidan
nima aniqlangani va nima ekanligi haqida hech qanday savol yo'q.
foydalanuvchi dasturi tomonidan belgilanadi.
Vaqt 0. P0  protsessoridagi 	C0  keshi uning davomida foydalanish uchun b blokini 
yuklaydi qayta ishlash.
Vaqt 1. Ikkala kesh 	
C1  va 	C3  ham umumiy blokdan bir xil blokni yuklaydixotira. Endi 
bizda b ning uchta nusxasi bor.
Vaqt 2. Protsessor 	
P3  C3  da b nusxasini yangilaydi. Ayni paytda ma'lumotlar umumiy 
xotira va keshlar izchil emas.
Vaqt 3. 	
P3  ma'lumotlarni 	C3  va ichida qilish uchun yozish operatsiyasini bajaradi 
umumiy xotira izchilligi.
3.1.4 MPI Init va MPI yakunlash
MPI Init -ga qo'ng'iroq MPI tizimiga barcha kerakli sozlashlarni bajarishni aytadi.
Masalan, u xabar buferlari uchun xotira ajratishi mumkin va qaysi birini tanlashi 
mumkin
jarayon qaysi darajani oladi. Qoida tariqasida, boshqa MPI funksiyalari chaqirilmasligi 
kerak dastur MPI Initni chaqirishdan oldin . 
Uning sintaksisi
int MPI Init (
int , argc p   kirish  chiqish ,
char  argv p / kirish / chiqish /;
Argumentlar, argc p va argv p, main, argc va argumentlarga ishora qiladi.
argv . Biroq, dasturimiz bu dalillardan foydalanmasa, biz shunchaki o'tishimiz mumkin
Ikkalasi uchun NULL. Ko'pgina MPI funktsiyalari singari, MPI Init int xato kodini 
qaytaradi va in aksariyat hollarda biz bu xato kodlarini e'tiborsiz qoldiramiz.
30 - qatorda MPI Finalize qo'ng'irog'i MPI tizimiga biz foydalanishni tugatganimizni 
bildiradi.
MPI va MPI uchun ajratilgan har qanday resurslar ozod qilinishi mumkin. Sintaksis 
juda yaxshi oddiy :
Umuman olganda, MPI Finalize ga qo'ng'iroq qilingandan keyin hech qanday MPI 
funksiyasi chaqirilmasligi kerak .
Shunday qilib, odatiy MPI dasturi quyidagi asosiy konturga ega:
Biroq, argc va argv ga ko'rsatkichlarni o'tkazish shart emasligini allaqachon ko'rganmiz
MPI Init -ga . MPI Init va MPI Finalize ga qo'ng'iroqlar bo'lishi ham shart emas
asosiyda .   Kommunikatorlar, MPI Comm hajmi va MPI Comm darajasi
MPI - da kommunikator har biriga xabar yuborishi mumkin bo'lgan jarayonlar 
to'plamidir boshqa . MPI Initning maqsadlaridan biri quyidagilardan iborat 
kommunikatorni aniqlashdir foydalanuvchi dasturni ishga tushirganida boshlagan 
barcha jarayonlar. Ushbu kommunikator MPI COMM WORLD deb ataladi . 13 va 14-
qatorlardagi funksiya chaqiruvlari olinmoqda.
MPI COMM WORLD haqida ma'lumot . 
Ularning sintaksisi 
Umumiy o'zgaruvchida ishlaydigan har bir jarayon yoki oqim kod segmentiga ega 
muhim bo'lim , bu erda jarayon umumiy o'zgaruvchini o'zgartirish orqali ishlaydi 
qiymat. Jarayon o'zining muhim qismini bajarayotganda, boshqa hech qanday jarayon 
bo'lmaydi protsessorga o'zining muhim qismini bajarishga ruxsat beriladi. 4.6-rasmda 
ning segmenti ko'rsatilgan muhim bo'limni o'z ichiga olgan kod. Jarayon muhim bo'lim  kodiga yetganda, unga kirish va ushbu kod bo'limini faqat blokirovka olish mumkin 
bo'lgan taqdirda-gina bajarishga ruxsat beriladi.
Jarayon tanqidiy qism bilan amalga oshirilishi bilanoq, u qulfni chiqaradi va tanqidiy 
qismdan keyin kodni bajarishga davom etadi. Ikki yoki undan ortiq jarayon yetsa kritik 
bo'limda qulfni olish uchun faqat bitta jarayonga ruxsat beriladi. Boshqa barcha 
jarayonlar muhim qismning boshida kutiladi.   Ushbu past darajadagi sinxronizatsiya 
primitivlari dasturiy ta'minot tomonidan qurish uchun ishlatilishi mumkin
Qulflar, semaforlar, monitorlar va to'siqlar kabi yuqori darajadagi operatsiyalaridir.
Agar jarayon yoki Ip multiprosessorli tizimda qulf yoki to'siqni olganida ehtiyot bo'lish 
kerak. Qulfni ushlab turish jarayoni boshqa holatlarga olib kelmasligi kerak qulfni 
olishni kutayotgan jarayonlar kechiktirilmaydi. Yechimlardan biri apreemption - xavfsiz
qulflash.
Ichidagi muhim bo'limni ko'rsatadigan kod segmenti   oddiy kod.
Kritik bo'lim muammosining har qanday yechimi qulfni talab qiladi [40] . Aslida qulf
umumiy resursga kirishni ketma-ketlashtiradi, shunda faqat bitta jarayon yoki oqim 
o'qiydi va o'zgaruvchini istalgan vaqtda o'zgartiradi. Ushbu bo'limning boshida aytib 
o'tganimizdek, muhim bo'limga kirishga ruxsat berishdan oldin jarayon qulfni olishi 
kerak 4.6-rasmda ko'rsatilgan. Dasturni ishlab chiqishni soddalashtirish uchun apparatda
qulf mavjud va qayta ishlash yukining bir qismini operatsion tizimdan ko'chirish uchun.  
Muhim bo'lim bitta protsessorda umumiy o`zgaruv-chida jarayon ishlayotganida 
uzilishning oldini olish  yorda-mida ishlov berilishi mumkin. Bu yechim emas ko'p 
protses-sorli tizimda amaliy, chunki barcha protsessorlar bu haqda xabardor bo'lishi 
kerak uzilishni o'chirish. Bu xabar o'rtasida efirga uzatilayotganda vaqt behuda ketadi 
protsessorlar. 
Qulflash apparatda maxsus atom TestAndSet ()  ko'rsat-masi bilan ta'minlanadi. 
Ushbu ko'rsatma qulfning qiymatini (sinov qismi) qaytaradi va keyin uni o'rnatadi 
tugallangandan so'ng qulfning qiymati 1 ga teng. Bloklash - bu xotiradagi qiymat, unda operatsiya o'qiladi - o'zgartiriladi – yoziladi bu 
ko'rsatma yordamida atomik tarzda bajariladi. Atom TestAndSet () funktsiya apparatda 
amalga oshiriladi, ammo psevdokod quyidagicha tasvirlangan                                                  Xulosa
Eslatib o'tamiz, parallel ko'p yo'riqnoma, bir nechta ma'lumotlar yoki MIMD
dunyosi, kompyuterlar, asosan, taqsimlangan xotira va umumiy xotiraga bo'lingan. 
tizimlari . Dasturchi nuqtai nazaridan taqsimlangan xotira tizimidan iborat orqali 
ulangan yadro-xotira juftliklari to'plami va yadro bilan bog'langan xotiraga faqat shu 
yadro bevosita kirish mumkin.  Qarang. Yoniq the boshqa dasturchi nuqtai nazaridan, 
umumiy xotira tizimi global foydalanish mumkin bo'lgan xotiraga ulangan yadrolar 
to'plamidan iborat bo'lib, unda har bir yadro istalgan xotira joyiga kirish huquqiga ega ..
Ushbu bobda biz boramiz Xabarlarni uzatish yordamida taqsimlangan xotira tizimlarini 
qanday dasturlashni ko'rib chiqishni boshlang . Paralel hisoblashda biz vaqtdan ancha 
yutuq olamiz.

MPI bilan taqsimlangan xotirali dasturlash 3.1.1 Ishni boshlash 3.1.2 Tuzish va bajarish 3.1.3 MPI dasturlari 3.1.4 MPI Init va MPI yakunlash

1.Eslatib o'tamiz, xabarlarni uzatish dasturlarida bitta asosiy xotirada ishlaydigan dastur juftlik odatda jarayon deb ataladi va ikkita jarayon funksiyalarni chaqirish orqali muloqot qilishi mumkin: bir jarayon jo‘natish funksiyasini, ikkinchisi esa qabul qilish funksiyasini chaqiradi. amalga oshirish MPI deb ataladi, ya'ni Message-Passing Interface qisqartmasi . MPI yangi dasturlash tili emas. U C, C++ va Fortran tillaridan chaqiriladigan funksiyalar kutubxonasini belgilaydi dasturlari . Biz MPI ning turli xil yuborish va qabul qilish funksiyalari haqida bilib olamiz. Biz ko'proq ishtirok etishi mumkin bo'lgan ba'zi "global" aloqa funktsiyalari haqida bilib olamiz ikkita jarayondan ko'ra . Ushbu funktsiyalar jamoaviy aloqalar deb ataladi . Ushbu MPI funktsiyalarining barchasini o'rganish jarayonida biz ba'zilari haqida ham bilib olamiz 3.1.1 Ishni boshlash Ehtimol, ko'pchiligimiz ko'rgan birinchi dastur "salom, dunyo" ning bir varianti edi. Kernighan va Ritchie klassik matnidagi dastur [29]: #include < stdio.h > int main(void) f printf ( "salom, dunyonn "); qaytish 0;

Keling , MPI-dan biroz foydalanadigan “salom, dunyo”ga o'xshash dastur yozaylik. Buning o'rniga Har bir jarayon shunchaki xabarni chop etishi uchun biz buni amalga oshirish uchun bitta jarayonni belgilaymiz chiqish , va boshqa jarayonlar unga xabarlarni yuboradi va u chop etadi. Parallel dasturlashda bu jarayonlar uchun keng tarqalgan (standart deyish mumkin). bilan aniqlanishi kerak. Shunday qilib, agar p jarayonlar mavjud bo'lsa, jarayonlar 0 , 1, darajalariga ega bo'ladi . Bizning parallel "salom, dunyo" uchun keling. jarayoni belgilangan jarayonga o'tadi va boshqa jarayonlar unga xabarlar yuboradi. 3.1.2 Tuzish va bajarish Dasturni kompilyatsiya qilish va ishga tushirish tafsilotlari sizning tizimingizga bog'liq, shuning uchun siz mahalliy mutaxassis bilan tekshirish kerak bo'lishi mumkin . Biroq, qachon bo'lishimiz kerakligini eslang aniq , biz dastur manbasini yozish uchun matn muharriridan foydalanmoqdamiz deb taxmin qilamiz va

3.1.2-dastur: Jarayonlardan salomlarni chop etuvchi MPI dasturi uchun buyruq qatori. Ko'pgina tizimlar mpicc deb nomlangan buyruqdan foydalanadi kompilyatsiya uchun : $ mpicc g devor yoki mpi salom mpi salom.c Odatda, mpicc - bu C kompilyatori uchun o'ram bo'lgan skript . O'rash skripti uning asosiy maqsadi qandaydir dasturni ishga tushirishdir. Bunday holda, dastur C kompilyatoridir. Biroq, o'rash kompilyatorning ishlashini soddalashtiradi kerakli sarlavhali fayllarni qayerdan topish va qaysi kutubxonalar bilan bog'lanish kerakligini ayting ob'ekt fayli.

Eslatib o'tamiz, dollar belgisi ($) qobiq so'rovidir, shuning uchun uni kiritmaslik kerak. Shuni ham esda tutingki, uchun biz Gnu C kompilyatoridan gcc foydalanamiz deb taxmin qilamiz va biz har doim variantlari -g, -Wall, va -o. Qo'shimcha ma'lumot uchun yuqoridagi bo'limga qarang. MPI bilan taqsimlangan xotirada dasturlash Ko'pgina tizimlar mpiexec bilan dasturni ishga tushirishni ham qo'llab-quvvatlaydi : $ mpiexec n <jarayonlar soni> ./ mpi salom Shunday qilib , dasturni bitta jarayon bilan ishga tushirish uchun biz yozamiz $ mpiexec n 1 ./ mpi salom va dasturni to'rtta jarayon bilan ishga tushirish uchun biz yozamiz $ mpiexec n 4 ./ mpi salom Bitta jarayon bilan dasturning chiqishi bo'ladi 0/1 jarayondan salom! va to'rtta jarayon bilan dasturning chiqishi bo'ladi 0/4 jarayondan salom! 1/4 jarayondan salom! 2/4 jarayondan salom! 3/4 jarayondan salom! Qanday qilib mpiexecni chaqirishdan bir yoki bir nechta salomlashishga erishamiz? The mpiexec buyrug'i tizimga <jarayonlar soni> misollarini ishga tushirishni aytadi bizning < mpi salom> dasturimiz. Shuningdek, u tizimga qaysi yadro har biri ishlashi kerakligini aytishi mumkin dasturning namunasi . Jarayonlar bajarilgandan so'ng, MPI amalga oshiriladi jarayonlar bir-biri bilan aloqa qilishiga ishonch hosil qilish haqida g'amxo'rlik qiladi. Katalog protokollari yordamida kesh muvofiqligini saqlashning asosiy komponentlari 4.3-rasmda ko'rsatilgan. Protsessorlar bilan bog'langan mahalliy keshlar mahalliyga ega saqlangan umumiy o'zgaruvchilarning nusxalarini yangilashni muvofiqlashtirish uchun kesh kontrollerlari mahalliy keshlar. Markaziy boshqaruvchi kesh kogerentligini asosiy yo'lga qo'yish uchun javobgardir tizimi uchun. Umumiy xotiraning bir qismi belgilovchi yozuvlarni saqlaydigan katalogdir har bir umumiy blokning holati. Katalogdagi har bir