Типы данных в MPI. Для чего они нужны

MPI-константы, шаблоны и прототипы находятся в MPI-заголовочном файле mpi.h, который должен стандартным для C образом #include <mpi.h> присоединяться к программе пользователя.

Для вычислений на разнородных компьютерах необходимо как-то описать передаваемые данные, чтобы их машинное представление преобразовывалось нужным образом между различными архитектурами. MPI содержит строгое описание типов передаваемых данных, от машинных примитивов до сложных структур, массивов и индексов.

Все функции приема/передачи сообщений имеют в качестве одного из своих аргументов тип данных, чье C-определение есть MPI_Datatype. В MPI определены несколько значений MPI_Datatype, которые достаточны для представления типов на большинстве архитектур:

MPI_CHAR-знаковое символьное

MPI_SHORT-знаковое коротк целое

MPI_INT-знаковое целое

MPI_LONG-знаковое длин целое

MPI_UNSIGNED_CHAR-беззнак символьное

MPI_UNSIGNED_SHORT-беззнак коротк целое

MPI_UNSIGNED-беззнак целое

MPI_UNSIGNED_LONG-беззнак длинное целое

MPI_FLOAT-число с плав точкой

MPI_DOUBLE-число двойной точн

MPI_LONG_DOUBLE-число четырехкр точн

MPI_BYTE=битовые данные

Производные типы данных или пользовательские получаются из базовых типов. MPI представляет несколько способов создания типов данных без явного конструирования карты типа:

· Непрерывный: это простейший способ конструирования нового типа. Он производит новый тип данных из count копий существующего со смещениями, увеличивающимися на протяженность oldtype (исходного типа). Простейший пример - массив элементов какого-то уже определенного типа;

· Векторный: это несколько обобщенный непрерывный тип, который допускает регулярные пробелы в смещениях. Элементы отделяются промежутками кратными протяженности исходного типа данных. Пример - столбцы матрицы, при определении матрицы как двумерного массива;

· H-векторный: похож на векторный, но расстояние между элементами задается в байтах;

· Индексный: при создании этого типа используется массив смещений исходного типа данных;

смещения измеряются в терминах протяженности исходного типа данных;

· H-индексный: похож на индексный, но смещения задаются в байтах;

· Структурный: обеспечивает самое общее описание. Фактически, если исходные аргументы состоят из базовых типов MPI, задаваемая структура есть в точности карта создаваемого типа.

Рассмотрим более подробно создание непрерывного типа данных. Непрерывный тип создается с использованием функции MPI_Type_contiguous, производящей новый тип данных, делая count копий исходного типа со смещениями, увеличивающимися на протяженность oldtype. Например, если исходный тип данных (oldtype) имеет карту типа {(int,0),(double,8)}, то MPI_Type_contiguous( 2, oldtype, &newtype); произведет тип данных newtype с картой типа {(int,0),(double,8),(int,16),(double,24)}.

 

 

Напишите параллельную программу проверки совершенного числа.

Совершеное чиcло́ - натуральное число, равное сумме всех своих собственных делителей (т. е. Всех положителных делителей, отличных от самого́ числа). В данном случае программа должна вывести “Sovershennoe”.

int main(int argc,char **argv)

{

int size,rank;

MPI_Status status;

MPI_Init(&argc,&argv);

MPI_Comm_rank(MPI_COMM_WORLD,&rank);

MPI_Comm_size(MPI_COMM_WORLD,&size);

int k=496,p,l=0,x1,l1,l2=0,itog=0,i; // k - issleduemoe chislo

p=k/(size-1);

if (rank!=size-1) // schitaut vse processy, krome poslednego

// metod perebora delitelei

{ for (i=rank*p; i<(rank+1)*p; i++) { x1=k/(i+1); if (x1*(i+1)==k) {l=l+i+1;} }

MPI_Send(&l,1,MPI_INT,size-1,1,MPI_COMM_WORLD);}

else

{ for (i=0; i<size-1; i++) // poslednii process vse sobiraet

{ MPI_Recv(&l1,1,MPI_INT,i,1,MPI_COMM_WORLD, &status); itog+=l1; }

for (i=(size-1)*p; i<k-1; i++) { x1=k/(i+1); if (x1*(i+1)==k) {l2=l2+i+1;} } itog+=l2;

if (itog==k) { printf("Sovershennoe\n"); } else { printf("Ne yavlyaetsya sovershennym\n"); } }

MPI_Finalize();}

 

Сурак