MPI-1 предоставляет операцию исключающего сканирования. Исключающее сканирование описывается здесь.
------------------------------------------------------------------
MPI_EXSCAN(sendbuf, recvbuf, count, datatype, op, comm)
------------------------------------------------------------------
IN | sendbuf | Стартовый адрес буфера передачи (по выбору) | ||||
OUT | recvbuf | Стартовый адрес буфера приема (по выбору) | ||||
IN | count | Количество элементов во входном буфере | ||||
IN | datatype | Тип данных элементов входного буфера (указатель) | ||||
IN | op | Операция (указатель) | ||||
IN | comm | Интракоммуникатор (указатель) |
int MPI_Exscan(void *sendbuf, void *recvbuf, int count,
MPI_Datatype datatype, MPI_Op op,
MPI_Comm comm)
MPI_EXSCAN(SENDBUF, RECVBUF, COUNT, DATATYPE, OP, COMM, IERROR)
<type> SENDBUF(*), RECVBUF(*)
INTEGER COUNT, DATATYPE, OP, COMM, IERROR
void MPI::Intracomm::Exscan(const void* sendbuf,
void* recvbuf, int count,
const MPI::Datatype& datatype,
const MPI::Op& op) const
MPI_EXSCAN
используется для того, чтобы выполнить префиксное
сокращение данных, распределенных по группе. Значение в recvbuf
для процесса с номером 0
неопределено и recvbuf
не имеет
смысла для данного процесса. Значение в recvbuf
для процессе с
номером 1
определено как значение в sendbuf
для процесса с
номером 0
. Для процессов с номером операция возвращает в
буфере приема процесса с номером редуцированные значения в буферах
передачи процессов с номерами 0
, Е
, (включительно).
Тип поддерживаемых операций, их семантика и ограничения, накладываемые на
буферы приема и передачи, такие же, как и для MPI_REDUCE
.
Опция in-place
не поддерживается.
Совет пользователям:
Что касается MPI_SCAN
, MPI не определяет, которые процессы могут
вызывать операцию, только то, что результат будет вычислен правильно. В
частности обратите внимание, что процесс с номером 1
не требует
вызова MPI_op
, так как все, что он должен сделать, это получить
значение от процесса с номером 0
. Однако, все процессы, даже с
нулевыми и единичными номерами, должны предоставить одинаковую op
.
[]
Объяснение:
Исключающее сканирование более общее, чем включающее, реализованное в
MPI-1 в виде MPI_SCAN
. Любая включающая операция сканирования
может быть заменена исключающим сканированием, с последующим объединением
локальных вкладов. Обратите внимание, что для неинвертируемых операций типа
MPI_MAX
, исключающее сканирование может дать результаты, которые не могут
быть получены с помощью исключающего сканирования.
[]
Причиной выбора MPI-1 включающего сканирования является то, что
определение поведения процессов 0
и 1
, как думали, вызовет
слишком много сложностей, особенно для определяемых пользователем
операций.