
- •Программирование в MPI
- •Общие свойства коллективных операций
- •2.1 Барьерная синхронизация
- •2.2 Коллективные операции рассылки-сборки данных 2.2.1 Коллективная операция рассылки данных
- •Свойства коллективной операции BroadCast рассылки данных
- •2.2.2 Коллективная операция рассылки данных c разборкой
- •Свойства коллективной операции Scatter рассылки данных с разборкой
- •2.2.3 Коллективная операция сборки данных (обратная к Scatter)
- •Свойства коллективной операции Gather сборки данных
- •2.2.4. Коллективные операции сборки-разборки данных переменной длины
- •2.2.5 Коллективная операция сборки данных “все от всех”
- •Свойства коллективной операции ALLGather сборки данных “все от всех”
- •2.2.5 Коллективная операция полного обмена данными “все со всеми”
- •Свойства коллективной операции ALLToAll полного обмена данными “все со всеми”
- •2.2.5 Коллективные редукционные операции 2.2.5.1 Простая редукция
- •Пример. Вычисление скалярного произведения
- •Предопределенные редукционные операции
- •2.2.5.2 Редукция “для всех”
- •PROGRAM Example8_Pi_Reduce include 'mpif.h'
- •MPI: операции над коммуникаторами

Программирование в 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