Установка MPI на Linux Ubuntu
Доброго времени суток! С этой самой заметки начнется погружение в параллельный мир параллельного программирования, с целью научиться распараллеливать все, что написано на C/C++ и даже на Fortran. Инструментом нам послужит классическая библиотека MPICH версии 3.0. Но прежде, что такое MPI.
Как гласит википедия, MPI(Message Passing Interface) это программный интерфейс для передачи информации, который позволяет обмениваться сообщениями между процессами, выполняющими одну задачу. По русски говоря, этот интерфейс позволяет распараллелить задачу на несколько процессов в операционной системе. Что в некоторых случаях может серьезно улучшить производительность, когда как в других, наоборот ее ухудшить.
Библиотека MPICH, которую мы будем устанавливать, является одной из самых первых MPI библиотек, поэтому я назвал ее классической. На ее основе в будущем было построено большое множество коммерческих и открытых библиотек, возможно, про некоторые из них я тоже когда нибудь напишу. Приступим к установке.
Установка библиотеки MPI
Как я обожаю повторять, совершенно ничего мудреного в установке не обнаружено. Проходим на официальный сайт, в раздел загрузки . Там нас интересует табличка с платформами и версиями библиотеки, находим Ubuntu и скачиваем. Выглядит это вот так.
Попадаем на страницу Ubuntu packages и выбираем свою платформу. Я себе скачиваю amd64, вот из этого списка.
На этом приключения еще не закончились, мы попадаем на страницу с выбором зеркала для скачивания. Даже Африка есть, поразительно.
Выбираем ближайшее по географическому расположению зеркало, и вот у нас на диске deb пакет библиотеки, который мы устанавливаем двойным кликом. Как видите, больше сил понадобилось на то, чтобы ее скачать.
Запуск программ с использованием MPI
После установки в системе появились компиляторы для языков C/C++ и Fortran, которые называются соответственно mpicc/mpic++ и mpifortran. Каждый из них снабжен подробной документацией, что резко уменьшает продолжительность танцев с бубном.
Рассмотрим компиляцию и запуск на классическом примере — программа «Hello, world».
#include //Не забываем подключить библиотеку к проекту #include "/usr/include/mpich/mpi.h" using namespace std; int main(int argc, char **argv) < //Инициализируем mpi MPI_Init(&argc, &argv); cout
Компилируется это дело командой
mpic++ -o hello hello.cpp
И сразу запускаем с помощью mpiexec, параметр -n говорит о том, сколько процессов запустить для этой программы.
mpiexec -n 5 ./hello
Таким образом мы запустим 5 процессов.
Заключение
На этом заканчивается первое робкое знакомство с библиотекой MPI, мы ее установили и попробовали с ее помощью одновременно 5 раз поздороваться с миром. В следующем выпуске будут новые возможности MPI, а на сегодня у меня все, спасибо за внимание!
mpi install, running in Ubuntu 9
ссылаюсь на документ по адресу
http://cluster.linux-ekb.info/mpi1.php
скачал mpich 1.2.7.
начал устанавливать :
команда
./configure -with-arch=LINUX -with-device=ch_p4 -rsh=/usr/bin/ssh \--prefix=/usr/local/mpich-1.2.6/ch_p4
нормальна прошла вроде.
потом make прошла без вопросов.
однако make install сразу выводит error
не подскажете ли в чем проблема ?
nizamovich
22.11.09 00:23:17 MSK
mpi install, running in Ubuntu 9
список выведенный error в студию!
trex6 ★★★★★
( 22.11.09 00:44:01 MSK )
mpi install, running in Ubuntu 9
Прав, наверное, не хватает
kss ★★★★★
( 22.11.09 00:46:52 MSK )
mpi install, running in Ubuntu 9
aptitude install openmpi, не?
devl547 ★★★★★
( 22.11.09 00:51:32 MSK )
mpi install, running in Ubuntu 9
Для установки библиотеки MPI Chameleon, соответствующей стандарту MPI2, в Ubuntu вовсе не нужно собирать ее из исходников, как написано по указанной ссылке - так ты только захламишь систему. Для тебя уже всё собрано и лежит в репозиториях. Для установки выполняешь простую команду:
sudo apt-get install libmpich2-1.2 libmpich2-dev mpich2 mpich2-doc
и радуешься жизни. Для коммуникаций между узлами будет использоваться ssh. Тебе остается лишь настроить беспарольный доступ к узлам кластера. И всё.
twosev ★★
( 22.11.09 07:35:34 MSK )
Ответ на: mpi install, running in Ubuntu 9 от trex6 22.11.09 00:44:01 MSK
mpi install, running in Ubuntu 9
nizamovich@nizamovich-laptop:~/mpich_inst$ make install
if [ «/usr/local/mpich-1.2.7/ch_p4» = «/usr/local/mpich-1.2.7/ch_p4» ] ; then \
./bin/mpiinstall ; \
else \
./bin/mpiinstall -prefix=/usr/local/mpich-1.2.7/ch_p4 ; \
fi
mkdir: cannot create directory `/usr/local/mpich-1.2.7': Permission denied
**Error making directory /usr/local/mpich-1.2.7/ch_p4**
make: *** [install] Error 1
nizamovich@nizamovich-laptop:~/mpich_inst$
nizamovich
( 22.11.09 08:56:39 MSK ) автор топика
Ответ на: mpi install, running in Ubuntu 9 от twosev 22.11.09 07:35:34 MSK
mpi install, running in Ubuntu 9
nizamovich@nizamovich-laptop:~$ sudo apt-get install libmpich2-1.2 libmpich2-dev mpich2 mpich2-doc
[sudo] password for nizamovich:
Чтение списков пакетов. Готово
Построение дерева зависимостей
Чтение информации о состоянии. Готово
E: Не удалось найти пакет libmpich2-1.2
nizamovich
( 22.11.09 08:59:35 MSK ) автор топика
Ответ на: mpi install, running in Ubuntu 9 от nizamovich 22.11.09 08:59:35 MSK
Re: mpi install, running in Ubuntu 9
Подключи репозиторий universe и почитай какую-нибудь современную книжку по linux.
dn2010 ★★★★★
( 22.11.09 09:24:43 MSK )
Ответ на: mpi install, running in Ubuntu 9 от nizamovich 22.11.09 08:59:35 MSK
mpi install, running in Ubuntu 9
Как уже любезно заметил dn2010, указанные пакеты лежат в репозитории universe.
twosev ★★
( 22.11.09 09:38:59 MSK )
mpi install, running in Ubuntu 9
Если ставить из исходников, то для make install нужны права суперпользователя (для записи в подкаталоги в /usr/local).
oami ★★
( 22.11.09 22:31:43 MSK )
Ответ на: mpi install, running in Ubuntu 9 от oami 22.11.09 22:31:43 MSK
mpi install, running in Ubuntu 9
прошу прощения, однако я в танке.
[quote]
Как уже любезно заметил dn2010, указанные пакеты лежат в репозитории universe.
[/quote]
этот репозиторий получается на внешке же ?
как подключить , если я сижу через прокси ?
оптимальным было бы скачать самому и поставить
прошло все прекрасно , вроде
в результате make install получил
installed MPICH in /usr/local/mpich-1.2.6/ch_p4
/usr/local/mpich-1.2.6/ch_p4/sbin/mpiuninstall may be used to remove the installation.
в /usr/local мпич нормально появился, однако
nizamovich@nizamovich-desktop:~/example$ mpirun -np 3 hello
Приложение 'mpirun' может быть найдено в следующих пакетах:
* lam-runtime
* mpich-bin
* mpich-mpd-bin
* mpich-shmem-bin
* mpich2-mpd
* openmpi-bin
Попробуйте: sudo apt-get install
mpirun: command not found
nizamovich@nizamovich-desktop:~/example$ sudo apt-get install mpich2-mpd
[sudo] password for nizamovich:
Чтение списков пакетов. Готово
Построение дерева зависимостей
Чтение информации о состоянии. Готово
E: Не удалось найти пакет mpich2-mpd
nizamovich@nizamovich-desktop:~/example$ sudo apt-get install mpich-mpd-bin
Чтение списков пакетов. Готово
Построение дерева зависимостей
Чтение информации о состоянии. Готово
E: Не удалось найти пакет mpich-mpd-bin
nizamovich@nizamovich-desktop:~/example$ sudo apt-get install mpich-bin
Чтение списков пакетов. Готово
Построение дерева зависимостей
Чтение информации о состоянии. Готово
E: Не удалось найти пакет mpich-bin
nizamovich@nizamovich-desktop:~/example$ mpicc hello.c -o 1
Приложение 'mpicc' может быть найдено в следующих пакетах:
* lam4-dev
* libmpich-mpd1.0-dev
* libmpich-shmem1.0-dev
* libmpich1.0-dev
* libopenmpi-dev
* mpich2
Попробуйте: sudo apt-get install
mpicc: command not found
nizamovich@nizamovich-desktop:~/example$
Может кто нить скачает попробует поставить ))) ? кому не лень.
Как установить mpi на ubuntu
Здесь перечислены правила, в той или иной степени применимые к большинству реализаций MPI. Некоторые замечания относятся к особенностям Юникса, о которых не мешает помнить всегда, а работая с MPI - в особенности.
Утилиты построения и запуска MPI-приложений
Эти утилиты находятся в подкаталоге bin каталога MPI. Для их быстрого запуска наберите в командной строке или укажите в стартовом файле следующую команду:
C-Shell (файл .cshrc): setenv PATH путь_к_MPI/bin:$PATH bash (файл .bashrc): export PATH=путь_к_MPI/bin:$PATH DOS/Win (C:\AUTOEXEC.BAT): set PATH=путь_к_MPI\bin;%PATH%
Командные файлы с именами mpicc , mpiCC , mpif77 и т.д. предназначены для компиляции и компоновки соответствующих исходных текстов. Примеры:
mpicc mpi_ex0.c -o mpi_ex0 mpiCC mpi_ex1.cc -o mpi_ex1 mpif77 mpi_ex2.f -o mpi_ex2 -g -lm
При этом будет вызван обычный компилятор Си/Си++/Фортрана с указанной командной строкой, дополненной директивами подключения заголовочных и библиотечных файлов MPI.
Дополнительные ключи, не передаваемые компилятору, а обрабатываемые самим командным файлом, в спецификации не оговорены, но возможны. Например, в MPICH ключ -echo включает трассировку выполнения командного файла, полезную для поиска ошибок в инсталляции сопутствующего мат.обеспечения. У большинства утилит для вывода подсказки служит ключ -help .
Загрузчик MPI-приложений называется mpirun . У него ключей много разных и всяких, но только один из них является обязательным ( -np = number of processes):
mpirun -np N [mpirun_args] program_file [command_line_args . ]
Параллельное приложение будет образовано N задачами-копиями, загруженными из программного файла program_file . В момент запуска все задачи одинаковы (и имеют одинаковые параметры командной строки), но получают от MPI разные номера от 0 до N-1. Пример:
mpirun -np 5 ./mpi_ex0
Примечание: текущий каталог "./" указывается здесь явно, потому что без явного указания либо в имени программы, либо в переменной окружения PATH Юникс НЕ станет искать в нем приложение. Если по умолчанию PATH не содержит ".", Вы можете сами исправить .cshrc или .bashrc в своем домашнем каталоге:
C-Shell: set path = ( . $path ) bash: export PATH=.:$PATH
Документация
Практика показывает, что на период работы с той или иной библиотекой полезно бывает распечатать и держать под рукой ее заголовочные файлы из подкаталога include . В Convex MPI такой файл один: mpi.h , в MPICH их три: mpi.h (описания констант и типов), mpi_errno.h (коды ошибок и их описания) и binding.h (прототипы функций). В случае для Windows печатать рекомендуется не оригиналы, а копии, из которых вычищены все детали, относящиеся к реализации ("_declspec(dllimport)" и проч.).
- Manual pages через интерфейс man2html (не рекомендуется),
- непосредственно в виде HTML-страниц
Более детальную информацию, как-то: спецификацию, учебники и различные реализации MPI можно найти на сервере NetLib. Первоисточником для данного пособия является книга "MPI: The complete reference" издательства MIT Press - Вы найдете ее на этом сервере.
Отладка MPI-приложений обычным отладчиком
MPI-приложение состоит из множества процессов (по одному на каждую ветвь), в то время как большинство отладчиков позволяют отлаживать только один процесс. Здесь приведены некоторые общие советы, применимые более чем к одной из описываемых далее реализаций.
- если mpirun в данной реализации не требуется :
- если mpirun позволяет запустить ветвь 0 под отладчиком :
тяжелый случай.
Можно попробовать поместить MPI_Init() в следующее окружение:
/* в зависимости от реализации MPI, * прочие ветви в этот момент могут быть еще не запущены */ MPI_Init( &argc, &argv ); /* здесь уже все ветви заведомо запущены */ MPI_Comm_size( MPI_COMM_WORLD, &commSize ); MPI_Comm_rank( MPI_COMM_WORLD, &myRank ); printf("Rank=%d, PID=0x%X\n", myRank, getpid() ); if( myRank==0 ) < puts("MPI_Init ok, press any key. "); getch(); /* ветвь 0 остановится здесь */ > MPI_Barrier( MPI_COMM_WORLD ); /*остальные ветви остановятся здесь*/
Объединение в кластеры
- в какой момент определяется протокол для приемопередачи между ветвями приложения:
- в момент построения MPI,
- в момент конфигурирования MPI (если оно может быть выполнено без повторного построения),
- в момент построения приложения,
- автоматически на стадии выполнения приложения,
- на каких машинах (узлах) эта часть должна находиться,
- в какой момент она попадает на узел:
- при инсталляции MPI,
- при построении MPI-приложения,
- при запуске MPI-приложения, и т.д.
- требуется инсталляция,
- требуется компиляция+инсталляция,
- необходимо копировать вручную,
- копирование производится автоматически, и т.д.
- перенесен на большое количество Unix-платформ,
- поддерживает разные коммуникационные интерфейсы нижнего уровня (SVR4 IPC, TCP/IP, IBM MPL и несколько архитектурно-зависимых для массивно-параллельных машин - Intel NX и т.д.)
- полностью реализует все заложенные в спецификацию возможности.
./configure -comm=ch_shmem ./configure -comm=ch_p4 -device=shared
По умолчанию установка производится в каталог /usr/local/mpich . Следовательно, после установки делаем:
export PATH=/usr/local/mpich/bin:$PATH export MANPATH=/usr/local/mpich/man:$MANPATH
Документация и подсказки
Присутствует все необходимое: в виде man-pages, в виде HTML-страниц, в виде PostScript- и Tex- документов - в подкаталогах man , www и doc соответственно.
Кроме того, представляют интерес рассыпанные по подкаталогам README -файлы.Профилирование: PMPI, Jumpshot
Профилирующая библиотека в MPICH идентична базовой, а функция MPI_Pcontrol ничего не делает. Таким образом, формально эта часть спецификации поддерживается, фактически - нет.
Тем не менее, в MPICH включены средства, предназначенные облегчить генерацию и обработку статистики вручную . Это набор подпрограмм CLOG_Xxx, которыми программист может пользоваться для сохранения статистических данных, и написанное на Яве средство визуализации под названием Jumpshot . Ни то, ни другое мною не испытывалось.
Отладка
mpirun имеет ключи для запуска приложения из-под того или иного отладчика, например, -gdb запустит GDB, -xxgdb - GDB c графическим интерфейсом для X-Window, и так далее. Поскольку GDB позволяет отлаживать только один процесс, mpirun запускает под ним нулевую ветвь. Нулевая ветвь запускается автоматически и останавливается после входа в MPI_Init() , поэтому пытаться ставить точки останова до MPI_Init() в высшей степени бессмысленно. Запуск остальных ветвей производится в MPI_Init() нулевой ветви.
В последнее время ходит много слухов о параллельном отладчике TotalView, который якобы весьма перспективен, перенесен на многие платформы и совместим с MPI. Сам я никогда его не видел, но так говорят.
Объединение нескольких машин через P4
при конфигурировании MPICH (перед построением) должно быть выбрано "устройство P4":./configure -device=ch_p4 -comm=shared
- имя протокола для порта 514 прописано в файле /etc/services ,
- то же самое имя вместе с именем демона rshd прописано в файле /etc/inetd.conf ,
- имя ведущей машины прописано в файле .rhosts в домашнем каталоге пользователя, или в /etc/hosts.equiv
Программный файл приложения должен быть предварительно вручную скопирован на те машины, на которых его предполагается запускать mpirun 'ом.
Реализации, производные от MPICH
- оптимизации под конкретную платформу,
- учете архитектурных особенностей,
- дополнительных функциях и утилитах,
- совместимости с уже наработанным для данной платформы мат.обеспечением (отладчики, профайлеры и т.д.).
Большинство Win32-реализаций MPI - так же не свободные, а коммерческие продукты. Это объясняется тем, что собственно MPICH изначально для переноса и оптимизации под Windows не предназначен и не приспособлен; ожидать, что эта работа будет проделана на безвозмездной основе, не приходится.
Адрес компьютера: spp.csa.ru.
MPI находится в каталоге /opt/mpi .
Это HP MPI: коммерческая реализация, оптимизированная специально под архитектуру машин этой фирмы. Она работает на всех компьютерах (от рабочих станций до майнфреймов) с процессорами PA RISC и операционными системами HP-UX и SPP-UX.Запуск
Собственно, mpirun , хотя на SPP можно обойтись и без него:
./mpi_ex0 -np 5
то есть mpirun не нужен, а его ключи указываются первыми в командной строке приложения.
mpijob - выводит информацию о запущенных MPI-приложениях, запущенных как на локальной машине, так и на HPMPI-кластере. Аналогична команде Юникса jobs .Отладка
Параллельный отладчик на SPP есть! Называется он CXdb . Фирма Convex адаптировала CXdb к процессору PA-RISC и операционной системе HP-UX фирмы Hewlett-Packard после своего превращения в Convex Division of HP. CXdb позволяет отлаживать приложение, состоящее из множества процессов, каждый из которых, в свою очередь, состоит из множества потоков. Пользователь имеет возможность указывать область действия для вводимых команд, т.е. перечислять те потоки и процессы, на которые команда распространяется. Управлять отладчиком можно как через систему меню и экранных кнопок, так и через несложный командный язык. Замечание из собственного опыта: в CXdb оказалось все необходимое для отладки писавшихся мною приложений, как параллельных, так и чисто последовательных.
MPI-приложение под CXdb запускается так: все аргументы mpirun записываются в отдельный файл, назовем его mpi_ex0.cmd :
-np 4 ./mpi_ex0
Команда для запуска отладчика выглядит так: cxdb -mpi mpi_ex0.cmd . Отладчик запускает программу, прогоняет ее до MPI_Init() , приостанавливает, после чего переходит в режим ввода команд.
- Не ставьте точек останова до MPI_Init ! К тому моменту, когда у Вас появится такая возможность, вся эта часть программы до MPI_Init включительно уже выполнена.
- Точка останова, включаемая щелчком мыши по номеру строки в окне исходного текста, действует только в текущем потоке текущего процесса. Будьте внимательны!
Подсказки и документация
Manual pages по HP MPI находятся в каталоге /opt/mpi/share/man:
C-Shell: setenv MANPATH /opt/mpi/share/man:$MANPATH bash: export MANPATH=/opt/mpi/share/man:$MANPATH
Файл с полезной информацией по HP MPI: /opt/mpi/newconfig/RelNotes/.
- Как видно на вышеприведенной картинке (см.в верхний правый угол обоих окон), в самом отладчике имеется оперативная помощь. Составлена она качественно.
- man cxdb на SPP-1600 - описание запуска и ключей командной строки.
- man csd на dragon.csa.ru или magic.csa.ru. Может пригодиться, если CXdb используется в консольном режиме, то есть с ключом -csd . При этом его собственная полноэкранная подсказка становится недоступна.
Профилирование
Стандартный профайлер CXpa приспособлен для работы с MPI-приложениями. Я с ним не работал.
mpirun запускается с ключом -t :mpirun -np 4 -t mystatfile program_name [program_args. ]
каждая ветвь в ходе выполнения будет писать статистику в свой файл, имена всех файлов будут иметь общий префикс mystat и расширение .tr
mpitrstat foo.tr | more
Вот пример такого отчета:
mpitrstat HP MPI 1.2 - SPP-UX Sat Nov 7 07:58:05 1998 Application Summary Duration Average Trace Procs [secs] User MPI [kbytes] --------------------------------------------------------- foo 4 21.16959 100.00% 0.00% 0.000K Application Analysis foo Duration Process Executable Segments [secs] MPI --------------------------------------------------------- 0:11971(0) mpi_ex9 0 5.305031 0.00% 0:11972(1) . 0 5.274548 0.00% 0:11973(2) . 0 5.305022 0.00% 0:11970(3) . 0 5.284993 0.00% Routine Summary Overhead Blocking Routine Calls [secs] [secs] Percent --------------------------------------------------------- USER_code 4 21.16959 0.00000 100.00% Process Summary Overhead Blocking User Process [secs] [secs] [secs] Dominating Routines ---------------------------------------------------------
mpirun -np 4 -t mystatfile:off program_name [program_args. ]
- сколько вызовов MPI-подпрограмм было сделано за время трассировки,
- сколько времени потрачено в процентном/абсолютном отношении,
- какое количество времени ушло на ожидания при приемопередачах,
- и какая его доля при этом не была использована приложением, и т.д.
Почему на SPP не рекомендуется работать с MPI
С 1996 года процессор PA-RISC 7200 успел морально устареть, и производительность SPP на фоне современных ЭВМ довольно невелика.
- на SPP производится отладка и (частично) профилирование; для этого на SPP имеется удобный отладчик, а кроме того, большое ОЗУ, большой жесткий диск, качественное "железо" и надежное программное обеспечение,
- затем приложение MPI переносится на более быстрый, но менее оснащенный мат.обеспечением компьютер, где после минимальных исправлений запускается в рабочем режиме.
К сожалению, в настоящий момент SPP сверх всякой меры перегружен именно рабочими расчетами некоторых особенно достойных деятелей, из-за чего 8-процессорный монстр работает как черепаха. Эта безответственная практика безнаказанно цветет столь пышным цветом, что какое-то более рациональное его использование стало практически невозможным.
Свои первые примеры на MPI я писал, используя пакет WinMPICH 0.92b и Microsoft Visual C++ 4.0. Все работает нормально. К примерам прилагается make -сценарий.
WinMPICH скомпилирован в отладочном режиме, а именно.
- На экране регулярно будут появляться окна наподобие этого:
Выбирайте "Ignore" ( "Пропустить" ).
Недостатки
- Последняя версия WinMPICH вышла в 1996 году. Судя по всему, проект заглох. Таким образом, эта реализация не предоставляет программисту ту часть MPI, которая была или будет стандартизована позднее.
WMPI наиболее популярен в среде Windows в настоящий момент. Работает в '95 и в NT, с Си и Фортраном. В обоих случаях имеются в виду компиляторы от Микрософта. Путем определенных манипуляций можно заставить WMPI работать с Borland C++.
Недостатки
- исходники не публикуются,
- мне не удалось связать его с MPICH/Linux, несмотря на заявления авторов WMPI о возможности такого симбиоза.
Достоинства
- развивается в ногу с MPICH (в частности, поддерживает MPI-IO),
- запускается и работает быстрее, чем WinMPICH,
- пригоден для образования MPI-кластеров на базе машин с Win32.
Документация и подсказки
В HTML-формате, смотрите файл . /Docs/index.html. Описание MPI-IO (функций распределенного файлового ввода-вывода) отсутствует.
Построение программ
Kомандные файлы MPICC.BAT и MPIRUN.BAT отсутствуют, так как предполагается, что программист использует для работы интегрированную среду Microsoft Developer Studio, а не командную строку. Применительно к Developer Studio подробно указаны все изменения, которые требуется внести в проект по умолчанию.
Вниманию фанатов командной строки предлагается пример mpicc.bat для построения консольных WMPI-приложений.
Запуск
Построенный EXE-файл запускается без всяких загрузчиков.
- The directory from which the application loaded.
- The current directory.
- Windows 95: The Windows system directory. Use the GetSystemDirectory function to get the path of this directory. Windows NT: The 32-bit Windows system directory. Use the GetSystemDirectory function to get the path of this directory. The name of this directory is SYSTEM32.
- Windows NT only: The 16-bit Windows system directory. There is no Win32 function that obtains the path of this directory, but it is searched. The name of this directory is SYSTEM.
- The Windows directory. Use the GetWindowsDirectory function to get the path of this directory.
- The directories that are listed in the PATH environment variable.
Так гласит описание LoadLibrary в справочнике по WinAPI.
Количество и место запуска ветвей задается в текстовом файле, имеющим то же имя, что EXE-файла, плюс расширение .PG. Строки в нем имеют такой вид:
# комментарий local Количество_ветвей Адрес_машины Количество_ветвей Имя_EXE_файла
Когда PG-файл читается, ветвь номер 0 уже создана (в запущенном EXE-файле в этот момент выполняется функция MPI_Init), таким образом, общее количество ветвей на 1 больше указываемого в PG-файле. То есть, чтобы запустить приложение из 4 ветвей на своей машине, надо написать в PG-файле:
local 3
При желании, если вместо стандартного интерпретатора команд Command.com или Cmd.exe используется 4DOS или 4NT, простейший mpirun.btm может быть записан так:
@echo off :: This is mpirun.btm (4DOS/4NT batch file) sample for WMPI if "%1" ne "-np" ( echo Usage mpirun -np NN program.exe args. beep quit 1 ) echo local %@dec[%2] > %@path[%3]%@name[%3].pg set PATH=C:\Program files\WMPI_1.2\Lib\Console;%PATH% %3&
Чтобы получить подсказку по ключам запуска WMPI-приложения, запустите его с ключом -p4help .
Отладка
Параллельных отладчиков для Win32 нет. Каждая отлаживаемая ветвь должна выполняться под управлением отдельного экземпляра отладчика. Ветвь 0 отлаживается запуском EXE-файла непосредственно из интегрированной среды или автономного отладчика (WinDbg для Visual C++, Turbo Debugger для Borland C++).
К остальным ветвям отладчик следует "цеплять". В DevStudio это делается через пункт меню "Build->Start Debug->Attach to Process. ".Профилирование
Профилирующий вариант библиотеки, требования к которому поверхностно сформулированы в спецификации на MPI, в состав WMPI не входит. Следовательно, быстродействие коммуникационной части может замеряться лишь вручную: расставленными вокруг вызовов MPI-процедур вызовами GetTickCount() или чем-то в этом роде.
Пользовательская часть MPI-приложения может профилироваться стандартными средствами (от Микрософт и аналогичными). При этом, впрочем, вполне возможен конфликт ветвей, запущенных из одного EXE-файла, так как они могут начать писать прифилировочную статистику в один и тот же файл-отчет, что, естественно, недопустимо.
PowerMPI - это MPICH, адаптированный к архитектуре ЭВМ Parsytec. В качестве коммуникационного уровня он использует API Parix. Файлы PowerMPI располагаются внутри каталога с Париксом ( /export/home/parix/mpi на ЭВМ pink.csa.ru, /epx/mpi на всех остальных).
В построенном приложении от MPI не остается уже ничего - это обычное приложение Парикса, которое и запускаться должно командой px run . Это, кстати, означает, что при использовании PowerMPI Парситеки не могут быть объединены в MPI-кластеры ни друг с другом, ни с ЭВМ других типов. Поскольку Парcитек не cтал утруждать себя созданием таких типовых утилит, как mpicc , mpif77 и mpirun , строить MPI-приложение тоже предлагается как-то так:
px ancc mpi_sin.c -o mpi_sin.px -I/epx/mpi/include \ -L/epx/mpi/lib/parix/ch_px -lmpi
Предлагаемые здесь варианты mpicc/mpif77 и mpirun я написал, чтобы иметь меньше возни с: а) переносом готовых MPI-приложений на Парситек; б) пересаживанием закоренелых MPI-пользоватетелей на него же. Для размещения сценариев в каталоге с PowerMPI создается подкаталог bin , который затем должен быть подключен к переменной окружения PATH :
setenv PATH /epx/mpi/bin:$PATH
- переменная PX_MPI в исходном тексте mpicc (секция "Options") должна содержать правильный путь к PowerMPI,
- драйвер к компилятору Фортрана-77 получается следующим образом: ln -s mpicc mpif77 ,
- редактируйте при необходимости секцию "Check self name" для исправления имени компилятора Фортрана-77 и добавления поддержки других компиляторов (f90, etc.).
Отладка и профилирование
Для этого доступны все средства, какие есть в составе Парикса. Разбираться с ними я либо не пробовал, либо пробовал, но безуспешно. Сюда относятся параллельный полноэкранный отладчик DeTop (у меня не запустился), профайлеры prof и gprof . Собственно PowerMPI в своем составе ничего ни для отладки, ни для профилирования не имеет; документация так же отсутствует.
Что будет при попытке использовать MPICH вместо PowerMPI ?
MPICH будет использовать для межузловой связи "P4 поверх TCP/IP поверх Ethernet" вместо значительно более быстрого "Parix поверх HighSpeedLink", поскольку ничего не знает о последнем.
Пользователь должен самостоятельно копировать программный файл MPICH-приложения на те узлы, на которых собирается его запускать. Для этого администратор системы должен открыть локальные диски вычислительных узлов для пользовательского доступа.
В случае, если предыдущий пункт не выполнен, или загрузчик mpirun запускается только с ключем -np , MPICH запустит приложение не на всем Парситеке, а на одном-единственном узле (надо полагать, это будет входной узел). Естественно, что в этом случае никакое распараллеливание не принесет ни малейшего выигрыша.
Я пишу это все потому, что подобные попытки превратить крестьянскую лошаденку в стального коня, установив на него (на Парситек) MPICH посвежее, уже имели место в-прошлом, и нет никакой гарантии, что впредь ничего похожего больше не произойдет.
Разворачиваем MPI кластер на Linux
Сейчас любое серьезное приложение, работающее в продуктивной среде, требует обеспечение высокого уровня надежности функционирования. Обеспечение такой надежности требует использования ряда средств, таких как отказоустойчивые каналы связи, наличие дублирования источников питания и т. д. Но наиболее важным элементом обеспечения надежности является создание отказоустойчивой конфигурации серверов, на которых работает данное приложение.
Совершенно очевидно, что если приложение запущено на одном сервере, то в случае его отказа приложение будет недоступно до тех пор, пока не будет исправлен сбой сервера. Основная задача кластеризации это устранение данной ситуации с помощью своевременного, обнаружения аппаратных и программных сбоев и немедленно переключение на другой узел кластера – это процесс, известный как отработка отказа.
Существует много различных вариантов создания кластеров под Linux. Мы будем использовать MPI (Message Passing Interface) для обеспечения взаимодействия между узлами нашего кластера.
Установка на Ubuntu Linux
Перед началом создания собственного двухузлового кластера нам потребуются два сервера с установленной ОС Ubuntu 22.04. Между этими узлами нам необходимо установить прямое соединение для обмена heartbeat. Каждому из этих сетевых интерфейсов необходимо назначить статический IP адрес. У нас это будут 10.0.0.1 (node_1) и 10.0.0.2 (node_2).
Далее я буду предполагать, что у вас уже установлен SSH сервер. Если это по какой-то причине не так, то установите SSH на оба узла с помощью команды:
sudo apt install openssh-server
Первое, что нам потребуется сделать это настроить беспарольный доступ по SSH с помощью сертификатов. Выполним следующую команду:
sudo ssh-keygen -t rsa -b 4096
После ее запуска вам будут заданы несколько вопросов, на которые можно ответить предлагаемыми значениями по умолчанию. В результате будут созданы два файла ~/.ssh: id_rsa и id_rsa.pub. Последний является открытым ключом. Содержимое этого файла необходимо скопировать в файл ~/.ssh/authorized-keys на удаленном компьютере. Это можно сделать к примеру с помощью утилиты scp.
scp ~/.ssh/authorized_keys 10.0.0.2:~/.ssh/
Аналогичные действия необходимо проделать на втором узле и скопировать сгенерированный ключ в настройки SSH на первом сервере.
Устанавливаем протокол коммуникаций
Далее для работы нашего кластера нам потребуется установить средство для обмена сообщениями. Мы будем использовать MPI (Message Passing Interface) – стандартный коммуникационный протокол для распределенных вычислений. Не вдаваясь в технические особенности и версии данного протокола установим на обоих узлах одну из реализаций MPI с помощью команды:
sudo apt install libopenmpi-dev
После этого нам необходимо проверить возможность выполнять команды на удаленном узле. Для этого выполним следующее на узле 10.0.0.1:
mpirun -np 2 -host 10.0.0.2:2 hostname
В результате нам должен быть выведен на экран результат выполнения данной команды, то есть имя второго узла.
Для удобства работы с узлами кластера рекомендуется прописать в файле /etc/hosts соответствие IP адресов каждого из узлов и их имен:
10.0.0.2 node_2 10.0.0.1 node_1
Есть причина, по которой мы до сих пор использовали команду hostname: она доступна по умолчанию во всех системах. При использовании MPI важно помнить, что мы, по сути, используем сетевое подключение только для того, чтобы позволить нескольким запущенным заданиям взаимодействовать друг с другом. Однако каждое задание выполняется на своем собственном компьютере, имеющем доступ к своему собственному жесткому диску. Это, в частности, означает, что команда для запуска должна существовать на всех компьютерах и в одном и том же расположении.
Таким образом, для совместного выполнения задач и обмена результатом нам необходим общий ресурс. В данном случае мы будем использовать файловую систему NFS.
Для установки ее компонентов на узле node_1 выполним следующую команду:
sudo apt install nfs-kernel-server nfs-common
Далее вам нужно создать точку монтирования для общего каталога. Будем расшаривать домашний каталог пользователя user на node_1.
sudo ln -s /nfs /home/user
Далее на том же node_1 добавим в файл /etc/exports строку для доступа со второй ноды:
. /home/user node_2(rw)
На узле node_2 создадим каталог /nfs
И добавим в fstab следующую запись:
. 10.0.0.1:/home/user /nfs nfs defaults 0 0
Далее выполним монтирование:
Если монтирование завершилось успешно, то мы можем перейти в папку nfs и увидеть содержимое, реально находящееся на node_1.
user@node_2:/nfs$ ls -la
drwxr-xr-x 80 user user 12288 Sep 7 14:17 .
drwxr-xr-x 25 root root 4096 Aug 27 06:19 ..
Таким образом мы получили кластерную конфигурацию в которой мы можем выполнять команды на каждом из узлов и использовать общую файловую шару для взаимодействия между нодами.
Заключение
В этой статье мы рассмотрели один из вариантов создания кластера на Ubuntu, с помощью которого затем можно реализовать выполнение различных вычислительных задач.
В завершение порекомендую открытый урок, посвященный настройке Nginx для высоких нагрузок и защиты от DoS-атак. Узнать подробнее и записаться можно по ссылке.
- Блог компании OTUS
- Настройка Linux