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() следующим образом:
Пусть карта типа для oldtype имеет форму:
где - стандартный тип данных MPI, и пусть ex будет длиной oldtype. Тогда рекурсивно определим функцию Subarray() используя следующие три уравнения. Уравнение 1 определяет основной шаг. Уравнение 2 определяет рекурсивный шаг, когда order = MPI_ORDER_FORTRAN, и уравнение 3 определяет рекурсивный шаг, когда order = MPI_ORDER_C.
Subarray(1,
= {MPI_LB,0),
Subarray(
= Subarray(
Subarray(1,
Subarray(
= Subarray(
Subarray(1,
Для примера использования MPI_TYPE_CREATE_SUBARRAY в контексте ввода-вывода см. главу Subarray Filetype Constructor .