который содержится в листинге 9.5, необходимо запустить в нашей среде MPICH с по
$ mpirun -np 16 /trap/search_n_rescue
// Листинг 9.5. Реализация MPI-задачами простого
// поиска и имитации спасения поврежденных
// объектов
template<T> bool travel(vehicle *Transport,
set<T> Location, T Object)
{
//.. .
Transport->startEngine(); Transport->moveForward(XDegrees); Transport->turnLeft (YDegrees); //.. .
if (Location.find(Transport->location() == Object){ // . .. rescue()
}
//.. .
}
int main(int argc, char *argv[])
326 Глава 9. Реализация моделей SPMD и MPMD с помощью шаблонов..
{
//...
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: {
//. . .
car * Car;
set<streets> SearchSpace
travel<streets>(Car, SearchSpace,Street); //.. .
}
break;
case 2:
{
//.. .
helicopter *BlueThunder; set<air_space> NationalAirSpace; travel<air_space> (BlueThunder,
NationalAirSpace,
AirSpace);
//.. .
}
//case n: //. . .
}
}
Программа search_n_rescue будет запущена в 16 процессах, причем все процессы потенциально могут выполняться на различных процессорах, а все процессоры — находиться на различных компьютерах. Несмотря на то что все процессы выполняют один и тот же код, их действия могут радикально различаться (как и данные, с которыми они работают). Шаблоны и полиморфизм позволяют отличать одну MPI-задалу от другой (а значит, и данные, которые они будут использовать). Обратите внимание на то, что в листи
Основные два типа полиморфизма, которые мы здесь демонстрируем, — это
Таблица 9.2. Различные типы полиморфизма, которые можно использовать для упрощения МРI-задач
| Динамический | Наследование и виртуальные методы | Вся информация, необходимая для определения того, какие виртуальные методы будет вызывать функция, неизвестна до выполнения программы |
| Параметрический | Шаблоны | Механизм, в котором один и тот же код используется для различных типов, которые передаются как параметры |
