MPI tipi
|
C tili tipi
|
MPI_CHAR
|
signed char
|
MPI_SHORT
|
signed short int
|
MPI_INT
|
signed int
|
MPI_LONG
|
signed long int
|
MPI_UNSIGNED_CHAR
|
unsigned char
|
MPI_UNSIGNED_SHORT
|
unsigned short int
|
MPI_UNSIGNED
|
unsigned int
|
MPI_UNSIGNED_LONG
|
unsigned long int
|
MPI_FLOAT
|
Float
|
MPI_DOUBLE
|
Double
|
MPI_LONG_DOUBLE
|
long double
|
MPI_BYTE
|
|
MPI_PACKED
|
|
1.2-jadval. MPI-tiplari bilan FORTRAN tili tiplarining farqlanishi
MPI tipi
|
FORTRAN tili tiplari
|
MPI_INTEGER
|
INTEGER
|
MPI_REAL
|
REAL
|
MPI_DOUBLE_PRECISION
|
DOUBLE PRECISION
|
MPI_COMPLEX
|
COMPLEX
|
MPI_LOGICAL
|
LOGICAL
|
MPI_CHARACTER
|
CHARACTER(1)
|
MPI_BYTE
|
|
MPI_PACKED
|
|
Quyida MPI ni qo’llagan xolda C dasturlash tilida π-sonini xisoblovchi dasturga misol keltirilgan.
// Podklyuchenie neobxodimqx zagolovkov
#include
#include
// Podklyuchenie zagolovochnogo fayla MPI
#include "mpi.h"
// Funktsiya dlya promejutochnqx vqchisleniy
double f(double a)
{
return (4.0 / (1.0+ a*a));
}
// Glavnaya funktsiya programm
int main(int argc, char **argv)
{
// Ob’yavlenie peremennиx
int done = 0, n, myid, numprocs, i;
double PI25DT = 3.141592653589793238462643;
double mypi, pi, h, sum, x;
double startwtime = 0.0, endwtime;
int namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];
// Initsializatsiya podsistemq MPI
MPI_Init(&argc, &argv);
// Poluchitь razmer kommunikatora MPI_COMM_WORLD
// (obщee chislo protsessov v ramkax zadachi)
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
// Poluchitь nomer tekuщego protsessa v ramkax
// kommunikatora MPI_COMM_WORLD
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Get_processor_name(processor_name,&namelen);
// Vqvod nomera potoka v obщem pule
fprintf(stdout, "Process %d of %d is on %s\n", myid,numprocs,processor_name);
fflush(stdout);
while(!done)
{
// kolichestvo intervalov
if(myid==0)
{
fprintf(stdout, "Enter the number of intervals: (0 quits) ");
fflush(stdout);
if(scanf("%d",&n) != 1)
{
fprintf(stdout, "No number entered; quitting\n");
n = 0;
}
startwtime = MPI_Wtime();
}
// Rassqlka kolichestva intervalov vsem protsessam (v tom chisle i sebe)
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
if(n==0)
done = 1;
else
{
h = 1.0 / (double) n;
sum = 0.0;
// Obschitqvanie tochki, zakreplennoy za protsessom
for(i = myid + 1 ; (i <= n) ; i += numprocs)
{
x = h * ((double)i - 0.5);
sum += f(x);
}
mypi = h * sum;
// Sbros rezulьtatov so vsex protsessov i slojenie
MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
// Yesli eto glavnqy protsess, vqvod poluchennogo rezulьtata
if(myid==0)
{
printf("PI is approximately %.16f, Error is %.16f\n", pi, fabs(pi - PI25DT));
endwtime = MPI_Wtime();
printf("wall clock time = %f\n", endwtime-startwtime);
fflush(stdout);
}
}
}
// Osvobojdenie podsistemq MPI
MPI_Finalize();
return 0;
}
1.2 MPI(Message Passing Interface ) tarixi
MPI - bu parallel kompyuterlarni dasturlash uchun aloqa protokoli . Ham nuqta-nuqta, ham jamoaviy aloqa qo'llab-quvvatlanadi. MPI "bu protokol va uning funktsiyalari har qanday amalga oshirishda o'zini qanday tutishi kerakligi uchun semantik xususiyatlar bilan bir qatorda xabarlarni uzatuvchi dasturchi interfeysi." [3] MPI maqsadlari yuqori ishlash, ko'lamini o'zgartirish va ko'chirishdir. MPI bugungi kunda yuqori samarali hisoblashda ishlatiladigan dominant model bo'lib qolmoqda .
Asosiy MPI-1 modeli umumiy xotira kontseptsiyasiga ega emas va MPI-2 faqat cheklangan taqsimlangan umumiy xotira kontseptsiyasiga ega. Shunga qaramay, MPI dasturlari doimiy ravishda umumiy xotira kompyuterlarida ishlaydi va MPICH ham , Open MPI ham mavjud bo'lsa, xabar uzatish uchun umumiy xotiradan foydalanishi mumkin. [5] [6] MPI modeli atrofida dasturlarni loyihalashtirish ( umumiy xotira modellaridan farqli o'laroq ) NUMA me'morchiligiga nisbatan afzalliklarga ega, chunki MPI xotira lokalizatsiyasini rag'batlantiradi . MPI-3-da umumiy umumiy xotira dasturlari joriy qilingan. [7] [8] [9]
MPI OSI Reference Model- ning 5 va undan yuqori qatlamlariga tegishli bo'lsa-da , dasturlar transport qatlamida ishlatiladigan soket va Transmission Control Protocol (TCP) bilan ko'p qatlamlarni qamrab olishi mumkin .
Aksariyat MPI dasturlari to'g'ridan-to'g'ri C , C ++ , Fortran (ya'ni, API) dan chaqirilishi mumkin bo'lgan muayyan tartib-qoidalar to'plamidan va shu kabi kutubxonalar, jumladan C # , Java yoki Python bilan ishlashga qodir bo'lgan har qanday tildan iborat . MPI ning eski xabarlarni uzatuvchi kutubxonalarga nisbatan afzalliklari portativlik (MPI deyarli har bir tarqatilgan xotira arxitekturasi uchun amalga oshirilganligi sababli) va tezligi (chunki har bir dastur printsipial jihatdan u ishlaydigan apparat uchun optimallashtirilgan).
MPI qo'ng'iroqlar va tillarni bog'lash uchun Tilning mustaqil spetsifikatsiyalaridan (LIS) foydalanadi . Birinchi MPI standartida ANSI C va Fortran-77 birikmalari LIS bilan birgalikda ko'rsatilgan. Loyiha Supercomputing 1994 da namoyish etildi (1994 yil noyabr) [10] va ko'p o'tmay yakunlandi. Taxminan 128 funktsiya MPI-1,3 standartini tashkil etadi, u 2008 yilda MPI-1 seriyasining so'nggi oxiri sifatida chiqarilgan. [11]
Hozirgi vaqtda standartning bir nechta versiyalari mavjud: 1.3 versiyasi (keng tarqalgan qisqartirilgan MPI-1 ), bu xabarni uzatishni ta'kidlaydi va statik ish vaqti muhitiga ega, MPI-2.2 (MPI-2), masalan, parallel I / O, dinamik jarayonlarni boshqarish va masofaviy xotira operatsiyalari, [12] va MPI-3.1 (MPI-3), bu blokirovka qilinmaydigan versiyalar bilan kollektiv operatsiyalarga kengaytmalarni va bir tomonlama operatsiyalarga kengaytmalarni o'z ichiga oladi. [13] MPI-2 LIS 500 dan ortiq funktsiyalarni aniqlaydi va ISO C , ISO C ++ va Fortran 90 uchun til birikmalarini ta'minlaydi.. Ob'ektlarning o'zaro ishlashi, shuningdek, aralashgan tillarda xabarlarni uzatishni osonlashtirishga imkon berish uchun qo'shildi. 1996 yilda yakunlangan MPI-2 ni standartlashtirishning yon ta'siri MPI-1,2 ni yaratgan holda MPI-1 standartiga aniqlik kiritdi.
MPI-2 asosan MPI-1 ning supersetidir, ammo ba'zi funktsiyalar eskirgan. MPI-1.3 dasturlari hali ham MPI-2 standartiga mos MPI dasturlari ostida ishlaydi.
MPI-3 yangi Fortran 2008 birikmalarini o'z ichiga oladi, shu bilan birga u eskirgan C ++ birikmalarini, shuningdek ko'plab eskirgan tartib va MPI moslamalarini olib tashlaydi.
MPI ko'pincha Parallel Virtual Machine (PVM) bilan taqqoslanadi , bu 1989 yilda ishlab chiqilgan ommabop tarqatilgan muhit va xabarlarni uzatuvchi tizim bo'lib, u standart parallel xabar uzatishni talab qilgan tizimlardan biri bo'lgan. Tarmoqli umumiy xotira dasturlash modellari (masalan, Pthreads va OpenMP ) va xabarlarni uzatish dasturlash (MPI / PVM) qo'shimcha dasturlash yondashuvlari sifatida qaralishi mumkin va vaqti-vaqti bilan birgalikda, masalan, bir nechta katta xotira tugunlari bo'lgan serverlarda ko'rish mumkin.
II. BOB MPI-2 muhiti bilan ishlash
2.1 MPI interfeysi
MPI interfeysi bir qator jarayonlar (tugunlarga / serverlarga / kompyuter misollariga bog'langan) o'rtasida zarur virtual topologiyani, sinxronizatsiyani va aloqa funktsiyalarini tildan mustaqil ravishda, tilga xos sintaksis (birikmalar) bilan ta'minlash uchun mo'ljallangan. ortiqcha bir nechta tilga xos xususiyatlar. MPI dasturlari doimo jarayonlar bilan ishlaydi, lekin dasturchilar odatda jarayonlarni protsessor deb atashadi. Odatda, maksimal ishlash uchun, har bir CPU (yoki asosiy ko'p yadroli mashinasi ichida) faqat bitta jarayon beriladi. Ushbu topshiriq odatda mpirun yoki mpiexec deb nomlangan MPI dasturini ishga tushiruvchi agent orqali ish vaqtida amalga oshiriladi.
MPI kutubxonasi funktsiyalari quyidagilarni o'z ichiga oladi, ular bilan cheklangan emas: "nuqta-nuqta" ko'rinishidagi yuborish / qabul qilish operatsiyalari, dekartiya yoki grafikaga o'xshash mantiqiy jarayon topologiyasi o'rtasida tanlov , jarayon juftlari o'rtasida ma'lumotlar almashinuvi (operatsiyalarni yuborish / qabul qilish), qisman birlashtirish hisoblash natijalari (operatsiyalarni yig'ish va qisqartirish), sinxronizatsiya tugunlari (to'siqni ishlash), shuningdek, hisoblash sessiyasidagi jarayonlar soni, protsessor xaritasi joriy protsessor identifikatori, qo'shni jarayonlar mantiqiy topologiya va boshqalar. Nuqtadan-nuqtaga operatsiyalar sinxron , asinxron , tamponlangan va tayyor holda amalga oshiriladiuchrashuvlar yuborishning sinxronlash jihatlari uchun nisbatan kuchli va kuchsiz semantikaga imkon beradigan shakllar . Asenkron rejimda, aksariyat dasturlarda ko'plab aniq operatsiyalarni bajarish mumkin.
MPI-1 va MPI-2 ikkalasi ham aloqa va hisoblash bilan mos keladigan dasturlarni amalga oshirishga imkon beradi, ammo amaliyot va nazariya bir-biridan farq qiladi. MPI shuningdek , interfeys ichidagi yashirin holatdan qochishga yordam beradigan birlashma va ulanish strategiyasiga ega bo'lgan xavfsiz zararli interfeyslarni belgilaydi . Ko'p tishli nuqta-nuqta MPI kodini yozish nisbatan oson va ba'zi dasturlar bunday kodni qo'llab-quvvatlaydi. Ko'p tarmoqli jamoaviy aloqa quyida tasvirlanganidek, eng yaxshi Communicators nusxalari bilan amalga oshiriladi.
MPI ko'plab qobiliyatlarni ta'minlaydi. Quyidagi tushunchalar ushbu qobiliyatlarning barchasini tushunish va ta'minlash uchun yordam beradi va dasturchiga dastur dasturlarida qanday funktsiyalardan foydalanishni hal qilishda yordam beradi. MPI sakkizta asosiy tushunchalaridan to'rttasi faqat MPI-2 ga xosdir.
Kommunikator. Communicator ob'ektlari MPI sessiyasidagi jarayonlar guruhlarini birlashtiradi. Har bir kommunikator har bir o'z ichiga olgan jarayonga mustaqil identifikatorni beradi va tarkibidagi jarayonlarni tartibli topologiyada tartibga soladi . MPI-da aniq guruhlar mavjud, ammo ular asosan boshqa kommunikator yaratilishidan oldin jarayonlar guruhlarini tashkil qilish va qayta tashkil qilish uchun yaxshi. MPI bir guruh intrakommunikator operatsiyalari va ikki tomonlama interkommunikator aloqalarini tushunadi. MPI-1da bitta guruh operatsiyalari eng ko'p tarqalgan. Ikki tomonlama operatsiyalar asosan MPI-2da bo'lib, ularda jamoaviy aloqa va jarayon ichidagi dinamik boshqaruv mavjud.
Kommunikatorlar bir nechta MPI buyruqlar yordamida bo'linishi mumkin. Ushbu buyruqlar tarkibiga MPI_COMM_SPLIThar bir jarayon bir nechta rangli sub-kommunikatorlardan biriga qo'shilib, o'zini shu rangga ega deb e'lon qiladi.
Bir qator muhim MPI funktsiyalari ikkita aniq jarayon o'rtasidagi aloqani o'z ichiga oladi. Ommabop misol MPI_Send, bu ko'rsatilgan jarayonning ikkinchi belgilangan jarayonga xabar yuborishiga imkon beradi. Nuqtadan-nuqtaga operatsiyalar, deyilganidek, naqshli yoki tartibsiz aloqada, masalan, har bir protsessor muntazam ravishda ma'lumotlar mintaqalarini aniq boshqa protsessorlar bilan hisoblash bosqichlari o'rtasida almashtirib turadigan ma'lumotlar parallel arxitekturasida yoki master-da foydalidir. qul arxitekturasi, unda usta oldingi topshiriq tugagandan so'ng qulga yangi topshiriq ma'lumotlarini yuboradi.
MPI-1 blokirovka qiluvchi va blokirovka qilmaydigan nuqta-nuqta aloqa mexanizmlari hamda "tayyor yuborish" mexanizmi deb nomlanadi, bunda jo'natish so'rovi faqat mos keladigan qabul qilish so'rovi allaqachon amalga oshirilganda amalga oshirilishi mumkin. .
Do'stlaringiz bilan baham: |