Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Duisembiev-Parallel-esep.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.86 Mб
Скачать

If(ir .Ne. Rank)

& call MPI_IRECV(b(1, ir*nl+l), nl*nl,

& MPI_DOUBLE_PRECISION, ir,

& MPI_ANY_TAG, MPI_COMM_WORLD,

& 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

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 — асинхронды жіберу идентификаторы.

Фортран тіліндегі нұсқасы:

MPI_SEND_INIT(BUF, COUNT, DATATYPE, DEST, MSGTAG, COMM, REQUEST, IERR)

<type> BUF(*)

Integer count, datatype, dest, msgtag, comm, request, ierr

Деректерді жіберу сұранысын қалыптастыру. Мұндағы барлық параметрлер дәл MPI_isend бағыныңқы бағдарламасыныкемен бірдей, бірақ одан айырмашылығы MPI_startall бағыныңқы бағдарламасы шақырылғанша жіберу басталмайды.

mpi_send және mpi_isend процедураларының үш модификациясына ұқсас, mpi_send_init процедурасының үш қосымша нұсқасы қарастырылған:

  • mpi_bsend_init — буферлеуімен хабарламаны жіберу біріктірілген сұранысын қалыптастыру;

  • mpi_ssend_init — синхрондалуымен хабарламаны жіберу біріктірілген сұранысын қалыптастыру;

  • mpi_rsend_init — дайындығымен хабарламаны жіберу біріктірілген сұранысын қалыптастыру.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]