16-Topshiriq. MPI dasturlarining masshtabliligini o‘rganish OpenMP-dasturlarining kengaytirilishini o‘rganish uchun superkompyuterda bir qator tajribalar o‘tkazing. Quyidagi jadvalni to‘ldiring:
№ п/п
Dastur
Parametr N
Iplar soni
Bajarish vaqti (sek.)
57
“π soni” (11-topshiriqqa qarang)
100
1
58
10 000 000
1
59
4 000 000 000
1
60
100
2
61
10 000 000
2
62
4 000 000 000
2
63
100
4
64
10 000 000
4
65
4 000 000 000
4
66
100
6
67
10 000 000
6
68
4 000 000 000
6
69
100
8
70
10 000 000
8
71
4 000 000 000
8
72
100
10
73
10 000 000
10
74
4 000 000 000
10
75
100
12
76
10 000 000
12
77
4 000 000 000
12
Jadval ma‘lumotlariga asoslanib, N parametrining har bir qiymati uchun masshtablilik grafigini tuzing. Har bir grafik uchun qancha iplar sonida maksimal tezlashuvga erishilganligini aniqlang.
2. MPI+OpenMP dasturlash texnologiyasi 17-Topshiriq. Visual Studio 2022 da MPI va OpenMP-ni qo‘llab-quvvatlaydigan loyiha Visual Studio 2022 da MPI va OpenMP yordami bilan minimal kodli loyiha yarating.
18-Topshiriq. “I am” dasturi Har bir jarayonda n ta ip hosil qiluvchi dastur yozing. Har bir ip o‘zining ip nomerini, asosiy jarayon nomerini va barcha jarayonlardagi iplarning umumiy sonini quyidagi formatda ekranga chop qilishi kerak: I am thread from process. Number of hybrid threads = .
Kirish ma’lumotlari:butun n soni – ishga tushirilishi kerak bo‘lgan iplar soni.
Chiqish ma’lumotlari: I am thread from process. Number of hybrid threads = ko‘rinishdagi satr.
2 ta jarayon uchun kirish va chiqish ma'lumotlariga misol
Kiritish ma’lumotlar
Chiqish ma’lumotlar
3
I am 0 thread from 0 process. Number of hybrid threads = 6
I am 1 thread from 0 process. Number of hybrid threads = 6
I am 2 thread from 0 process. Number of hybrid threads = 6
I am 0 thread from 1 process. Number of hybrid threads = 6
I am 1 thread from 1 process. Number of hybrid threads = 6
I am 2 thread from 1 process. Number of hybrid threads = 6
19-Topshiriq. “π soni” dasturi π sonini (6-amaliy ish 11-topshiriqqa qarang) hisoblash dasturini MPI+OpenMP dan foydalanib amalga oshiring.
Kirish ma’lumotlari: bitta butun N soni (hisoblash aniqligi).
Chiqish ma’lumotlari: bitta haqiqiy pi soni.
2 ta jarayon uchun kirish va chiqish ma'lumotlariga misol
Kiritish ma’lumotlar
Chiqish ma’lumotlar
1000000000
3.14159265
3. Metodik ko‘rsatmalar 1. MPI dasturlash texnologiyasi 1-topshiriq. MS Visual Studio muhitida MPI ni qo‘llab-quvvatlaydigan loyiha yaratish 1. Microsoft Visual Studio 2022 da minimal kod bilan mpi loyihasini yarating:
int main() {
return 0;
}
2. MPI-ni qo‘llab-quvvatlashni yoqish uchun qo‘shimcha loyiha kompilyatsiya parametrlarini o‘rnating:
Asosiy menyudan Project->Loyiha_nomi Properties-ni tanlang
Ochilgan oynadan Configuration Properties/C/C++/General ni tanlang. Additional Include Directories parametrining qiymatiga «C:\Program Files (x86)\Microsoft SDKs\MPI\Include» qiymatni o‘rnating. 1-rasmga qarang.
Configuration properties/Linker/Input Kengaytirish ni oching. Additional Dependencies parametriga qiymatni qo‘shing: «msmpi.lib». 3-rasmga qarang.
3-rasm
Ilovani kompilyatsiya qilish uchun F7 tugmasini bosing.
Ilovani ishga tushirish uchun kompilyatsiya qilingan ilovangiz joylashgan katalogda quyidagi tarkibga ega run.bat faylini yarating:
“c:\Program Files\Microsoft MPI\Bin\mpiexec” -n 2 -noprompt mpi.exe
PAUSE
bu yerda
-n - dasturdagi jarayonlar sonini belgilaydigan parametr,
-noprompt – ro‘yxatga olish so‘rovini bekor qilish parametri,
mpi.exe – sizning ilovangiz nomi.
4-rasm.
Endi siz avval yaratilgan bat-faylini ishga tushirishingiz mumkin.
5-rasm. 2-topshiriq. “I am!” dasturi. 1. MPI qo‘llab-quvvatlashi bilan Microsoft Visual Studio 2022 da mpi_i_am loyihasini yarating (1-topshiriqqa qarang).
2. MPI funksiyalari mavjud mpi.h sarlavha faylini qo‘shing. Sarlavha fayli ulanish qatori:
#include 3. MPI kutubxonasini initsializatsiya qiling. Buning uchun main funksiyada MPI_InitMPI-funksiyasini chaqiring:
MPI_Init (&argc, &argv);
Haqiqiy initsializatsiya qilish har bir dastur uchun ko‘pi bilan bir marta amalga oshiriladi va agar MPI allaqachon initsializatsiya qilingan bo‘lsa, unda hech qanday harakat bajarilmaydi va qismiy dasturdan darhol qaytadi.
Boshqa barcha MPI funksiyalarini faqat MPI_Init ga murojaat qilgandan keyin chaqirish mumkin! MPI_Init buyruqlar satri parametrlarini parametr sifatida talab qiladi, bu sizning dasturingiz argc va argv main funksiya parametrlari orqali oladi. main funksiyaga argc va argv parametrlarini qo‘shing:
int main(int argc, char *argv[]){
//...
}
4. MPI_Comm_rank funksiyasidanfoydalanib dasturdagi jarayon nomerini aniqlang:
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
bu yerda
birinchi parametr joriy jarayon nomerini aniqlanadigan kommunikatorni aniqlaydi. MPI_COMM_WORLD – bu MPI-ilovasidagi barcha jarayonlarni birlashtiruvchi kommunikator. Jimlik bo‘yicha yaratilgan.
rank – bu butun o‘zgaruvchi bo‘lib, bu funksiya joriy jarayonning nomerini qaytaradi.
5. MPI_Comm_size funksiyasi yordamida dasturdagi jarayonlar sonini aniqlang:
int size;
MPI_Comm_size(MPI_COMM_WORLD, &size);
bu yerda
birinchi parametr jarayonlar soni aniqlaydigan kommunikatorni belgilaydi.
size - bu butun o‘zgaruvchi bo‘lib, bu funksiya jarayonlarning umumiy sonini qaytaradi.
6. Chiqarish buyrug‘iga «I am process from processes!» satrini kiriting:
printf(“I am %d process from %d processes!\n”, rank, size);
7. Dastur oxirida MPI_Finalize funksiyasini chaqiring:
MPI_Finalize();
MPI_Finalize – ilovaning parallel qismini tugatish. Har qanday MPI-protseduralari, jumladan MPI_Initdan keyingi barcha murojaatlar yakunlanadi. MPI_Finalize ga murojaat qilingan vaqtdagi jarayonlarning, uning xabar almashishda ishtirokini talab qiladigan barcha harakatlar yakunlanishi kerak.
8. Ilovangizni kompilyatsiya qiling va ishga tushiring. To‘g‘ri natija ekranda chop qilinganligiga ishonch hosil qiling.