一般技術

OpenCVでlibjpeg-turboのSIMDを有効化する方法

はじめに

Windows でビルドした OpenCV を使って Jpeg デコード・エンコードすると、
いつもより時間がかかっていることに気づきました。

OpenCV v4.7.0 から、libjpeg-turbo が標準で組み込まれ、
SIMD(SSEなどの拡張命令)を使って高速に Jpeg デコード・エンコードしてくれるはずだった。

本記事は、OpenCV をビルドする際に SIMD を有効化する方法を記載します。

SANACHAN
SANACHAN
性能の目安は「開発メモ」が参考になります。

 

ビルド環境

OpenCV + OpenCV Contribをビルド 【Windows編】」を参考に、Windows環境でビルドしました。

OS Windows10
IDE Visual Studio 2022 Community
OpenCV v4.7.0
OpenCV-ContLib v4.7.0
CMake v3.27.0
NASM v2.16.01

 

libjpeg-turbo の SIMD が有効になっているか調べる

まずは、SIMD が有効になっているかどうかを確認するところからです。
GitHub で公開されている OpenCV のリリースも、SIMD は有効化されていません

おそらく、Windows も ARM 上で動かすケースがあるため、
CPU アーキテクチャ依存のコードを入れていないのだと思われます。

 

方法①:CMakeVars.txt を確認

CMake でビルドオプションを設定した後、インストール先のルートディレクトリに
CMakeVars.txt というものが生成されます。その中の以下を確認します。

 CMakeVars.txt
★有効の場合
HAVE_LIBJPEG_TURBO_SIMD=1
 
★無効の場合
HAVE_LIBJPEG_TURBO_SIMD=0

 

方法②:getBuildInformation を確認

CMake を実行した際の結果を文字列として OpenCV 内部に埋め込まれます。
getBuildInformation を呼び出すことでその文字列を取得できます。

 実行結果
★有効の場合
Media I/O:
JPEG: build-libjpeg-turbo (ver 2.1.3-62)
SIMD Support Request:   YES
SIMD Support:       YES
 
★無効の場合
Media I/O:
JPEG: build-libjpeg-turbo (ver 2.1.3-62)
SIMD Support Request:   YES
SIMD Support:       NO

SANACHAN
SANACHAN
opencv_version.exe を実行しても同じ結果が得られます。

 

SIMD を有効化する方法

CMake オプションでは ENABLE_LIBJPEG_TURBO_SIMD を有効にしているのに、
HAVE_LIBJPEG_TURBO_SIMD が 1 にならない場合、以下が対策になります。

  • NASM コンパイラをインストール
  • NASM 実行バイナリの場所を環境変数 PATH に追加

 

step
1
インストーラをダウンロード

NASM 公式ページからダウンロードします。

SANACHAN
SANACHAN
Latest Version の Stable を選びました。

 

step
2
環境変数 PATH を通す

標準の設定でインストールすると、「C:\Users\<ユーザ名>\AppData\Local\bin\NASM」に実行バイナリが格納されるため、このパスを環境変数 PATH に追加します。

 

こちらの記事もよく読まれています

  • この記事を書いた人
  • 最新記事
SANACHAN

SANACHAN

「生涯一エンジニア」を掲げ、大手グローバル企業でSE/PGとして8年勤め、キャリアアップ転職した現役のエンジニアです。世にあるメジャーな全プログラム言語(コボル除く)を自由に扱えます。一児の父。自分のため、家族のため、日々勉強してます。システムエンジニア、プログラミングに関する情報を蓄積している雑記帳です。

-一般技術
-, ,