Как нам организовать свою собственную MPI-ферму под MS Windows  

А.П.Сапожников Не было у бабы заботы - купила порося...
Древнекитайская поговорка

Почему именно под Windows? Просто потому, что я, как и многие пользователи, люблю Linux еще менее, чем Windows. Но это, конечно, дело вкуса. Здесь же написано про то, что попробовал сам. А на машине у меня стоит Windows-2000 и Compaq Fortran 6.6.
Увы, стоит сразу же предуведомить читателя, что годится далеко не каждый Windows, а только Windows-2000/NT/XP Professional, Home-edition уже не годится.

Что такое MPI-ферма? Это многопроцессорная вычислительная система, в которой основным межпрограммным интерфейсом является известный с 1995 года Message Passing Interface, сокращенно - MPI [1,2]. Зачем нужна многопроцессорность? Чтобы быстрее считать!
Начало 21 века характеризуется бурным развитием кластеростроения. В каждом приличном вычислительном центре на смену традиционным дорогущим системам с небольшим числом процессоров появляются сравнительно недорогие, легко наращиваемые фермы (кластеры) из потенциально большого числа процессоров от Intel или DEC. Такую ферму можно заказать "под ключ" у энтузиастов из ИПМ или даже собрать самостоятельно, как это было сделано в ЛИТ ОИЯИ. Доступность таких ферм вызывает у пользователей желание перенести туда свои программы. У большинства из них это желание пропадает, когда они узнают, что им придется серьезно поработать над своими программами с целью их "распараллеливания". Однако кое-кто серьезно готов на все, лишь бы их программа могла считаться побыстрее. И прежде всего эти пользователи думают: а нельзя ли мне получить такую ферму в свое собственное, полное владение?

Таких пользователей не может не радовать возможность:
  1. купить в магазине системный блок IBM PC, где установлен не один, а целых 2 (два!) процессора;
  2. а еще дешевле - поставить в свой компьютер процессор, построенный на базе технологии HyperThreading, основополагающие сведения о которой можно узнать из [3]. "Не два, но полтора!" - говорил в подобных случаях Козьма Прутков.

И то и другое сейчас вполне реально, и даже не слишком дорого. Более того, существуют владельцы персональных компьютеров, даже и не подозревающие о том, что у них уже есть немного более, чем один процессор! Имея такое чудо в собственном рабочем кабинете и освоив идеологию MPI, можно не торопясь распараллеливать свои программы в интимной обстановке и только потом переносить их для "промышленного счета" на общедоступную ферму с большим числом процессоров. Более того - MPI можно осваивать и на традиционной, однопроцессорной машине!

Итак, сегодня у Вас есть реальный шанс получить на своем рабочем столе полигон для автономной подготовки программ, пригодных для эксплуатации на общедоступных кластерах. А кому-то и самого этого полигона окажется достаточно, ведь его процессор может быть намного быстрее, чем процессоры казенного кластера, купленные несколько лет назад!
  1. Скачайте себе из Интернета дистрибутив MPI. Он представляет собой единственный исполняемый файл объемом около 5 Мбайт. Просто запустите его и скажите, в какую директорию Вы хотите его распаковать. Я поставил себе MPICH.nt.1.2.5, взятый с сайта www-unix.mcs.anl.gov/mpi/mpich/. В распакованном виде это хозяйство занимает около 10 Мбайт. Если теперь Вы запустите Диспетчер задач Windows (обычно для этого нажимают известные 3 кнопки: Ctrl+Alt+Del - sic!) Вы увидите в списке задач MPD.exe - это так называемый MPI-демон. Целью его жизни является обслуживание межпроцессных коммуникаций, необходимых для работы Ваших MPI-программ.

  2. Установка пакета MPI обычно происходит быстро и без хлопот. Предположим, Вы поставили его в директорию C:\MPI. Как теперь им пользоваться? Вы, конечно, прочитали "MPI - the complete reference" [1] или хотя бы известный опус "Как нам распараллелить нашу программу" [4], поэтому здесь расскажем только о том, как настроить Compaq Fortran на работу под MPI.

    Итак: откройте Ваш "WorkSpace" или создайте новый.

    1. в меню
      Project - Settings - C/C++ - Code generation
      установите
      "Calling convention" = cdecl*
    2. в меню
      Project - Settings - Fortran - External procedures
      установите
      "Argument passing conventions" = C, by reference
    3. в меню
      Project - Settings - Fortran - Preprocessor - Include and USE Path
      добавьте
      C:\MPI\Sdk\include
    4. в меню
      Project - Settings - Link - General - Object/Library modules
      добавьте
      C:\MPI\Sdk\lib\mpich.lib

Для чего сие надобно?
Во-первых, чтобы при вызове подпрограмм параметры передавались по ссылке и в том порядке, который принят в С-компиляторе (подпрограммы из mpich.lib написаны на языке С и предназначены как для вызова из фортрана, так и из С!).
Во-вторых, чтобы C и Фортран-компиляторы знали, где искать основные MPI-headers mpi.h и mpif.h и подпрограммы, входящие в состав пакета MPI.

Вот вроде бы и все. Теперь компиляция будет делаться в совместимом с MPI режиме, а линкер будет знать, откуда брать программы пакета MPI. Предположим, Вы успешно собрали MyProg.exe - исполняемый файл своей программы, и запустили его на счет. Невооруженным глазом трудно заметить, на сколько же процессов "распараллелилась" Ваша программа, поэтому не поленитесь напечатать полученное в начале ее работы значение функции MPI_COMM_SIZE. Например, так:

call MPI_COMM_RANK(MPI_COMM_WORLD,MPI_rank,ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD,MPI_size,ierr)
if(MPI_rank.eq.0) write(*,*) ' MPI-run using',MPI_size,' processes'

Вот теперь, выполняя привычную команду MyProg.exe, Вы получите верные сведения о том, что используется ровно 1 (один) процесс! Оказывается, запускать MPI-программу, распараллеленную на несколько, скажем, на 2 процесса (больше на нашей собственной, настольной ферме реально и не стоит!), Вам придется через посредника, в роли которого выступает программа MPIRUN:

c:\mpi\mpd\bin\mpirun.exe -np 2 MyProg.exe

или
c:\mpi\mpd\bin\mpirun.exe -np 2 MyProg.exe > Output.txt
,

если Вы намерены переадресовать вывод MyProg в файл Output.txt

А теперь, если Вам, паче чаяния, удалось пройти через все эти (впрочем не слишком большие) трудности, и Вы все еще не оставили мысль о собственной MPI-фермочке под Windows, или же воодушевились мечтой о небольшом MPI-колхозе, прочитайте более солидный манускрипт в файле C:\mpi\mpichntman.pdf. Но можно и ограничиться только что полученными навыками, их вполне хватит для того, чтобы успешно распараллелить Вашу собственную программу, а затем считать ее на Вашей собственной 2- или 1.5-процессорной ферме.

Литература:

  1. MPI: The complete Reference. MIT Press, Cambridge, Massachusetts, 1997.
  2. http://parallel.ru
  3. http://www.intel.com/technology/hyperthread/
  4. http://www.jinr.ru/programs/publ/bulletin/bulletin.htm