■TL;DR
- HDF5の性能を活かすには、MPI/MPICH/OpenMPI版のインストールを!
- だけどOpenCV Contribにはパッチが入ってないのでbuild error...
- 仕方がないから手動パッチを追加するのですよ!
■はじめに
Hierarchical Data Format、HDFをご存じだろうか? 簡単に行ってしまえば、大量のデータを格納・構造化するためのデータベースである(超絶乱暴)。用途も、産業から科学まで幅広い。
更に、なんと先月!! 2025/11/10にHDF5 2.0.0がリリースされたのです!!!お誕生日おめでとー!!!![]()
なのですが… OpenCVにはbugがあって、うまくbuildができない場合があるのです。Pull requestは昨年出したのですが、取り込まれないと…
折角なので!!ここで簡単に説明しておこうかなと思います!もしバグを踏み抜いちゃった方がこの記事を見つけていただけますと幸いです!
■目的
hdf5の性能をフルに発揮するためには、MPIってバージョンのを入れなきゃいけないのか!
よし、さっそくMPIをサポートしたHDF moduleをbuildしてみよう!
■課題
ubuntu で試したら、libhdf5にもいっぱい種類がある。こういう時のコールには「全部マシ」で!!
sudo apt install libhdf5-dev libhdf5-mpich-dev libhdf5-mpi-dev libhdf5-openmpi-dev
それではさっそくbuildしていこう!
cmake -S opencv4 -B build4.hdf5 -DOPENCV_EXTRA_MODULES_PATH=./opencv_contrib4/modules -DBUILD_LIST=hdf
よしエラーはでなかった!!!
性能もでなかった… why ?
kmtr@kmtr-VMware-Virtual-Platform:~/work$ touch opencv_contrib4/modules/hdf/src/hdf5.cpp
kmtr@kmtr-VMware-Virtual-Platform:~/work$ cmake --build build4.hdf5 -v
Change Dir: '/home/kmtr/work/build4.hdf5'Run Build Command(s): /usr/bin/ninja -v
[1/3] /usr/bin/ccache /usr/bin/c++ (略)( -isystem /usr/include/hdf5/serial (略) -c /home/kmtr/work/opencv_contrib4/modules/hdf/src/hdf5.cpp
よくよく見ると、Serial版のHDF5見てるじゃないですかヤダー!!!私、mpiも、openmpiも、mpichも全部入れたのにー!!なんでー!
■解決策
▢(Step 1) alternativeを疑う
「知っているのか、雷電!!」
「うむ、あれこそは、Ubuntuの場合、複数のプログラムを入れておいて、後からどれを使うのか切り替える機能「あるたーねいちぶす」に他ならない。それでhdf5を使うときにはserialの優先度が高かったというわけだな!!」
kmtr@kmtr-VMware-Virtual-Platform:~/work$ update-alternatives --display hdf5.pc
hdf5.pc - 自動モード
最適なリンクのバージョンは '/usr/lib/x86_64-linux-gnu/pkgconfig/hdf5-mpi.pc' です
リンクは現在 /usr/lib/x86_64-linux-gnu/pkgconfig/hdf5-mpi.pc を指しています
リンク hdf5.pc は /usr/lib/x86_64-linux-gnu/pkgconfig/hdf5.pc です
/usr/lib/x86_64-linux-gnu/pkgconfig/hdf5-mpi.pc - 優先度 35
/usr/lib/x86_64-linux-gnu/pkgconfig/hdf5-mpich.pc - 優先度 10
/usr/lib/x86_64-linux-gnu/pkgconfig/hdf5-openmpi.pc - 優先度 30
/usr/lib/x86_64-linux-gnu/pkgconfig/hdf5-serial.pc - 優先度 20
(・3・) あるぇ~?
▢(Step 2) Parallel版を使うように指示
実は解決策は、CMakeのドキュメントにしっかり記載されていた!
HDF5_PREFER_PARALLEL
Added in version 3.4.Set this to boolean true to prefer parallel HDF5 (by default, serial is preferred). This variable is used only in module mode.
勝てる・・・これなら勝てる・・・!!
いちど、build環境を作り直して...
rm -rf build4.hdf5
cmake -S opencv4 -B build4.hdf5 -DOPENCV_EXTRA_MODULES_PATH=./opencv_contrib4/modules -DBUILD_LIST=hdf -GNinja -DHDF5_PREFER_PARALLEL=1
cmake --build build4.hdf5
In file included from /usr/include/hdf5/openmpi/hdf5.h:21,
from /home/kmtr/work/opencv_contrib4/modules/hdf/src/hdf5.cpp:37:
/usr/include/hdf5/openmpi/H5public.h:67:10: fatal error: mpi.h: そのようなファイルやディレクトリはありません
67 | #include <mpi.h>
| ^~~~~~~
compilation terminated.
(・3・) あるぇ~?
▢(Step 3) MPIもリンクするようにする
そういうことで、この追加パッチなわけです。
# See https://github.com/opencv/opencv_contrib/issues/3858
# If HDF5_PREFER_PARALLEL is enabled, find_package(HDF5) sets HDF5_IS_PARALLEL=ON.
if(HDF5_IS_PARALLEL)
find_package(MPI)
if(NOT MPI_FOUND)
message(STATUS "Module opencv_hdf disabled because the following dependency is not found: MPI")
ocv_module_disable(hdf) # no return
endif()
else()
unset(MPI_CXX_LIBRARIES)
unset(MPI_CXX_INCLUDE_DIRS)
endif()
ocv_target_link_libraries(${the_module} ${HDF5_LIBRARIES} ${MPI_CXX_LIBRARIES})
ocv_include_directories(${HDF5_INCLUDE_DIRS} ${MPI_CXX_INCLUDE_DIRS})
ただ、色々粗削りなんでまあ動くねーというレベルでございますが。
これでOpenCVでもHDF5の性能をフルに生かせる環境が整いましたね!!
■まとめ
- HDF5の性能を活かすには、MPI/MPICH/OpenMPI版のインストールを!
- だけどOpenCV Contribにはパッチが入ってないのでbuild error...
- 仕方がないから手動パッチを追加するのですよ!
以上です、ありがとうございました!!