Subarray позволяет вам описать один блок / фрагмент большего многомерного массива.Если у каждой задачи MPI есть один фрагмент / блок большого глобального массива (или если вы передаете куски локальных массивов между задачами), тогда MPI_Type_create_subarray - это путь;синтаксис очень прост.Для решения таких вещей, как PDE в регулярных сетках, это распределение очень распространено - у каждого процессора есть свой кусок глобальной сетки, с максимально возможным количеством локальных ячеек сетки.В случае MPI-IO каждая задача MPI создала бы подрешетку, соответствующую ее части глобального массива, и использовала бы ее в качестве представления для чтения / записи своей части домена в файл, содержащий все данные.
MPI_Type_create_darray допускает более сложные шаблоны распределенных массивов, чем single-chunk-each.Для вычислений с распределенной линейной алгеброй может иметь смысл распределять некоторые матрицы построчно - скажем, если есть 5 mpi-задач, задача 0 получает строки 0, 5, 10 ..., а задача 1 получает строки 1, 6,11 и так далее.Другие матрицы могут быть распределены по столбцам;или вы можете распределить их по блокам строк, столбцов или обоих.Эти распределения данных такие же, как были в злополучном HPF , что позволяет таким образом определять параллельные для данных схемы размещения массивов на основе массив за массивом.
Единственный способ, которым я когда-либо использовал MPI_Type_create_darray, и, действительно, единственный способ, которым я когда-либо видел его, - это создать представление MPI-файла большой матрицы для распределения данных в циклических fashion, чтобы можно было прочитать файл и затем использовать scalapack для выполнения параллельных операций линейной алгебры над распределенной матрицей.