1) Qabul qiluvchi vazifa kutilgan xabarning uzunligini oldindan bilmasa. Foydalanuvchi buferi dinamik xotirada ishga tushiriladi: - 1) Qabul qiluvchi vazifa kutilgan xabarning uzunligini oldindan bilmasa. Foydalanuvchi buferi dinamik xotirada ishga tushiriladi:
- MPI_Probe( MPI_ANY_SOURCE, int msgtag, MPI_COMM_WORLD, &status );
- MPI_Get_count( &status, MPI_INT, &bufElems );
- buf = malloc( sizeof(int) * bufElems );
- MPI_Recv( buf, bufElems, MPI_INT, MPI_ANY_SOURCE, int msgtag, MPI_COMM_WORLD, &status );
- /* MPI_Recv faqat tizim buferidagi ma'lumotlarni foydalanuvchi buferiga ko’chiradi*/
- Buning o'rniga, albatta, siz shunchaki qabul qiluvchi tomonda mumkin bo'lgan eng uzun xabarlarni joylashtirish uchun katta bo'lgan buferga ega bo'lishingiz mumkin, ammo agar xabarlar uzunligi juda keng farq qilishi mumkin bo'lsa, bu uslub maqbul emas.
2) Qabul qiluvchining vazifasi har xil turdagi va turli jo'natuvchilardan xabarlarni to'plaganida. MPI_Probesiz, foydalanuvchi buferiga xabarlarni olish tartibi kompilyatsiya vaqtida o'rnatilishi kerak: - 2) Qabul qiluvchining vazifasi har xil turdagi va turli jo'natuvchilardan xabarlarni to'plaganida. MPI_Probesiz, foydalanuvchi buferiga xabarlarni olish tartibi kompilyatsiya vaqtida o'rnatilishi kerak:
- MPI_Recv( floatBuf, floatBufSize, MPI_FLOAT, MPI_ANY_SOURCE, tagFloatData, ... );
- MPI_Recv( intBuf,intBufSize,MPI_INT,MPI_ANY_SOURCE, tagIntData,... );
- MPI_Recv( charBuf,charBufSize,MPI_CHAR,MPI_ANY_SOURCE, tagCharData,... );
- Endi, agar bajarilish vaqtida tagCharData identifikatorli xabar qolgan ikkitasidan oldin kelsa, MPI MPI_Recv ga birinchi ikkita qo'ng'iroqlar davomida uni “mahkamlashga" majbur bo'ladi. Bu xotira yukiga to'la. MPI_Probe sizga xabarlarni foydalanuvchi buferiga olish tartibini ular qabul qiluvchi tomonga etib borish tartibiga qarab o’rnatishga imkon beradi, buni kompilyatsiya paytida emas, balki to'g'ridan-to'g'ri bajarish vaqtida amalga oshiradi:
Do'stlaringiz bilan baham: |