1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

HDFの真の実力を発揮するにはMPIを!(でも手動パッチ入れてね💖)

1
Posted at

■TL;DR

  • HDF5の性能を活かすには、MPI/MPICH/OpenMPI版のインストールを!
  • だけどOpenCV Contribにはパッチが入ってないのでbuild error...
  • 仕方がないから手動パッチを追加するのですよ!

■はじめに

Hierarchical Data Format、HDFをご存じだろうか? 簡単に行ってしまえば、大量のデータを格納・構造化するためのデータベースである(超絶乱暴)。用途も、産業から科学まで幅広い。

更に、なんと先月!! 2025/11/10にHDF5 2.0.0がリリースされたのです!!!お誕生日おめでとー!!!:birthday:

なのですが… 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...
  • 仕方がないから手動パッチを追加するのですよ!

以上です、ありがとうございました!!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?