Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
33
Добавлен:
19.04.2015
Размер:
465.42 Кб
Скачать

1

Пример

static long num_steps = 100000; void main (int argc, char *argv[])

{

int i, my_id, numprocs;

double x, pi, step, sum = 0.0 ; step = 1.0/(double) num_steps ; MPI_Init(&argc, &argv) ;

MPI_Comm_Rank(MPI_COMM_WORLD, &my_id) ; MPI_Comm_Size(MPI_COMM_WORLD, &numprocs) ;

for (i=my_id+1; i<num_steps; i+=numprocs)

{

x = (i+0.5)*step; sum += 4.0/(1.0+x*x);

}

sum *= step ;

MPI_Reduce(&sum,&pi,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);MPI_Final ize();

}

Лекция 11. И.Г. Захарова, кафедра ПО

2

Операции редукции – передача данных от всех процессов одному процессу

int MPI_Reduce(void *sendbuf, void *recvbuf, int count, MPI_Datatype type, MPI_Op op, int root, MPI_Comm comm)

sendbuf – буфер с отправляемым сообщением,

recvbuf – буфер для результирующего сообщения (только для процесса с рангом root),

count – количество элементов в сообщениях, type – тип элементов сообщений,

op - операция, которая должна быть выполнена над данными, root – ранг процесса, на котором должен быть получен

результат,

comm - коммуникатор, в рамках которого выполняется операция.

Лекция 11. И.Г. Захарова, кафедра ПО

3

Базовые типы данных MPI для С

MPI_Datatype

Тип данных MPI Тип C

MPI_BYTE 8 битов для нетипиз.данных MPI_CHAR signed char

MPI_DOUBLE double MPI_FLOAT float MPI_INT int MPI_LONG long

MPI_LONG_DOUBLE long double MPI_PACKED упакованные данные MPI_SHORT short MPI_UNSIGNED_CHAR unsigned char MPI_UNSIGNED unsigned int MPI_UNSIGNED_LONG unsigned long MPI_UNSIGNED_SHORT unsigned short

Лекция 11. И.Г. Захарова, кафедра ПО

4

Базовые типы операций редукции

MPI_Op

Операция Описание

MPI_MAX

максимальное значение

MPI_MIN

минимальное значение

MPI_SUM

сумма значений

MPI_PROD

произведение значений

MPI_LAND

операция "И"

(над значениями сообщений) MPI_BAND битовая операция "И” MPI_LOR операция "ИЛИ” MPI_BOR битовая операция "ИЛИ"

MPI_LXOR операция исключающее "ИЛИ" MPI_BXOR операция исключающее "ИЛИ" MPI_MAXLOC макс. значение и соотв. индекс* MPI_MINLOC миним. значение и соотв. индекс

*Как правило, это ранг процесса, предоставившего max (min) Перечень базовых операций м.б. дополнен пользовательскими.

Лекция 11. И.Г. Захарова, кафедра ПО

5

Допустимые типы операндов

MPI_Op

Операция Допустимые типы операндов

MPI_MAXцелые, вещественные MPI_MIN

MPI_SUM

MPI_PROD MPI_MAXLOC MPI_MINLOC

MPI_LAND целые

MPI_LOR

MPI_LXOR

MPI_BAND целые, MPI_BYTE

MPI_BOR

MPI_BXOR

Лекция 11. И.Г. Захарова, кафедра ПО

6

Выполнение операций редукции

Суть редукции - коллективная операция пересылки сообщений от всех процессов коммуникатора comm процессу root.

Выполнение редукции:

операция op, выполняется над первыми элементами входного буфера sendbuf,

результат посылается в первый элемент буфера приема recvbuf процесса root,

аналогично для вторых элементов буфера и т.д. до count элементов.

Лекция 11. И.Г. Захарова, кафедра ПО

7

Схема выполнения редукции

Лекция 11. И.Г. Захарова, кафедра ПО

8

Пример выполнения редукции для «+»

Лекция 11. И.Г. Захарова, кафедра ПО

9

Синхронизация процессов

Одновременное достижение всеми процессами коммуникатора определенной «точки» вычислений обеспечивает функция

int MPI_Barrier(MPI_Comm comm)

Вызывается всеми процессами.

При вызове блокирует выполнение процесса.

Заблокированные процессы продолжат выполнение только после вызова всеми

процессами коммуникатора.

Лекция 11. И.Г. Захарова, кафедра ПО

10

Передача данных от одного процесса всем процессам

int MPI_Bcast(void *buf, int count, MPI_Datatype type, int root, MPI_Comm comm)

buf – буфер с отправляемым сообщением (для процесса с рангом root) и буфер для приема результирующего сообщения для всех остальных процессов.

count – количество элементов в сообщении, type – тип элементов сообщения,

root – ранг процесса, выполняющего рассылку, comm - коммуникатор, в рамках которого выполняется

передача данных.

Лекция 11. И.Г. Захарова, кафедра ПО

Соседние файлы в папке Параллельное программирование (лекции)