Я хотел бы скопировать матрицу (nxn), которая распределена по сетке процессов (pxq) для всех процессов, чтобы каждый процесс имел всю матрицу (nxn), аналогичную операции allgather из mpi.
Я понимаю, что подпрограмма scalapacks pdgemr2d — это то, что нужно, но примеры и документация не помогли мне разобраться. Моя идея заключалась в том, чтобы ввести второй контекст blacs, состоящий только из одного процесса, который также является mpi_root. pdgemr2d копирует всю информацию в эту сетку 1x1. Затем mpi_root выполняет широковещательную рассылку всем остальным процессам.
Я использую фортран-интерфейс scalapack/blacs.
Вот куча вопросов:
- Разумна ли моя идея, изложенная выше, или есть (канонический) способ с лучшей производительностью?
- В этом контексте очень много контекстов и я не до конца понимаю, правильно ли я их разделяю: Все мои процессы pxq находятся в MPI_WORLD_COMMUNICATOR, этот коммуникатор также используется как контекст blacs для сетки. Тогда корень является частью MPI_WORLD, контекста сетки и контекста 1x1. Таким образом, у него есть часть данных, которые также должны быть каким-то образом отправлены из контекста pxq в контекст 1x1. Правильно ли это и работает ли это вообще?
- Последний аргумент pdegemr2d — ictxt, который должен быть контекстно-унифицированным для всех участвующих процессов, это MPI_WORLD?
- Нужны ли мне разные вызовы для членов сетки pxq и одного члена сетки 1x1? И если да, то какая будет разница?