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

MPI_Type_hindexed(count, array_of_blocklengths, array_of_displacements, oldtype, newtype)



IN count число блоков - также число элементов в array_of_displacements и array_of_blocklengths (nonnegative integer)
IN array_of_blocklengths число элементов в каждом блоке (массив nonegative integer)
IN array_of_displacements смещение каждого блока, в байтах (массив integer)
IN oldtype старый тип данных (handle)
OUT newtype новый тип данных (handle)

Структурный

MPI_Type_struct общий конструктор: он обобщает предыдущий конструктор таким образом, что позволяет каждому блоку состоять из различных типов данных.

MPI_Type_struct (count, array_of_blocklengths, array_of_displacements, array_of_types, newtype)

IN count количество блоков (int)
IN array_of_blocklengths число элем-ов в каждом блоке (массив int длиной count)
IN array_of_displacements смещение каждого блока в байтах (массив int длиной count)
IN array_of_types тип элемента в каждом блоке (массив типов длиной count)
OUT newtype новый тип данных (handle)

ПримерПусть type1 имеет карту типа {(double, 0), (char, 8)}, с протяжённостью 16. Пусть B=(2,1,3), D=(0,16,26), и T=(MPI_FLOAT, type1, MPI_CHAR). Тогда вызов MPI_TYPE_STRUCT(3, B, D, T, newtype) создает тип данных с картой,

{(float,0), (float,4), (double,16), (char,24), (char,26), (char,27), (char,28)}:

две копии MPI_FLOAT начинаются с 0, затем копия типа type1 начинается с 16, далее идут три копии MPI_CHAR, начинающиеся с 26.

Пример. Копирование нижней треугольной части матрицы. Для создания нового типа данных используем MPI_Type_indexed

#include <mpi.h>

#include <iostream.h>

 

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

int a[8][8], b[8][8];

int disp[8], block[8];

 

MPI_Comm_rank(MPI_COMM_WORLD, &rank);

MPI_Status stat;

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

for(int j=0; j<8; j++){

a[i][j]= (j<=i)?(i+1):0;

cout<<a[i][j]<<"\t";

}

cout<<endl;

}

// копирует нижнюю треугольную часть матрицы a в нижнюю треугольную часть

// матрицы b

MPI_Comm_rank(MPI_COMM_WORLD, &rank);

// вычисляет начало и размер каждого блока (блок – это строка матрицы)

disp[0] = 0;

block[0] = 1;

 

for (i=1; i<8; i++){

disp[i] = 8*i;

block[i] = i+1;

}

// создание типа данных для нижней треугольной части матрицы, далее этот тип

// данных можно использовать в обменах

 

MPI_Datatype my_type; //объявили имя нового типа данных

MPI_Type_indexed(count, block, disp, MPI_INT, &my_type);

MPI_Type_commit(&my_type); //зафиксировали новый тип данных

if(rank==0)

MPI_Send(a, 1, my_type, 1, 99, MPI_COMM_WORLD);

if(rank==1){

MPI_Recv(b, 1, my_type, 0, 99, MPI_COMM_WORLD, &stat);

 

cout<<endl<<"RESULT MATRIX"<<endl;

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

for(int j=0; j<8; j++){

cout<<((j<=i)?b[i][j]:0)<<"\t";

}

cout<<endl;

}

}

MPI_Finalize();

}

 

Лекция 6

Адресные функции и функции экстентов. Конструкторы групп и коммуникаторов. Интракоммуникаторы.

Функция MPI_Addressвозвращает байтовый адрес элемента (ячейки)

MPI_Address (location, address)

IN locationэлемент(ячейка в памяти)

OUT addressадрес ячейки (целое)

 

ПримерИспользование MPI_Addressдля вещественного массива.

double m[100];







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