(Предположим, что все матрицы хранятся в строчном порядке.) Пример, иллюстрирующий проблему, заключается в распределении матрицы 10x10 по сетке 3x3, так что размер подматриц в каждом node выглядит так:
|-----+-----+-----|
| 3x3 | 3x3 | 3x4 |
|-----+-----+-----|
| 3x3 | 3x3 | 3x4 |
|-----+-----+-----|
| 4x3 | 4x3 | 4x4 |
|-----+-----+-----|
Я видел много сообщений в Stackoverflow (например, отправка блоков 2D-массива в C с использованием MPI и раздел MPI матрица в блоки). Но они имеют дело только с блоками одинакового размера (в этом случае мы можем просто использовать MPI_Type_vector
или MPI_Type_create_subarray
и только один вызов MPI_Scatterv
).
Итак, мне интересно, какой самый эффективный способ в MPI разбросать матрицу в сетку процессоров, где каждый процессор имеет блок с указанным размером.
P.S. Я также посмотрел на MPI_Type_create_darray
, но, похоже, не позволяет указать размер блока для каждого процессора.