вторник, 25 августа 2015 г.

Компилирование кода с использованием HDF5

HDF5 - формат хранения больших объёмов структурированных данных, предназначенный для различных научных и научно-прикладных приложений. В частности, он позволяет хранить информацию об эволюции значений каких-либо переменных в 3D объекте с течением времени. Большой его плюс - это поставка в виде готового набора библиотек, которые могут использоваться либо как dll, либо как компилируемые исходники при разработке своих приложений, что снимает головную боль по записи данных.
Этот формат поддерживается многими современными визуализаторами типа paraview, что позволяет полностью забыть и про головную боль с визуализацией данных.
Наша группа перешла на него в этом году.

Библиотека HDF5, будучи предназначенной для паралелльной записи в один файл вывода, нуждается в параллельном компиляторе под MPI. Пост про то, как это завести на openSUSE и на MacOS.

Примечание для пишущих на C++. HDF5 не поддерживает параллельную версию для C++, есть только для C и fortran. Насколько я понял, с остальными языками всё ещё хуже.
Текущий релиз, если что, от июня 2015 года.

За прошедший месяц прилетели какие-то чудесные обновления, благодаря которым наш код перестал компилироваться как на рабочем компе с MacOS, так и на моём ноутбуке под openSUSE.
Я понимаю, что это звучит как "вот я ничего не трогал, а оно само упало", но разбираться в причинах у меня нет времени и желания. Потому вместо разбора полётов я приведу инструкцию по решению проблемы.

Решаемая задача: компилирование параллельного кода на Fortran-90 с выводом в HDF5-файлы. Подразумевается, что на машине уже установлен gcc и gfortran.

openSUSE:

Идём в YaST (менеджер установленного ПО).
Вбиваем в Software Manager "openmpi". Отмечаем пакеты openmpi, openmpi-devel, openmpi-devel-static, openmpi-libs. Устанавливаем.
Вбиваем в Software Manager "hdf5". Отмечаем все пакеты с этим словом, обратив особое и пристальное внимание на пакеты со словом openmpi в названии. Пакет hdf5-examples я, понятно, не ставил. Устанавливаем.

Всё. Теперь проверяем в консоли установку всего нужного строчкой which h5pfc (параллельный компилятор для fortran с поддержкой HDF50). Должно выдаться что-то в духе
> /usr/lib64/mpi/gcc/openmpi/bin/h5pfc
 После этого файлы кода комплируются строчками типа
> /usr/lib64/mpi/gcc/openmpi/bin/h5pfc -L/usr/lib64/mpi/gcc/openmpi/lib64 -lhdf5_fortran -lhdf5 -I/usr/lib64/mpi/gcc/openmpi/include/ -lmpi -c file.f90
Линкование аналогичное:
> /usr/lib64/mpi/gcc/openmpi/bin/h5pfc -L/usr/lib64/mpi/gcc/openmpi/lib64 -lhdf5_fortran -lhdf5 -I/usr/lib64/mpi/gcc/openmpi/include/ -lmpi -o executablename foo1.o foo2.o
Для файлов на языке C компилирование должно быть аналогичным с заменой h5pfc на h5pcc и убиранием флага -lhdf5_fortran.

Для остальных линусков типа debian существуют аналогичные пакеты связки HDF5-openMPI.

MacOS:

Тут HDF5 надо компилировать из исходников. Скажу сразу: у меня не получилось заставить работать HDF5 с openmpi. Да, она компилируется, но на стадии make check тест на параллельную запись падает. Необходима установка MPICH (альтернативная реализация MPI).
Примечание: установку через порты типа Homebrew или MacPorts я не рассматриваю по идейным соображениям.

Итак, загружаем исходники MPICH и HDF5, открываем консольку и понеслася.

Устанавливаем MPICH:
> FC=gfortran CC=gcc CFLAGS="-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64" ./configure --prefix=/usr/local/mpich --enable-fortran
> make
> sudo make install
Теперь важный момент. Проверяем, какой используется mpirun:
> which mpirun
Если выдалось что-то отличное от /usr/local/mpich/bin/mpirun, необходимо прописать ручками в переменную $PATH путь:
> touch ~/.bash_profile; open ~/.bash_profile
В открывшемся текстовом редакторе дописываем в конец export PATH=/usr/local/mpich/bin:$PATH , после чего сохраняем файл. Загружаем его:
> source ~/.bash_profile
Для спокойствия можно снова спросить which mpirun. Повторяем означенную процедуру с mpicc и mpif90.
Внимание! С mpif90 нужно быть особенно аккуратным. Я напоролся на то, что на моей MacOS была заглушка, которая пыталась компилировать файлы, де-факто не умея создавать MPI-приложения (т.е. интерфейс последовательного gfortran). Проблема крайне редкая и специфичная, но на неё накалывался не только  я: в сети есть редкие упоминания.

Теперь ставим HDF5:
> FC=/usr/local/mpich/bin/mpif90 CC=/usr/local/mpich/bin/mpicc  ./configure --enable-fortran --enable-parallel --prefix=/usr/local/hdf5 --disable-shared
> make
> make check
> sudo make install
Примечания: make выдаёт нереальное количество warning; make check может спокойно зависнуть минут на 10-20 на некоторых тестах. Это нормально.
Указанные в инструкции по установке HDF5 флаги типа -q64 (-m64 для mpif90/mpicc) по факту не нужны.

Теперь можно аналогичным методом засунуть в $PATH путь /usr/local/hdf5/bin/ .

Компиляция и линкование аналогичны:
> /usr/local/hdf5/bin/h5pfc -L/usr/local/hdf5/lib -I/usr/local/hdf5/include -lhdf5_fortran -lhdf5 -L/usr/local/mpich/lib/ -I/usr/local/mpich/include/ -lmpi -c file.f90

> /usr/local/hdf5/bin/h5pfc -L/usr/local/hdf5/lib -I/usr/local/hdf5/include -lhdf5_fortran -lhdf5 -L/usr/local/mpich/lib/ -I/usr/local/mpich/include/ -lmpi  -o executablename foo1.o foo2.o

В принципе, процедура весьма простая, требует только минимальной внимательности и пренебрежимую кривизну рук.

Комментариев нет:

Отправить комментарий