Параллельное и распределенное программирование на С++
Шрифт:
MPI_Cart_create
(MPI_Comm CommOld, int NDims, int *Dims, int *Periods, int Reorder, MPI_Comm *CommCart)
Создает новый коммуникатор, к которому присоединяется топологическая информация
int
MPI_Cart_sub
(MPI_Comm Comm, int *RemainDims, MPI_Comm *CommNew);
Делит коммуникатор на подгруппы, которые образуют декартовы подсистемы более низкой размерности
int
MPI_Cart_shift
(MPI_Comm Comm, int Direction, int Display,int *Source,int *Destination);
Считывает
int
MPI_Cart_map
(MPI_Comm CommOld, int NDims, int *Dims, int *Periods, int *Newrank);
Преобразует процесс в декартову топологическую информацию
int
MPI_Cart_get
(MPI_Comm Comm, int MaxDims, int *Dims, int *Periods, int *Coords);
Возвращает декартову топологическую информацию, связанную с коммуникатором
int
MPI_Cart_coords
(MPI_Comm Comm, int Rank, int MaxDims, int *Coords);
Вычисляет координаты процесса в декартовой топологии при заданном ранге в группе
int
MPI_Comm_create
(MPI_Comm Comm, MPI_Group Group, MPI_Comm *CommOut) ;
Создает новый коммуникатор
int
MPI_Comm_rank
(MPI_Comm Comm, int *Rank ) ;
Вычисляет и возвращает ранг вызывающего процесса в коммуникаторе
int
MPI_Cart_rank
(MPI_Comm Comm, int *Coords, int *Rank );
Вычисляет и возвращает ранг процесса в коммуникаторе при заданном декартовом местоположении
int
MPI_Comm_compare
(MPI_Comm Comm1, MPI_Comm Comm2, int *Result);
Сравнивает два коммуникатора Comm1 и Comm2
int
MPI_Comm_dup
( MPI_Comm CommIn, MPI_Comm *CommOut) ;
Дублирует уже существующий коммуникатор со всей его кашированной информацией
int
MPI_Comm_free
( MPI_Comm *Comm) ;
Отмечает объект коммуникатора как освобожденный
int
MPI_Comm_group
( MPI_Comm Comm, MPI_Group *Group);
Получает доступ к группе, связанной с заданным коммуникатором
int
MPI_Comm_size
( MPI_Comm Comm, int *Size);
Вычисляет и возвращает размер группы, связанной с заданным коммуникатором
int
MPI_Comm_split
(MPI_Comm Comm, int Color,int Key,MPI_Comm *CommOut) ;
Создает новые коммуникаторы на основе цветов и ключей
int
MPI_Comm_test_inter
( MPI_Comm Comm, int *Flag);
Определяет,
int
MPI_Comm_remote_group
( MPI_Comm Comm, MPI_Group *Group);
Получает доступ к удаленной группе, связанной с заданным inter-коммуникатором
int
MPI_Comm_remote_size
( MPI_Comm Comm, int *Size);
Вычисляет и возвращает размер удаленной
группы, связанной с заданным inter-
коммуникатором
Анатомия MPI-задачи
На рис.9.1 представлена каркасная MPI-программа. Задачи, выполняемые этой программой, просто сообщают свои ранги MPI-задаче с нулевым рангом. Каждая MPI-программа должна иметь по крайней мере функции MPI_Init и MPI_Finalize. Функция MPI_Init инициализирует MPI-среду для вызывающей задачи, а функция MPI_Finalize освобождает ресурсы этой MPI-задачи. Каждая MPI-задача должна вызвать функцию MPI_Finalize до своего завершения. Обратите вни м ание на обращения к функция м MPI_COMM_rank HMPI_COMM_Size . Они используются для получения значений ранга и количества процессов, которые принадлежат MPI-приложению. Эти функции вызываются большинством MPI-приложений. Вызов же остальных MPI-функций зависит от конкретного приложения. MPI-среда поддерживает более 300 функций (подробная информация представлена в соответствующей документации).
Рис. 9.1. MPI-программа
Использование шаблонных функций для представления MPI-задач
Шаблоны функции позволяют обоб щ ать процедуры для любо г о типа данных. Рассмотрим процедуру умножения, которая работает для любо г о типа данных (точнее, для типов данных, для которых операция умножения имеет смысл),
template<class T> T multiplies(T X, T Y) {
return( X * Y);
}
Для такой шаблонной функции, как эта, используются необходимые пара м етры дл я типа Т. Пара м етр T означает некоторый тип данных, который будет реально ***казан при реализации это г о шаблона. Так, мы можем реализовать функцию multiplies следую щ им образом.