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();}
Сурак