next up previous contents
Next: Конструктор типа данных ``распределенный Up: Новые функции манипуляции типами Previous: Настоящая длина типов данных   Contents

Конструктор типа данных ``субмассив''

MPI_TYPE_CREATE_SUBARRAY(ndims, array_of_sizes, array_of_subsizes,
array_of_starts, order, oldtype, newtype)

IN ndims количество измерений (положительное целое)  
IN array_of_sizes количество элементов типа oldtype в каждом измерении полного массива (массив положительных целых)  
IN array_of_subsizes количество элементов типа oldtype в каждом измерении субмассива (массив положительных целых)  
IN array_of_starts начальные координаты субмассива в каждом измерении (массив не отрицательных целых)  
IN order флаг порядка расположения массива (состояние)  
IN oldtype тип данных элемента массива (дескриптор)  
OUT newtype новый тип данных (дескриптор)  

int MPI_Type_create_subarray(int ndims, int array_of_sizes[], int array_of_subsizes[], int array_of_starts[], int order, MPI_Datatype oldtype, MPI_Datatype *newtype) MPI_TYPE_CREATE_SUBARRAY(NDIMS, ARRAY_OF_SIZES,ARRAY_OF_SUBSIZES, ARRAY_OF_STARTS, ORDER, OLDTYPE, NEWTYPE, IERROR) INTEGER NDIMS, ARRAY_OF_SIZES(*), ARRAY_OF_SUBSIZES(*), ARRAY_OF_STARTS(*), ORDER, OLDTYPE, NEWTYPE, IERROR MPI::Datatype MPI::Datatype::Create_subarray(int ndims, const int array_of_sizes[], const int array_of_subsizes[], const int array_of_starts[], int order) const

Конструктор типа для субмассива создает тип данных MPI, описывающий n-мерный субмассив n-мерного масива. Субмассив может находиться в любом месте полного массива, и может быть любого ненулевого размера вплоть до размера полного массива, пока он находится внутри этого массива. Этот конструктор позволяет создавать типы файлов для доступа к массивам, разбитым между процессами по блокам через один файл, содержащий глобальный массив.

Этот конструктор типа может работать с массивами с различным числом измерений и порядком размещения матриц как Си, так и ФОРТРАНА (т.е. по строкам или по колонкам). Кстати, программы на Си могут использовать порядок ФОРТРАН и наоборот.

Параметр ndims определяет количество измерений в полном массиве данных и дает количество элементов в array_of_sizes, array_of_subsizes, и array_of_starts.

Количество элементов типа oldtype в каждом измерении n-мерного массива и запрошенном масиве определяется параметром array_of_sizes и array_of_subsizes, соответственно. Для любого измерения i ошибочно определять array_of_subsizes[i] < 1 или array_of_subsizes[i] > array_of_sizes[i].

array_of_starts содержит начальные координаты каждого измерения субмассива. Массивы считаются индексируемыми с нуля. Для любого измерения i ошибочно определять array_of_starts[i] < 0 или array_of_starts[i] > (array_of_sizes[i] - array_of_subsizes[i]).

Совет пользователям: В программе на ФОРТРАН с индексами массивов, индексирующимися с 1, если начальная координата измерения субмассива - n, тогда элемент в array_of_starts для этого измерения равен n-1. []

Аргумент order определяет порядок хранения субмассива и полного массива. Должен быть одним из следующих значений:
MPI_ORDER_C - порядок для массивов Си (т.е. строка - главная)
MPI_ORDER_FORTRAN - порядок для массивов ФОРТРАНА (т.е. главный - столбец)

ndims-мерный субмассив (newtype) без дополнительных отступов может быть определен функциеий Subarray() следующим образом:

${\tt newtype}=$ $Subaray(ndims,\{size_0,size_1,...,size_{ndims-1}\},$
$\{subsize_0,subsize_1,...,subsize_{ndims-1}\},$
$\{start_0,start_1,...,start_{ndims-1}\},{\tt oldtype})$

Пусть карта типа для oldtype имеет форму:

$\{(type_0,disp_0),(type_1,disp_1),...,(type_{n-1},disp_{n-1})\}$

где $type_i$ - стандартный тип данных MPI, и пусть ex будет длиной oldtype. Тогда рекурсивно определим функцию Subarray() используя следующие три уравнения. Уравнение 1 определяет основной шаг. Уравнение 2 определяет рекурсивный шаг, когда order = MPI_ORDER_FORTRAN, и уравнение 3 определяет рекурсивный шаг, когда order = MPI_ORDER_C.

Subarray(1,$\{size_0\},\{subsize_0\},\{start_0\},$
$\{(type_0,disp_0),(type_1,disp_1),...,(type_{n-1},disp_{n-1})\})$
= {MPI_LB,0),
$(type_0,disp_0+start_0\times ex),...,(type_{n-1},disp_{n-1}+start_0\times ex),$
$(type_0,disp_0+(start_0+1)\times ex),...,(type_{n-1},disp_{n-1}+(start_0+1)\times ex),...$
$(type_0,disp_0+(start_0+subsize_0-1)\times ex),...,(type_{n-1},disp_{n-1}+(start_0+subsize_0-1)\times ex),$
$({\tt MPI\_UB},size_0\times ex)\}$

Subarray($ndims,\{size_0,size_1,...,size_{ndims-1}\},$
$\{subsize_0,subsize_1,...,subsize_{ndims-1}\},$
$\{start_0,start_1,...,start_{ndims-1}\},{\tt oldtype})$
= Subarray($ndims-1,\{size_1,size_2,...,size_{ndims-1}\},$
$\{subsize_1,subsize_2,...,subsize_{ndims-1}\},$
$\{start_1,start_2,...,start_{ndims-1}\},$
Subarray(1,$\{size_0\},\{subsize_0\},\{start_0\},{\tt oldtype}))$

Subarray($ndims,\{size_0,size_1,...,size_{ndims-1}\},$
$\{subsize_0,subsize_1,...,subsize_{ndims-1}\},$
$\{start_0,start_1,...,start_{ndims-1}\},{\tt oldtype})$
= Subarray($ndims-1,\{size_0,size_1,...,size_{ndims-2}\},$
$\{subsize_0,subsize_1,...,subsize_{ndims-2}\},$
$\{start_0,start_1,...,start_{ndims-2}\},$
Subarray(1,$\{size_{ndims-1}\},\{subsize_{ndims-1}\},\{start_{ndims-1}\},{\tt oldtype}))$

Для примера использования MPI_TYPE_CREATE_SUBARRAY в контексте ввода-вывода см. главу Subarray Filetype Constructor .


next up previous contents
Next: Конструктор типа данных ``распределенный Up: Новые функции манипуляции типами Previous: Настоящая длина типов данных   Contents
Alex Otwagin 2002-12-10