Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / lecture-4.ppt
Скачиваний:
2
Добавлен:
11.06.2024
Размер:
102.91 Кб
Скачать

Схема использования памяти при передаче по готовности

Процессор 1

Процессор 2

(отправитель)

(получатель)

MPI_RSEND(BUFS,…) MPI_RECV (BUFR, …)

BUFS :

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUFR :

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SYSTEM :

Блокировка – необходимо гарантировать начало выполнения приема в Процессе 2, например, явной синхронизацией (функция BARRIER), иначе ошибка.

Возможность оптимизации в реализации MPI

Замечания к семантике взаимодействия “точка-точка

1. Функция RECV

осуществляет прием сообщений, посланных любой из

функций отправки MPI_SEND, MPI_BSEND, MPI_SSEND, MPI_RSEND

2. Правило “необгона сообщений

Последовательность отправленных сообщений, посланных одним процессом другому, соответствует последовательности принимаемых, логический

обгон в пути невозможен, даже если физически возможен

 

 

 

 

 

 

Процесс 0

 

 

 

 

 

 

 

 

 

Dest =1

 

Dest =1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Tag =1

 

 

Tag =2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Source= ٭

 

Source= ٭

 

Source= 2

 

Source= 2

 

Tag =1

 

Tag =1

 

Tag = ٭

 

Tag = ٭

 

 

 

 

 

 

 

 

Процесс 2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Dest =1

 

 

Dest =1

Dest =1

 

 

 

 

 

 

 

 

Tag =1

 

Tag =2

Tag =2

 

Процесс 1

Source= ٭

Tag = ٭

Далее – функции обмена без блокировки.

Наиболее часто используемые функции, позволяющие обеспечивать совмещение вычислений (асинхронность действий)

1.4 Передача без блокировки

стандартный

MPI_ISEND,

буферизованный

MPI_IBSEND,

синхронный

MPI_ISSEND,

по готовности

MPI_IRSEND

1.5 Прием без блокировки

MPI_IRECV

Пример параллельной программы вычисления числа π 1

1/(1+x٭x) dx = arctan(1)- arctan(0) = π/4

0

Интегрирование F(x) = 4/(1 + x * x) , метод прямоугольников

0

1

PROGRAM Example4_Pi

include 'mpif.h'

DOUBLE PRECISION myPi, Pi, h, Sum, x, F, a

INTEGER n, ERR, SIZE, RANK, STATUS(MPI_STATUS_SIZE)

CИнтегрируемая функция F(a) = 4.0 D0 / (1.0 D0 + a * a) CALL MPI_INIT (ERR)

CALL MPI_COMM_RANK (MPI_COMM_WORLD,RANK,ERR) CALL MPI_COMM_SIZE (MPI_COMM_WORLD,SIZE,ERR)

CВвод числа отрезков разбиения

OPEN(10, FILE = ‘in.dat' ) READ(10,*) n

IF (n .LE. 0) THEN GOTO 30

C Вычисление частичной суммы h = 1.0D0 / n

Sum = 0.0 D0

DO 20 I = rank +1, n, size x = h * ( I – 0.5 D0) Sum = Sum + F(x)

20CONTINUE myPi = h * Sum

C Результат – Пи – будет получен в процессоре 0 IF (RANK .EQ. 0) THEN

Pi = myPi

С Прием результатов от остальных процессоров

 

DO 40 I = 1, size-1

 

CALL MPI_RECV (myPi,1,MPI_ DOUBLE_PRECISION,I,0,

 

*

MPI_COMM_WORLD,STATUS,ERR)

 

Pi = Pi + myPi

 

40

CONTINUE

 

 

WRITE (* , *) '

Pi = ‘, Pi

 

ELSE

 

С Отправка результатов остальными процессорами

CALL MPI_SEND (myPi,1, MPI_ DOUBLE_PRECISION,0,0,

*

MPI_COMM_WORLD , IERR)

ENDIF

 

C

Завершение MPI

30CALL MPI_FINALIZE(ERR) END

Как ускорить эту программу? Получите бонус ))

Соседние файлы в папке Лекции