Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #65, АПРЕЛЬ 2006 г.

коммунистические вычисления

ALEK SILVERSTONE

Спецвыпуск: Хакер, номер #065, стр. 065-070-3


ТЕПЕРЬ ПОДКЛЮЧИМ MPICH К МОЕМУ ЛЮБИМОМУ DELPHI. КАК НИ ШАМАНЬ, LIB-ФАЙЛЫ К НЕМУ НЕ ПОДКЛЮЧИШЬ, ЧТО И НЕ ТРЕБУЕТСЯ. В ПОСТАВКУ MPICH ВХОДЯТ 3 DLL, КОТОРЫЕ СТАВЯТСЯ В ПАПКУ %WINDIR%\SYSTEM32 И КОТОРЫЕ КАК РАЗ РЕАЛИЗУЮТ ЕГО ФУНКЦИОНАЛЬНОСТЬ. СООТВЕТСТВЕННО, НАМ НУЖНО ТОЛЬКО НАПИСАТЬ ЗАГОЛОВОЧНЫЙ МОДУЛЬ ДЛЯ ЭТИХ БИБЛИОТЕК. КОГДА-ТО Я САМ ПЕРЕВОДИЛ ХЭДЕРЫ НА С ИЗ СТАНДАРТНОЙ ПОСТАВКИ, НО ПОЗЖЕ НАШЕЛ МОДУЛЬ ДЛЯ FREE PASCAL COMPILER'А И СТАЛ ПОЛЬЗОВАТЬСЯ ИМ, НЕМНОГО ПОДПРАВИВ. ХВАТАЙ ЭТОТ МОДУЛЬ НА НАШЕМ ДИСКЕ, КОПИРУЙ В ПАПКУ С ПРОЕКТОМ И ПИШИ В ХОДЕ USES MPI. ПРОЩЕ ПРОСТОГО!

приступим, наконец, к самому MPI.

Инициализацию обмена сообщениями выполняет функция MPI_Init. Кроме того, она решает еще одну важную задачу. После осуществления вызова программист может быть уверенным, что все потоки запущены и что все они выполнили этот оператор. В качестве параметров указываются количество аргументов командной строки и сами аргументы, передающиеся во все потоки. Завершение обмена сообщениями выполняет функция MPI_Finalize без параметров.

Каждый поток в MPI имеет собственный номер, называемый рангом потока. Это число используется в большинстве функций передачи сообщений. Для получения своего ранга процесс может использовать функцию MPI_Comm_rank с двумя параметрами. Первый — коммуникатор, которому принадлежит данный процесс. В терминологии MPI коммуникатором называется группа потоков. Все потоки по умолчанию принадлежат коммуникатору MPI_COMM_WORLD, и нумерация идет с нуля. Программист может создавать собственные коммуникаторы и вводить в них собственную нумерацию. Второй параметр MPI_Comm_rank — это адрес, по которому будет записан ранг процесса. Для получения общего количества процессов в коммуникаторе используется функция MPI_Comm_size с такими же параметрами. Один из вариантов структуры MPI-программы смотри на врезке. Тут мы предполагаем, что ветвь 0 главная, а остальные управляются ею. Однако можно сделать и совсем по-другому, предоставляется полная свобода. Главное — не запутаться во множестве ветвей :).

Скелет MPI-программы

var p:pointer;

rank,size:integer;

begin

// не передаем параметры

p:=nil;

rank:=0;

MPI_Init(@rank,p);

MPI_Comm_rank(MPI_COMM_WORLD,@rank);

MPI_Comm_size(MPI_COMM_WORLD,@size);

Назад на стр. 065-070-2  Содержание  Вперед на стр. 065-070-4