
- •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 Коллективные операции рассылки-сборки данных 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

2.2.5 Коллективная операция сборки данных “все от всех”
MPI_ALLGATHER (SBUF,SCOUNT,STYPE, RBUF,RCOUNT,RTYPE,COMM,IERR)
INTEGER |
SCOUNT,STYPE, RCOUNT,RTYPE,ROOT,COMM,IERR |
SBUF |
- буфер рассылки |
SCOUNT |
- состоящий из SCOUNT элементов |
STYPE |
- типа STYPE |
RBUF |
- буфер приема |
RCOUNT |
- состоящий из RCOUNT элементов |
RTYPE |
- типа RTYPE |
COMM |
- коммуникатор взаимодействующих процессов |
IERR |
- код ошибки |
Нет корневого процесса ROOT ! |
|
|
|
|
|
|
|
|
|
Данные |
|
|
|
|
|
|
|
Процессы |
А0 |
|
А0 |
B0 |
C0 |
D0 |
E0 |
F0 |
|
B0 |
|
А0 |
B0 |
C0 |
D0 |
E0 |
F0 |
|
C0 |
AllGather |
А0 |
B0 |
C0 |
D0 |
E0 |
F0 |
|
D0 |
А0 |
B0 |
C0 |
D0 |
E0 |
F0 |
|
|
|
|||||||
|
E0 |
|
А0 |
B0 |
C0 |
D0 |
E0 |
F0 |
|
F0 |
|
А0 |
B0 |
C0 |
D0 |
E0 |
F0 |

Свойства коллективной операции ALLGather сборки данных “все от всех”
При возврате из операции локальные буфера SBUF по SCOUNT элементов со всех процессов будут скопированы в буфер RBUF каждого процесса коммуникатора COMM.
Принятые данные записываются в RBUF в порядке номеров процессов (блок данных, посланных процессом i-1 , размещается блоке i буфера RBUF)
SCOUNT должен быть равен RCOUNT во всех процессах, иначе ошибка
Преобразование типов допускается
Может рассматриваться, как MPI_GATHER, при выполнении которой результат получается во всех процессах коммуникатора COMM

2.2.5 Коллективная операция полного обмена данными “все со всеми”
MPI_ALLTOALL |
(SBUF,SCOUNT,STYPE, RBUF,RCOUNT,RTYPE,COMM,IERR) |
INTEGER |
SCOUNT,STYPE, RCOUNT,RTYPE,ROOT,COMM,IERR |
SBUF |
- буфер рассылки |
SCOUNT |
- состоящий из SCOUNT элементов |
STYPE |
- типа STYPE |
RBUF |
- буфер приема |
RCOUNT |
- состоящий из RCOUNT элементов |
RTYPE |
- типа RTYPE |
COMM |
- коммуникатор взаимодействующих процессов |
IERR |
- код ошибки |
Нет корневого процесса ROOT ! Данные
Процессы |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
А0 |
|
A1 |
|
A2 |
|
A3 |
|
A4 |
|
A5 |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
B0 |
|
B1 |
|
B2 |
|
B3 |
|
B4 |
|
B5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C0 |
|
C1 |
|
C2 |
|
C3 |
|
C4 |
|
C5 |
|
AllToAll |
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
D0 |
|
D1 |
|
D2 |
|
D3 |
|
D4 |
|
D5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
E0 |
|
E1 |
|
E2 |
|
E3 |
|
E4 |
|
E5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
F0 |
|
F1 |
|
F2 |
|
F3 |
|
F4 |
|
F5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
А0 |
B0 |
C0 |
D0 |
E0 |
F0 |
|
|
|
|
|
|
|
|
|
|
А1 |
B1 |
C1 |
D1 |
E1 |
F1 |
|
|
|
|
|
|
|
|
|
|
А2 |
B2 |
C2 |
D2 |
E2 |
F2 |
|
|
|
|
|
|
|
|
|
|
А3 |
B3 |
C3 |
D3 |
E3 |
F3 |
|
|
|
|
|
|
|
|
|
|
А4 |
B4 |
C4 |
D4 |
E4 |
F4 |
|
|
|
|
|
|
|
|
|
|
А5 |
B5 |
C5 |
D5 |
E5 |
F5 |
|
|
|
|
|
|
|
|
|