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

Программирование в MPI

2. Коллективные (групповые) операции

Процессор 0

Процессор N-1

MPI_BARRIER(Comm, …)

MPI_BARRIER(Comm, …)

 

Коммуникатор Comm состоит из процессов 0, …, N-1

Общие свойства коллективных операций

1)участвуют все процессы, входящие в коммуникатор

2)коллективная операция должна быть вызвана каждым из процессов, входящих в коммуникатор (иначе – ошибка, зависание)

3)возврат после того, как процесс завершил свое действие (асинхронных нет), возврат означает что возможен свободный доступ к буферу отправки или приема

4)MPI гарантирует, что сообщения, порожденные коллективными операциями, не пересекутся с сообщениями, созданными пользователем в операциях точка-точка

5)Нет тегов, соответствие коллективных операций определяется порядком их выполнения в программе.

Процессор 0

C Барьерная синхронизация

Св процессоре 0

CALL MPI_BARRIER (COMM, … )

C Суммирование в процессоре 0 CALL MPI_REDUCE (…,COMM,IERR)

Процессор 1

C Суммирование в процессоре 1 CALL MPI_REDUCE (…,COMM,IERR)

C Барьерная синхронизация

Св процессоре 1

CALL MPI_BARRIER (COMM, … )

Пример зависания из-за несоответствия порядка операторов

2.1 Барьерная синхронизация

MPI_BARRIER (COMM, IERR)

INTEGER COMM, IERR

COMM

- коммуникатор взаимодействующих процессов

IERR

- код ошибки

Выполнение процессов блокируется до тех пор, пока все процессы из COMM не выполнят эту операцию. Если не все выполнят – зависание.

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

Пример использования – синхронизация для замера времени

2.2 Коллективные операции рассылки-сборки данных 2.2.1 Коллективная операция рассылки данных

MPI_BCAST

(BUF,COUNT,DATATYPE,ROOT,COMM,IERR)

INTEGER

COUNT,DATATYPE,ROOT,COMM,IERR

BUF

- буфер рассылки

COUNT

- состоящий из COUNT элементов

DATATYPE

- типа DATATYPE

ROOT

- номер рассылающего процесса из коммуникатора COMM

COMM

- коммуникатор взаимодействующих процессов

IERR

- код ошибки

 

Данные

 

Процессы

А0

А0

 

 

А0

 

Broadcast

А0

 

 

А0

 

 

А0

 

 

А0

Свойства коллективной операции BroadCast рассылки данных

При возврате из операции буфер BUF процесса ROOT будет скопирован в локальные буфера всех процессов коммуникатора COMM

BUF,COUNT,DATATYPE,ROOT – должны быть одинаковы у всех процессов, иначе ошибка

Пример.

CALL MPI_BCAST(BUF,100,MPI_INTEGER,2, MPI_COMM_WORLD, IERR)

2.2.2 Коллективная операция рассылки данных c разборкой

MPI_SСATTER

(SBUF,SCOUNT,STYPE, RBUF,RCOUNT,RTYPE,ROOT,COMM,IERR)

INTEGER

SCOUNT,STYPE, RCOUNT,RTYPE,ROOT,COMM,IERR

SBUF

- буфер рассылки

SCOUNT

- состоящий из SCOUNT элементов

STYPE

- типа STYPE

RBUF

- буфер приема

RCOUNT

- состоящий из RCOUNT элементов

RTYPE

- типа RTYPE

ROOT

- номер рассылающего процесса из коммуникатора COMM

COMM

- коммуникатор взаимодействующих процессов

IERR

- код ошибки

 

Данные

 

 

 

 

Процессы

А0

А1

А2

А3

А4

А5

 

А0

 

А1

Scatter

А2

 

А3

 

А4

 

А5

Свойства коллективной операции Scatter рассылки данных с разборкой

При возврате из операции части буфера SBUF по SCOUNT элементов процесса ROOT будут скопированы в локальные буфера RBUF всех процессов (в том числе и процесса ROOT) коммуникатора COMM

