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


integer ierr, rank, size, N, nl, i, j



Pdf көрінісі
бет99/121
Дата31.08.2022
өлшемі2,81 Mb.
#38343
түріОқулық
1   ...   95   96   97   98   99   100   101   102   ...   121
Байланысты:
duisembiev-parallel-esep

integer ierr, rank, size, N, nl, i, j 
parameter (N = 9) 
double precision a(N, N), b(N, N) 
call MPI_INIT(ierr) 
call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr) 
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) 
nl = (N-l)/size+l 
call work(a, b, N, nl, size, rank) 
call MPI_FINALIZE(ierr) 
end 
subroutine work(a, b, n, nl, size, rank) 
include 'mpif.h‟ 
integer ierr, rank, size, n, MAXPROC, nl, i, j, ii, jj, 
ir parameter (MAXPROC = 64)
double precision a(nl, n), b(nl, n), с
integer irr, status(MPI_STATUS_SIZE), req(MAXPROC*2)
do i = 1, nl
do j = 1, n 
ii = i+rank*nl 
if(ii .le. n) a(i, j) = 100*ii+j
end do
end do 
do ir = 0, size-1
if(ir .ne. rank)
& call MPI_IRECV(b(1, ir*nl+l), nl*nl, 

MPI_DOUBLE_PRECISION, ir, 

MPI_ANY_TAG, MPI_COMM_WORLD, 


178 

req(ir+1), ierr) 
end do 
req(rank+1) = MPI_REQUEST_NULL 
do ir = 0, size-1 
if(ir .ne. rank) 
& call MPI_ISEND(a(1, ir*nl+1), nl*nl, 

MPI_DOUBLE_PRECISION, ir, 

1, MPI_COMM_WORLD, 

req(ir+1+size), ierr) 
end do 
ir = rank
do i = 1, nl 
ii = i+ir*nl
do j = i+1, nl
jj = j+ir*nl
b(i, jj) = a(j, ii)
b(j, ii) = a(i, jj)
end do 
b(i, ii) = a(i, ii)
end do 
do irr = 1, size-1 
call MPI_WAITANY(size, req, ir, status, ierr)
ir = ir-1
do i = 1, nl 
ii = i+ir*nl
do j = i+1, nl
jj = j+ir*nl
c = b(i, jj)
b(i, jj) = b(j, ii)
b(j, ii) = c
end do
end do
end do 
do i = 1, nl


179 
do j = 1, N 
ii = i+rank*nl 
if(ii .le. n) print *, 'process ', rank, 

': a(', ii, ', ', j, ') =', a(i,j), 

', b(', ii, ', ', j, ') =', b(i,j) 
end do
end do
end 
Ара-қатынас сұраныстарын біріктіру
Бұл топтың процедуралары, қабылдау/жіберуді ӛңдеу және қажетті ақпараттың 
процесс пен желілік контроллер арасында орын ауыстыруы кезінде бір 
процессор шеңберінде пайда болатын қосымша шығындарды азайтуға 
мүмкіндік береді. Бағдарламада бірдей параметрлермен алмасуды кӛп қайтара 
жиі орындап тұруға тура келеді (мысалы, циклде). Бұл жағдайда алмасу 
операциясын бір рет инициалдап алып, сонан кейін оны кӛп қайтара жіберуге 
болады. Қабылдау немесе жіберу сұраныстарының бірнешеуі, оларды одан ары 
бір командамен жүктеуге мүмкіндік болу үшін бірігулері мүмкін. Хабарламаны 
қабылдау тәсілі оны жіберу тәсілдеріне байланыссыз: біріктірілген сұраныстар 
кӛмегімен болмаса дәстүрлі тәсілдермен жіберілген хабарлама, дәстүрлі 
тәсілмен де, біріктірілген сұраныстар тәсілімен де қабылдана береді.
int 
MPI_Send_init( 
void 
*buf, 
int 
count, 
MPI_Datatype datatype, int dest, int msgtag
MPI_Comm comm, MPI_Request *request) 

buf — жіберілген хабарламамен буфердің басталу адресі; 

count — хабарламадағы жіберілген элементтер саны; 

datatype — жіберілген элементтер типі; 

dest — процесс/қабылдаушының нӛмірі; 

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

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

OUT 
request — асинхронды жіберу идентификаторы. 
Фортран тіліндегі нұсқасы: 


Достарыңызбен бөлісу:
1   ...   95   96   97   98   99   100   101   102   ...   121




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

    Басты бет