Здавалка
Главная | Обратная связь

Пример. Функция MPI_Reduce с операцией MPI_MAXLOC



#include <stdio.h>

#include <mpi.h>

struct{

double value; int proc;

}local_max,global_max;

void main( int argc, char *argv[] ) {

int i, rank, size;

MPI_Init(&argc, &argv);

MPI_Comm_rank(MPI_COMM_WORLD, &rank);

MPI_Comm_size(MPI_COMM_WORLD, &size);

double array[10];

double max_value;

for(i=0; i<10; i++) array[i]=(double)rand()/RAND_MAX + 0.1*rank;

max_value=array[0];

for(i=0; i<10; i++){

if(array[i]>max_value)

max_value=array[i];

}

local_max.value=max_value;

local_max.proc=rank;

MPI_Reduce(&local_max,&global_max,4,MPI_DOUBLE_INT,MPI_MAXLOC,size-1, MPI_COMM_WORLD );

if (rank == size-1)

printf("global maximum=%f number process=%d\n",global_max.value, global_max.proc);

MPI_Finalize();

}

Пример. Функция MPI_Reduce с операцией MPI_SUM

#include <stdio.h>

#include <mpi.h>

void main( int argc, char *argv[] ) {

int a[]={1,4,7,2,1,9,6,8,3,5}, summa[10];

int i, rank;

 

MPI_Init( &argc, &argv);

MPI_Comm_rank(MPI_COMM_WORLD, &rank);

 

MPI_Reduce(&a[0],&summa[0],10,MPI_INT,MPI_SUM,1,MPI_COMM_WORLD );

 

if (rank ==1) { //результат помещается на root процесс, root=1

for (i=0; i<10; i++) {

printf("%d\n", summa[i]);

}

}

MPI_Finalize();

}

 

Лекция 5

Конструкторы типов данных. Функции упаковки и распаковки данных.

Поддерживаемые MPI языки программирования, в частности Си имеют средства создания собственных “нестандартных” типов данных, например, с помощью структур. Но передать за одну отправку переменные такого типа мы не можем. Почему? Проблема заключается в том, что в функциях передачи и приемы в качестве параметра, который определяет длину сообщения, используется количество передаваемых данных в единицах данных типа. Длина сообщения вычисляется как произведение указанного типа данных на число элементов.

Другая проблема заключается в том, что мы не можем передать за одну отправку, используя стандартные типы данных MPI переменные разных типов, например int и double или более сложные конструкции, например структуры с различными по типу и размеру полями. Выполнить такую передачу можно несколькими способами:

  1. преобразовать данные меньшего типа к большему, в данном случае int к double. Естественно, что при выполнении такой передачи длина сообщения будет больше, поскольку каждый 4-ух байтовый int будет преобразован в 8-ми байтовый double. Поэтому, чем больше данных типа int и меньше данных типа double, тем больше увеличится объем передаваемого сообщения. Это неэффективно.
  2. использовать операцию упаковки и распаковки. Это лучше предыдущего способа, но если необходимо часто передавать нестандартные данные, то многократный вызов операций MPI_Pack/MPI_Unpack также приводят к дополнительным накладным расходам, поскольку выполняют большую работу по переписыванию данных из одной области памяти в другую. Что при больших объемах данных занимает достаточно много времени.
  3. Создать новый тип данных и использовать его на протяжении всей работы программы.

 







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.