Создание и использование собственных типов данных.
Общие правила:
пользовательские описатели типов создаются на базе созданных ранее пользовательских описателей, и на базе встроенных описателей;
встроенные описатели имеются для ВСЕХ стандартных типов Си: MPI_INT, MPI_CHAR, MPI_LONG, MPI_FLOAT, MPI_DOUBLE и так далее; тип MPI_BYTE служит для передачи двоичных данных;
после конструирования, но перед использованием описатель должен быть зарегистрирован функцией MPI_Type_commit;
после использования описатель должен быть очищен функцией MPI_Type_free;
об этом подробнее здесь.
При первом прочтении можете пропустить описание конструкторов MPI_Type_vector и MPI_Type_indexed, сразу перейдя к MPI_Type_struct.
MPI_Type_contiguous : самый простой конструктор типа, он создает описание массива. В следующем примере оба вызова MPI_Send делают одно и то же.
int a[16];
MPI_Datatype intArray16;
MPI_Type_contiguous( 16, MPI_INT, &intArray16 );
MPI_Type_commit( &intArray16 );
MPI_Send( a, 16, MPI_INT, ... );
MPI_Send( a, 1, intArray16, ... );
MPI_Type_free( &intArray16 );
Функция MPI_Type_count вернет количество ячеек в переменной составного типа: после MPI_Type_count( intArray16, &count ) значение count станет равным 16. Как правило, прямой необходимости использовать эти функции нет, и тем не менее.
MPI_Type_vector : служит для описания множества однотипных равноудаленных в памяти массивов данных. Позволяет весьма изощренные манипуляции с данными. Он создает описание для не-непрерывной последовательности элементов, которые, в свою очередь, составлены из непрерывной последовательности ячеек базового (уже определенного) типа:
MPI_Type_vector(
int count, /* количество элементов в новом типе */
int blocklength, /* количество ячеек базового типа в одном элементе */
int stride, /* расстояние между НАЧАЛАМИ эл-тов, в числе ячеек */
MPI_Datatype oldtype, /* описатель базового типа, т.е. типа ячейки */
MPI_Datatype &newtype /* cсылка на новый описатель */
);
То есть:
новый тип состоит из элементов;
каждый элемент является массивом ячеек базового типа;
расстояние в количестве ячеек задается между НАЧАЛАМИ элементов, а НЕ между КОНЦОМ предыдущего и НАЧАЛОМ следующего; таким образом, элементы могут и располагаться с разрывами, и "налезать" друг на друга.
Функция MPI_Type_hvector полностью ей аналогична, за одним исключением: расстояние между элементами задается не в количестве ячеек базового типа, а в байтах. В примере показывается применение обеих этих функций.
Do'stlaringiz bilan baham: |