MPI_Type_hindexed(count, array_of_blocklengths, array_of_displacements, oldtype, newtype)
Структурный MPI_Type_struct общий конструктор: он обобщает предыдущий конструктор таким образом, что позволяет каждому блоку состоять из различных типов данных. MPI_Type_struct (count, array_of_blocklengths, array_of_displacements, array_of_types, newtype)
ПримерПусть 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 Все права принадлежат авторам размещенных материалов.
|