MPI_Recv( ((char*))recvBuf) + (i * recvCount * elemSize),
recvCount, recvType, i, ... );
}
E’tibor bering, a) recvType va sendType har xil boʻlishi mumkin va shuning uchun qabul qiluvchi va uzatuvchi tomondan ma’lumotlarni turlicha talqin qiladi; b) qabul qiluvchi vazifasi ham ma’lumotlarni uning qabul qilish buferiga yuboradi.
MPI_Gatherning vektor versiyasi - MPI_Gatherv - turli xil yuborish vazifalarida yuboriladigan ma’lumotlarning TURLI miqdorini belgilash imkonini beradi. Shunga koʻra, qabul qiluvchi tomonda, qabul qiluvchi buferda kiruvchi ma’lumotlar joylashtirilishi kerak boʻlgan pozitsiyalar qatori va barcha vazifalardan ma’lumotlar qismlarining maksimal uzunligi belgilanadi. Ikkala massivda baytlarda EMAS, recvCount tipidagi katakchalar sonida pozitsiyalar/uzunliklar mavjud. Uning hamkasbi:
MPI_Send( sendBuf, sendCount, sendType, rootRank, ... );
if( myRank == rootRank ) {
MPI_Type_extent( recvType, &elemSize );
for( i=0; i
MPI_Recv( ((char*))recvBuf) + displs[i] * recvCounts[i]
* elemSize, recvCounts[i], recvType, i, ... );
}
MPI_Scatter: teskari "tarqalish" operatsiyasini bajaradi - ildiz vazifasidan uzatish buferining qismlari barcha vazifalarning qabul qilish buferlari boʻylab taqsimlanadi. Uning hamkasbi:
if( myRank == rootRank ) {
MPI_Type_extent( recvType, &elemSize );
for( i=0; i
MPI_Send( ((char*)sendBuf) + i*sendCount*elemSize,
sendCount, sendType, i, … );
}
MPI_Recv( recvBuf, recvCount, recvType, rootRank, … );
Uning vektor versiyasi MPI_Scatterv boʻlib, u teng boʻlmagan uzunlikdagi buferlarni olish uchun teng boʻlmagan uzunlikdagi qismlarni yuboradi.
MPI_Allgather MPI_Gather ga oʻxshaydi, lekin qabul qilish bitta vazifada emas, balki HAMMAda amalga oshiriladi: ularning har biri uzatish buferida oʻziga xos tarkibga ega va barchasi qabul qilish buferida bir xil tarkibni oladi. MPI_Gather-da boʻlgani kabi, qabul qilish buferi barcha transmitterlarning ma’lumotlari bilan ketma-ket toʻldiriladi. Teng boʻlmagan ma’lumotlarga ega variant MPI_Allgatherv deb ataladi.
MPI_Alltoall: har bir jarayon uzatish buferini boʻlaklarga boʻlib, qolgan jarayonlarga boʻlaklarni yuboradi; har bir jarayon boshqalardan boʻlaklarni oladi va ularni bir vaqtning oʻzida qabul qilish buferiga joylashtiradi. Bu bitta shishada “choʻp” va “sprey”. Vektor ariant MPI_Alltoallv deb nomlanadi.
Ma’lumotni jamoaviy uzatish funksiyalaridan foydalanishga misol bu erda.
MIT Press tomonidan chop etilgan oʻquv qoʻllanmada ushbu boʻlimda sanab oʻtilgan barcha funksiyalar uchun yaxshi SCHEMA mavjud. Bu qanday ishlashini tushunish oson emas, lekin eslash, agar siz buni allaqachon bir marta tushungan boʻlsangiz, qulaydir.
Kollektiv funksiyalar nuqtadan nuqtaga mos kelmasligini unutmang: masalan, translyatsiyani qabul qilish vazifalaridan birida MPI_Bcast oʻrniga MPI_Recv ga qoʻngʻiroq qilish noqonuniy hisoblanadi.
Do'stlaringiz bilan baham: |