На процессе ROOT – существенны все параметры операции

На остальных процессах существенны только RBUF,RCOUNT,RTYPE,ROOT,COMM

ROOT – должен быть одинаков у всех процессов

SCOUNT должен быть равен RCOUNT во всех процессах, иначе ошибка

Преобразование типов допускается

Пример. Рассылка столбцов матрицы.

REAL SBUF (SIZE,SIZE), RBUF (SIZE)

IF (RANK .EQ. 0) THEN DO j = 1, SIZE

DO i = 1, SIZE

SBUF(i, j) = 100.0*i + j ENDDO

ENDDO

ENDIF

CALL MPI_SCATTER(SBUF,SIZE,MPI_REAL, RBUF,SIZE,MPI_REAL,0, MPI_COMM_WORLD,IERR)

2.2.3 Коллективная операция сборки данных (обратная к Scatter)

MPI_GATHER

(SBUF,SCOUNT,STYPE, RBUF,RCOUNT,RTYPE,ROOT,COMM,IERR)

INTEGER

SCOUNT,STYPE, RCOUNT,RTYPE,ROOT,COMM,IERR

SBUF

- буфер рассылки

SCOUNT

- состоящий из SCOUNT элементов

STYPE

- типа STYPE

RBUF

- буфер приема

RCOUNT

- состоящий из RCOUNT элементов

RTYPE

- типа RTYPE

ROOT

- номер принимающего процесса из коммуникатора COMM

COMM

- коммуникатор взаимодействующих процессов

IERR

- код ошибки

 

Данные

 

 

 

 

Процессы

А0

А1

А2

А3

А4

А5

 

А0

 

А1

Gather

А2

 

А3

 

А4

 

А5

Свойства коллективной операции Gather сборки данных

При возврате из операции локальные буфера SBUF по SCOUNT элементов всех процессов (в том числе и процесса ROOT) будут скопированы в буфер RBUF процесса ROOT коммуникатора COMM

Принятые в процессе ROOT данные записываются RBUF в порядке номеров процессов

На процессе ROOT – существенны все параметры операции

На остальных процессах существенны только SBUF,SCOUNT,STYPE,ROOT,COMM

ROOT – должен быть одинаков у всех процессов

SCOUNT должен быть равен RCOUNT во всех процессах, иначе ошибка

Преобразование типов допускается

Пример. Сбор столбцов матрицы.

REAL RBUF (SIZE,SIZE), SBUF (SIZE)

DO i = 1, SIZE

SBUF(i) = 100.0 * i

ENDDO

CALL MPI_GATHER(SBUF,SIZE,MPI_REAL, RBUF,SIZE,MPI_REAL,0, MPI_COMM_WORLD,IERR)

2.2.4. Коллективные операции сборки-разборки данных переменной длины

MPI_SСATTERV (SBUF,SCOUNTS,DISPLS,STYPE, RBUF,RCOUNT,RTYPE,ROOT,COMM,IERR)

INTEGER SCOUNTS(*),STYPE, DISPLS(*), RCOUNT,RTYPE,ROOT,COMM,IERR

SCOUNTS(*) – целочисленный массив, SCOUNTS(i) - количество элементов, передаваемых процессу i -1.

DISPLS(*) - целочисленный массив, DISPLS(i) – смещения относительно друг друга данных, передаваемых процессу i -1

MPI_GATHERV (SBUF,SCOUNT,STYPE,

RBUF,RCOUNTS, DISPLS,RTYPE,ROOT,COMM,IERR)

INTEGER SCOUNT,STYPE, RCOUNTS(*), DISPLS(*),RTYPE,ROOT,COMM,IERR

50 SBUF:

50

RBUF:

47

100

SCOUNT

 

 

 

 

Пример сборки данных

 

 

 

переменной длины SCOUNT

47

 

100

и размещения их

 

 

 

с переменным шагом DISPLS

DISPLS

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