Параллельное программирование (лекции) / lec11
.pptx1
Пример
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. И.Г. Захарова, кафедра ПО