Интерфейс передачи сообщений MPI
Лабораторная работа 0.5 Виртуальные топологии в MPI
Виртуальные топологии
Кроме списка процессов и контекста обмена с коммуникатором может быть связана дополнительная информация. Важнейшей разновидностью такой информации является топология обменов. В MPI топология позволяет сопоставить процессам, принадлежащим некоторой группе, других, отличных от обычной, схем адресации. Топологии обменов сообщениями в MPI являются виртуальными.Это значит, что они не связаны с физической топологией коммуникационной сети параллельной вычислительной системы.
Топологией в данном случае называют структуру соединений линий и узлов сети без учета характеристик самих узлов. Узлами здесь являются процессы, соединениями - каналы обмена сообщениями, а сетью мы считаем все процессы, входящие в состав параллельной программы. Часто в прикладных программах процессы естественно упорядочить в соответствии с логикой задачи. Такая ситуация возникает, например, если выполняются расчеты, в которых используются решетки (сетки). Это может быть при программировании сеточных методов решения дифференциальных уравнений, а также в других случаях.
В MPI существуют два типа топологии:
- декартова топология - прямоугольная решетка произвольной размерности (рис. 6.4);
- топология графа.
Над топологиями можно выполнять различные операции. Декартовы решетки можно расщеплять на гиперплоскости, удаляя некоторые измерения. Данные можно сдвигать вдоль выбранного измерения декартовой решетки.
Сдвигом называют пересылку данных между процессами вдоль определенного измерения. Вдоль избранного измерения могут быть организованы коллективные обмены.
Для того, чтобы связать структуру декартовой решетки с коммуникатором MPl_COMM_WORLD, необходимо задать следующие параметры:
- размерность решетки (значение 2 соответствует плоской, двумерной решетке);
- размер решетки вдоль каждого измерения (размеры {10, 15}, например, соответствуют плоской прямоугольной решетке, протяженность которой вдоль оси x составляет 10 узлов-процессов, а вдоль оси y - 15 узлов);
- периодичность вдоль каждого измерения (решетка может быть периодической, если процессы, находящиеся на противоположных концах ряда, взаимодействуют между собой).
MPI дает возможность системе оптимизировать отображение виртуальной топологии процессов на физическую с помощью изменения порядка нумерации процессов в группе.
Подпрограмма MPI_Cart_create (описания интерфейсов соответствующих подпрограмм имеются в Методическом пособии) создает новый коммуникатор, наделяя декартовой топологией исходный коммуникатор. MPI_Cart_create является коллективной операцией (эту подпрограмму должны вызывать все процессы из коммуникатора, наделяемого декартовой топологией).
После создания виртуальной топологии можно использовать соответствующую схему адресации процессов, но для этого требуется пересчет ранга процесса в его декартовы координаты и наоборот. Определить декартовы координаты процесса по его рангу в группе можно с помощью подпрограммы MPI_Cart_coords .
Обратным действием по отношению к MPI_Cart_coords обладает подпрограмма MPI_Cart_rank. С ее помощью можно определить ранг процесса по его декартовым координатам в соответствующем коммуникаторе.
Между процессами, организованными в декартову решетку, могут выполняться обмены особого вида. Это сдвиги, о которых мы уже упоминали. Имеются два типа сдвигов данных по группе из N процессов:
- циклический сдвиг на J позиций вдоль ребра решетки. Данные от процесса K пересылаются процессу с номером (J + K) mod N ;
- линейный сдвиг на J позиций вдоль ребра решетки, когда данные в процессе K пересылаются процессу с номером J + K,если ранг адресата находится в пределах между 0 и N.
Лабораторная работа
В заданиях лабораторной работы 0.5 предлагается дописать и модифицировать предлагаемый фрагмент программы на языке C, написанный с использованием процедур MPI.
Необходимый для выполнения данной лабораторной работы справочный материал можно найти на стр. 51 - 55 методического пособия "Средства программирования для многопроцессорных вычислительных систем".
Задание 1
В программе на языке C коммуникатор grid_comm наделяется топологией двумерной решетки с периодическими граничными условиями, причем системе разрешено изменить порядок нумерации процессов. В исходном тексте пропущены вызовы процедур, с помощью которых каждый процесс может определить свой ранг и декартовы координаты. Добавьте эти вызовы, откомпилируйте и запустите программу.
#include "mpi.h" #include <stdio.h> int main(int argc,char *argv[]) { MPI_Comm grid_comm; int dims[2]; int periodic[2]; int reorder = 1, q = 5, ndims = 2, maxdims = 2; int coordinates[2]; int my_grid_rank; int coords[2]; MPI_Comm row_comm; dims[0] = dims[1] = q; periodic[0] = periodic[1] = 1; coords[0] = 0; coords[1] = 1; MPI_Init(&argc, &argv); MPI_Cart_create(MPI_COMM_WORLD, ndims, dims, periodic, reorder, &grid_comm); printf("Process rank %i has coordinates %i %i\n", my_grid_rank, coordinates[0], coordinates[1]); MPI_Finalize(); return 0; }
Задание 2
Добавьте в программу из Задания 1 операции циклического и/или линейного сдвига вдоль определенного измерения.
Задание 3
Измените программу из Задания 1, наделив коммуникатор топологией некоторого графа. Детали обсудите с преподавателем.