Оқулық Қазақстан Республикасы Білім және ғылым министрлігі бекіткен Алматы, 2011



Pdf көрінісі
бет85/121
Дата31.08.2022
өлшемі2,81 Mb.
#38343
түріОқулық
1   ...   81   82   83   84   85   86   87   88   ...   121
Байланысты:
duisembiev-parallel-esep

Буферлеуімен хабарламаны жіберу кезінде пайдалану үшін ӛлшемі 
SIZE 
болатын 
BUF 
массивін тағайындау (Фортран). Әрбір процесте 
осындай тек бір буфер болуы мүмкін. Жалпы, бағдарламада бұл тағайындалған 
массивті басқа мақсаттарға пайдалануға болмайды. Буферлеу үшін бӛлінген 
массив 
ӛлшемі, 
хабарламаның 
жалпы 
ӛлшемінен 
кемінде 
MPI
_
BSEND
_
OVERHEAD 
тұрақтысымен анықталған шамаға артық болу 
керек.
MPI_BUFFER_DETACH(BUF, SIZE, 
IERR)  BUF(*) 
INTEGER SIZE, IERR 
Басқа мақсаттарға пайдалану үшін бӛлінген буферлік массивті босату. 
Процедура BUF және SIZE аргументтерімен босатылатын массивтің адресін 
және ӛлшемін қайтарады. Берілген буферден барлық хабарламалар кетіп 
болғанға дейін, процедураны шақырған процесс бұғатталады. 
Негізінде жіберілетін хабарламаларды буферлеу үшін MPI–да 
жадының біршама кӛлімі бӛлінеді. Бірақ, нақты іске асырулардың 
ерекшеліктеріне 
сенім 
артпай, 
бағдарламада 
барлық 
жіберілетін 
буферлеуімен хабарламалар үшін айқын түрде жеткілікті буфер бӛлу 
ұсынылады. 
Келесі мысалда буферленуімен хабарлама жіберуді пайдалану 
кӛрсетілген. Буферлеу үшін массив buf бӛлінеді, жіберілу аяқталғаннан 
кейін ол босатылады. Қажетті буфер ӛлшемі хабарлама ӛлшемі (бір бүтін сан 
– 4 байт) қосу МРI_BSEND_OVERHEAD тұрақтысының мәнімен анықталады 
(Фортран). 
program example1 
include „mpif.h‟ 
integer BUFSIZE 
parameter (BUFSIZE = 4 + MPI_BSEND_OVERHEAD) 
byte buf(BUFSIZE) 
integer rank, ierr, ibufsize, rbuf 
integer status(MPI_STATUS_SIZE) 
call MPI_INIT(ierr) 
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) 
if(rank .eq. 0) then 
call MPI_BUFFER_ATTACH(buf, BUFSIZE, ierr) 


163 
call MPI_BSEND(rank, 1, MPI_INTEGER, 1, 5, 

MPI_COMM_WORLD, ierr) 
call MPI_BUFFER_DETACH(buf, ibufsize, ierr)
end if
if(rank .eq. 1) then 
call MPI_RECV(rbuf, 1, MPI_INTEGER, 0, 5, 

MPI_COMM_WORLD, status, ierr) 
print *, 'Process 1 received', rbuf, „from process', 

status(MPI_SOURCE) 
end if 
call MPI_FINALIZE(ierr) 
end 
MPI_RECV(BUF, COUNT, DATATYPE, SOURCE, MSGTAG, COMM, STATUS, 
IERR) 
 BUF(*) 
INTEGER COUNT, DATATYPE, SOURCE, MSGTAG, COMM, IERR, 
STATUS(MPI_STATUS_SIZE) 
Идентификаторы MSGTAG типі DATATYPE болатын, саны COUNT-тан 
аспайтын хабарлама элементтерін BUF буферіне бұғаттау тәсілі. Тәсіл 
нӛмірі SOURCE (COMM коммуникаторындағы) процестен келген хабарлама 
STATUS 
атрибуттары массивін толтыра отырып орындалады. Егер нақты 
қабылданған элементтер саны COUNT мәнінен кіші болса, онда BUF 
буферінде тек қабылданған хабарлама элементтеріне сәйкес келетін 
элементтер ғана ӛзгеретініне кепілдік беріледі. Егер қабылданған элементтер 
саны COUNT мәнінен үлкен болса, онда толып кету (переполнение) қателігі 
туындайды. Оны болдырмау үшін алғашында 
MPI
_
PROBE 
(
MPI
_
IPROBE
)
 
процедурасы кӛмегімен
келетін хабарлама құрылымын анықтап алуға 
болады. Егер қабылданған хабарламадағы элементтердің дәл санын білу 
керек болса, онда 
MPI
_
GET
_
COUNT 
процедурасын пайдалануға болады. 
Бұғатталу хабарламаның барлық элементтері 
MPI
_
RECV 
процедурасынан 
қайтарылғаннан 
кейін 
BUF
буферіне 
қабылданып 
және 
орналастырылатынына кепілдік береді. 
 
int MPI_Recv(void *buf, int count, MPI_Datatype 
datatype, int source, int msgtag, MPI_Comm comm, 
MPI_Status *status) 


164 
 

OUT 
buf
— хабарламаны қабылдайтын буфердің басталу адресі; 

count
— қабылданатын хабарламадағы элементтердің максималды 
саны; 

datatype
— қабылданатын хабарламадағы элементтер типі; 

source
— процесс-жіберуші нӛмірі; 

msgtag
— қабылданатын хабарлама идентификаторы; 

comm
—коммуникатор идентификаторы; 

OUT 
status
— қабылданған хабарламаның параметрлері. 
source 
процесінен 
msgtag 
идентификаторымен 
бұғатталуымен 
хабарламаны қабылдау. Қабылданатын хабарламадағы элементтер саны 
count мәнінен асып кетпеу керек. Егер нақты қабылданған элементтер саны 
count 
мәнінен кіші болса, онда BUF буферінде тек қабылданған хабарлама 
элементтеріне сәйкес келетін элементтер ғана ӛзгеретініне кепілдік беріледі. 
Егер қабылданған хабарламадағы элементтердің дәл санын білу керек болса, 
онда MPI_Probe немесе MPI_Get_count
 
функцияларын пайдалануға 
болады. Бұғатталу, хабарламаның барлық элементтері функциядан 
қайтарылғаннан кейін BUF буферіне қабылданып және орналастырылатынына 
кепілдік береді. 
Тӛменде нӛмірі нӛлінші процесс нӛмірі бірінші процеске хабарлама 
жіберетін және одан жауап күтетін бағдарлама мысалы Си және Фортран 
тілдерінде келтірілген.


Достарыңызбен бөлісу:
1   ...   81   82   83   84   85   86   87   88   ...   121




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет