2.2 Kollektiv asoslar
Kollektiv funktsiyalar jarayonlar guruhidagi barcha jarayonlar o'rtasidagi aloqani o'z ichiga oladi (bu butun jarayonlar havzasini yoki dastur tomonidan belgilangan pastki qismni anglatishi mumkin). Odatda funktsiya - bu MPI_Bcastqo'ng'iroq (" translyatsiya " uchun qisqartma ). Ushbu funktsiya bitta tugundan ma'lumotlarni oladi va jarayonlar guruhidagi barcha jarayonlarga yuboradi. Teskari operatsiya - bu MPI_Reduceqo'ng'iroq, bu guruhdagi barcha jarayonlardan ma'lumotlarni olib, operatsiyani bajaradi (masalan, yig'ish) va natijalarni bitta tugunda saqlaydi. MPI_Reduceko'pincha har bir protsessor ma'lumotlarning bir qismida ishlaydi va keyin ularni natijaga birlashtirgan katta taqsimlangan hisob-kitoblarning boshida yoki oxirida foydalidir.
Boshqa operatsiyalar yanada murakkab vazifalarni bajaradi, masalan n ta ma'lumotni MPI_Alltoallqayta tartibga soladi , masalan n- tugun har biridan ma'lumotning n- elementini oladi .
Ko'p MPI funktsiyalari jarayonlar o'rtasida yuboriladigan ma'lumotlar turini belgilashni talab qiladi. Buning sababi shundaki, MPI turli xil tugunlarda turlicha aks ettirilishi mumkin bo'lgan heterojen muhitni qo'llab-quvvatlashga qaratilgan [14] (masalan, ular har xil endiannessga ega bo'lgan turli xil CPU arxitekturalarida ishlayotgan bo'lishi mumkin ), bu holda MPI dasturlari ma'lumotlar konvertatsiyasini amalga oshirishi mumkin . [14] C tili bir turini o'zi, bir parametr sifatida qabul qilinishi uchun ruxsat bermaydi boshlab, MPI konstantalarni bashorat MPI_INT, MPI_CHAR, MPI_DOUBLEmos uchun int, char, double, va hokazo
S qatorlarini intbarcha jarayonlardan bittasiga o'tkazadigan misol C. Qabul qiluvchi jarayon "ildiz" jarayoni deb ataladi va u har qanday belgilangan jarayon bo'lishi mumkin, lekin odatda bu jarayon 0 bo'ladi. Barcha jarayonlar o'z massivlarini ildizga yuborishni so'raydi MPI_Gather, bu har bir jarayonga (shu jumladan, root o'zi) chaqiradi MPI_Sendva ildiz MPI_Recvbarcha ushbu massivlarni kattaroq qismga yig'ish uchun buyurtma qilingan qo'ng'iroqlarning tegishli sonini qiladi : [15]
int send_array [ 100 ];
int root = 0 ; / * yoki har qanday narsa * /
int num_procs , * recv_array ;
MPI_Comm_size ( comm , & num_procs );
recv_array = malloc ( num_procs * sizeof ( send_array ));
MPI_Gather ( send_array , sizeof ( send_array ) / sizeof ( * send_array ), MPI_INT,
recv_array , sizeof ( send_array ) / sizeof ( * send_array ), MPI_INT ,
root , comm );
Biroq, buning o'rniga siz 100 ints dan farqli o'laroq ma'lumotlarni bitta blok sifatida yuborishni xohlashingiz mumkin . Buning uchun ma'lumotlar turini "tutashgan blok" ni belgilang:
MPI_Datatype yangi turi ;
MPI_Type_contiguous ( 100 , MPI_INT , & newtype );
MPI_Type_commit ( & yangi turi );
MPI_Gather ( massiv , 1 , newtype , ece_array , 1 , newtype , root , comm );
Ma'lumotlar sinfidan yoki ma'lumot strukturasidan MPI_Type_create_structo'tish uchun MPI_predefinedma'lumotlar turlaridan quyidagicha MPI olingan ma'lumotlar turini yaratadi :
int MPI_Type_create_struct ( int soni ,
int * blocklen ,
MPI_Aint * disp ,
MPI_Datatype * turi ,
MPI_Datatype * newtype )
qaerda:
countbloklar bir qator bo'lib, tillo (elementlarda) uzunligini belgilaydi blocklen, dispva type.
blocklen har bir blokdagi elementlarning sonini o'z ichiga oladi,
disp har bir blokning bayt siljishlarini o'z ichiga oladi,
type har bir blokdagi element turlarini o'z ichiga oladi.
newtype (chiqish) ushbu funktsiya tomonidan yaratilgan yangi olingan turini o'z ichiga oladi
disp(Dislokatsiyalar) array uchun zarur bo'lgan ma'lumotlar strukturasi hamjihatlikni , kompilyator may pad beri bir sinf yoki ma'lumotlar tarkibida o'zgaruvchilar. Turli xil maydonlar orasidagi masofani topishning eng xavfsiz usuli bu ularning manzillarini xotirada olishdir. Bu MPI_Get_addressodatda C &operatori bilan bir xil bo'lgan, lekin bu xotirani segmentatsiya qilishda to'g'ri bo'lmasligi mumkin . [16]
Ma'lumotlar strukturasini bitta blok sifatida o'tkazish, bir vaqtning o'zida bitta elementni uzatishga qaraganda ancha tezroq, ayniqsa operatsiya takrorlanishi kerak bo'lsa. Buning sababi shundaki, belgilangan o'lchamdagi bloklar uzatish paytida ketma-ketlikni talab qilmaydi . [17]
Quyidagi ma'lumotlar tuzilmalari berilgan:
Do'stlaringiz bilan baham: |