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

Int argc;

char *argv[]; {

int numtasks, rank, next, prev, buf[2], tagl=l, tag2=2;

MPI_Request reqs[4];

MPI_Status stats [4];

MPI_Init (&argc, &argv) ;

MPI_Comm_size(MPI_COMM_WORLD, &numtasks);

MPI_Comm_rank(MPI_COMM_WORLD, &rank);

prev = rank - 1;

next = rank+1;

if (rank == 0) prev = numtasks - 1;

if (rank == (numtasks - 1)) next = 0;

MPI_Irecv(&buf[0], 1, MPI_INT, prev, tagl, MPI_COMM_WORLD,

&reqs[0]);

MPI_Irecv(&buf[1], 1, MPI_INT, next, tag2, MPI_COMM_WORLD, &reqs[1]);

MPI_Isend(&rank, 1, MPI_INT, prev, tag2, MPI_COMM_WORLD, &reqs[2]); MPI_Isend(&rank, 1, MPI_INT, next, tagl, MPI_COMM_WORLD, &reqs[3]);

MPI_Waitall(4, reqs, stats);

MPI_Finalize();

}

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

program example5

Include 'mpif.H’

Integer ierr, rank, size, prev, next, reqs(4), buf(2)

Integer stats(mpi_status_size, 4)

call MPI_INIT(ierr)

call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)

call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)

prev = rank - 1

next = rank + 1

if (rank .eq. 0) prev = size - 1

if (rank .eq. size - 1) next = 0

call MPI_IRECV(buf(1), 1, MPI_INTEGER, prev, 5, & MPI_COMM_WORLD, reqs(l), ierr)

call MPI_IRECV(buf(2), 1, MPI_INTEGER, next, 6, & MPI_COMM_WORLD, reqs(2), ierr)

call MPI_ISEND(rank, 1, MPI_INTEGER, prev, 6, & MPI_COMM_WORLD, reqs(3), ierr)

call MPI_ISEND(rank, 1, MPI_INTEGER, next, 5, & MPI_COMM_WORLD, reqs(4), ierr)

call MPI_WAITALL(4, reqs, stats, ierr);

print *, ‘process ’, rank, & prev=’, buf(l), ‘ next=’, buf(2)

call MPI_FINALIZE(ierr)

end

Int mpi_Waitany( int count, mpi_Request *requests, int *index, mpi_Status *status)

  • count - асинхронды операциялар идентификаторларының саны;

  • requests - асинхронды қабылдау немесе жіберу операцияларының идентификаторлары;

  • out index - аяқталған алмасу операциясының нөмірі;

  • out status - хабарлама параметрлері.

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

MPI_WAITANY(COUNT, REQUESTS, INDEX, STATUS, IERR)

Integer count, requests(*), index, status(mpi_status_size), ierr

Асинхронды COUNT операцияларының бірінің орындалуын күту. Көрсетілген идентификаторлармен анықталған алмасудың қандай да бір асинхронды операциясы аяқталмайынша, процестің орындалуы бұғатталынып тұрады. Егер бірнеше операциялар аяқталса, онда оладың бірі кездейсоқ түрде таңдалып алынады. Аяқталған операция идентификаторы кіретін requests массивіндегі элемент нөмірін index параметрі қамтиды.

Int mpi_Waitsome( int incount, mpi_Request *requests, int *outcount, int *indexes, mpi_Status *statuses)

  • incount — асинхронды операциялар идентификаторларының саны;

  • requests — асинхронды қабылдау немесе жіберу операцияларының идентификаторлары;

  • out outcount — аяқталған алмасу операцияларының идентификаторлар саны;

  • out indexes — аяқталған алмасу операцияларының нөмірлері массиві;

  • out statuses — аяқталған хабарламаны қабылдау операцияларының параметрлері.

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

MPI_WAITSOME(INCOUNT, REQUESTS, OUTCOUNT, INDEXES, STATUSES,

IERR)

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