На рис.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 функций (подробная информация представлена в соответствующей документации).
Использование шаблонных функций для представления MPI-задач
Шаблоны функции позволяют обоб щ ать процедуры для любо г о типа данных. Рассмотрим процедуру умножения, которая работает для любо г о типа данных (точнее, для типов данных, для которых операция умножения имеет смысл),
template T multiplies(T X, T Y) {
return( X * Y);
}
Для такой шаблонной функции, как эта, используются необходимые пара м етры дл я типа Т.Пара м етр Tозначает некоторый тип данных, который будет реально ***казан при реализации это г о шаблона. Так, мы можем реализовать функцию multiplies() следую щ им образом.
//. . .
multiplies(3.2,4.5);
multiplies(7, 2) ; multiplies(«7/2»,«3/4»); //.. .
Здесь параметр Tза м еняется типо м double, intи rationalсоответственно, определяя тем самым точную реализацию операции умножения. Умножение д ля разных типов данных опре д еляется по-разно м у. Это означает, что д ля разных типов данных выполняется различный код. Шаблоннал функция позволяет написать одну операцию у м ножения (в виде функции multiplies()) и при м енить ее ко м ноги м различны м типа м данных.
Реализация шаблонов и модельБРМО (типы данных)
Пара м етризованные функции м ожно использовать с MPI-интерфейсо м д ля обработки ситуаций, в которых все процессы выполняют одинаковый код, но работают сразличны м и типа м и данных. Так, определив значение TaskRankпроцесса, м ы м о-жем распознать, с каки м и данны м и и данны м и какого типа должен работать процесс. В листинге 9.2 показано, как реализовать различные задачи д ля различных рангов.
//Листинг 9.2. Использование шаблонных функций для // определения «фронта работ» МР1-задач
int main(int argc, char *argv[]) {
//.. .
int Tag = 2; int WorldSize; int TaskRank; MPI_Status Status; MPI_Init(&argc,&argv) ,-
MPI_Comm_rank (MPI_COMM_WORLD, &TaskRank) ; MPI_Comm_size (MPI_COMM_WORLD, &WorldSize) ; //.. .
switch(TaskRank) {
case 1: multiplies(3.2,4.6); break;
case 2: multiplies(X,Y)
break; //case n:
//.. .
}
}
Поскольку не существует двух задач с одинаковым ранго м, все ветви в инструкции caseлистинга 9.2 будут выполнены различны м и MPI-задача м и. Кро м е того, такой тип параметризации м ожно распространить на контейнерные аргу м енты шаблонных функций. Это позволит передавать одной и той же шаблонной функции различные контейнеры объектов, содержащие различные типы объектов. Напри м ер, в листинге 9.3 показана обоб щ енная шаблоннал функция search ().
// Листинг 9.3. Использование контейнерных шаблонов в // качестве аргументов шаблонных функций
template bool search(T Key, graph) {
//. . -
locate(Key) //. . .
}
// . . .
MPI_Comm_rank(MPI_COMM_WORLD, &TaskRank); // . . .
switch(TaskRank) {
case 1: {
graph bullion;
search search(«gold», bullion);
}
break; case 2: {
graph Coordinates; search((X,Y),Coordinates);
}
break;
//. . .
В листин г е 9.3 процесс, у которого TaskRank =1, выполняет поиск в графе (graph)сименем bullion,содержа щ е м string<^beKTbi,а процесс, у которого TaskRank = 2,выполняет поиск в графе Coordinates,содержа щ е м ко м плексные числа. Мы не должны из м енять функцию search(), чтобы приспособиться к други м дан н ы м или типам данных, да и MPI-програм м а в это м случае и м еет более простую структуру, поскольку м ы м оже м м ногократно использовать шаблонную функцию поиска (search)для прос м отра контейнера graph,содержа щ его данные любого типа. Использование шаблонов значительно упро щ ает 5РМГ>програ мм ирование. Че м более об щ ей м ы делае м MPI-задачу, те м более гибкой она становится. Кро м е того, если некоторый шаблон прошел этап отладки и тестирования, надежность всех построенных на его основе МР1-задач м ожно считать довольно высокой, поскольку все они выполняют одинаковый код.
Читать дальше