OpenCV で IPP を使う
OpenCV は「IPP があればそれを認識します」と書いてありますが、Windows の OpenCV 1.0 をインストールしただけでは、最初は Intel Performance Primitives (IPP) は使えません。 使えるかどうかを確認する

kwiさんのブログ記事

前へ[ THR_KEY_mysys ]
[ opencv cvCvtColor の挙動 ]次へ
OpenCV は「IPP があればそれを認識します」と書いてありますが、Windows の OpenCV 1.0 をインストールしただけでは、最初は Intel Performance Primitives (IPP) は使えません。
使えるかどうかを確認するには cvinfo.exe を実行します(C:\Program Files\OpenCV\bin\cvinfo.exe)。
コンソールアプリケーションなのでコマンドプロンプトを使ったり、私の場合 cygwin 上で実行しています。

必要なもの
- Microsoft Visual Studio (VC)
- Intel IPP
- OpenCV 1.0

とりあえずお試しということで、製品版は買わずに済ませます。
VC は Express Edition を使います。Intel IPP は 30 日評価版をインストールします。現在 IPP は 6.0 がリリースされていますが、実際にやってみたところこれではビルドできませんでした。最初は 5.3 を使うのが良いようです(理由は後述)。Windows Vista x86 を使っているので IPP は ia32 を選択します。

VC の設定を入れておきます。
「ツール>オプション>プロジェクトおよびソリューション>VC++ディレクトリ」で
インクルードファイルに次のエントリを追加
C:\Program Files\OpenCV\cv\include
C:\Program Files\OpenCV\cvaux\include
C:\Program Files\OpenCV\cxcore\include
C:\Program Files\OpenCV\otherlibs\highgui
C:\Program Files\OpenCV\ml\include
C:\Program Files\Intel\IPP\5.3.4.087\ia32\include
ライブラリファイルに次のエントリを追加
C:\Program Files\OpenCV\lib
C:\Program Files\Intel\IPP\5.3.4.087\ia32\lib
C:\Program Files\Intel\IPP\5.3.4.087\ia32\stublib

OpenCV から IPP を使うためには ippopencv100d.dll をビルドします。このプログラムは次の場所にあるプロジェクトをビルドするとOKです。
C:\Program Files\OpenCV\interfaces\ipp

プロジェクトファイルの形式が古いので、変換して使います。また Express Edition には Platform SDK が含まれていないので、プロジェクトファイルを若干修正します。「ippopencv プロパティ>構成プロパティ>リンカ>入力>追加の依存ファイル」に、bufferoverflowu.lib が入っているけれども、これはないので削除。

後は F5 を押すなどして、ビルドを行います。無事ビルドができたら次のファイルができているはずです。
C:\Program Files\OpenCV\bin\ippopencv100d.dll

cvinfo.exe を実行してみましょう。
$ cvinfo
Processor: Pentium IV or compatible
c:\Program Files\OpenCV\bin\cv100.dll:
OpenCV version 1.0 or later
c:\Program Files\Intel\IPP\5.3.4.087\ia32\bin\ippcv-5.3.dll:
IppCV UNKNOWN version beta 2+
c:\Program Files\Intel\IPP\5.3.4.087\ia32\bin\ippcva6-5.3.dll:
IppCV UNKNOWN version beta 2+
c:\Program Files\Intel\IPP\5.3.4.087\ia32\bin\ippcvp8-5.3.dll:
IppCV UNKNOWN version beta 2+
c:\Program Files\Intel\IPP\5.3.4.087\ia32\bin\ippcvpx-5.3.dll:
IppCV UNKNOWN version beta 2+
c:\Program Files\Intel\IPP\5.3.4.087\ia32\bin\ippcvt7-5.3.dll:
IppCV UNKNOWN version beta 2+
c:\Program Files\Intel\IPP\5.3.4.087\ia32\bin\ippcvv8-5.3.dll:
IppCV UNKNOWN version beta 2+
c:\Program Files\Intel\IPP\5.3.4.087\ia32\bin\ippcvw7-5.3.dll:
IppCV UNKNOWN version beta 2+


~IPPのバージョンについて~
IPP の中には同じ処理をするライブラリが、様々な CPU 向けに個別に入っています。OpenCV の IPP インターフェースでは、実行環境の CPU を判定して最適な関数を呼び出すようになっています。この呼び出し機能は IPP 自身にも備わっているものなのですけれども、おそらくパフォーマンス上の理由からOpenCVでは「静的リンク(ディスパッチなし)」でリンクを行うように構成されています。

この CPU 個別向けの~という部分は、IPP の内部では 2 文字で表されるもので種別分けされています。具体的には、IPP のマニュアル Section 5 "Linking Your Application with Intel IPP" に Dispatching に記載されています。

【IPP 5.3 の対応している CPU タイプ】
px C-optimized for all IA-32 architecture based processors. Can be run on Intel processors starting with IntelR PentiumR Pro processors
a6 Optimized for PentiumR III processors
w7 Optimized for PentiumR 4 processors
t7 Optimized for PentiumR 4 processors with Streaming SIMD Extensions 3 (SSE3)
v8 Optimized for 32-bit applications on IntelR Core?2 and IntelR XeonR 5100 processors
p8 New Optimizations for 32-bit applications on 45nm IntelR Core?2 Duo (Penryn) family processors

【IPP 6.0 の対応している CPU タイプ】
px C-optimized for all IA-32 processors
w7 Optimized for processors with IntelR Streaming SIMD Extensions 2 (SSE2)
t7 Optimized for processors with IntelR Streaming SIMD Extensions 3 (SSE3)
v8 Optimized for processors with IntelR Supplemental Streaming SIMD Extensions 3 (SSSE3)
p8 Optimized for processors with IntelR Streaming SIMD Extensions 4.1 (SSE4.1)

IPP 6.0 でうまくビルドできなかったのは、a6 が廃止されてしまっていたからでした。と、ここまでわかってしまうと、自分の環境に最適なものでビルドしたくなってしまいます。私の手元の ThinkPad X200 は Core2 Duo (8600) でした。マニュアルによると v8 かと思うところなのですが、ippGetCpuType() の値を見てみると ippCpuPenryn と判定されていて、p8 が使えます。

p8 が使えるようにするには、dllmain.c をひたすら編集します。あとはプリプロセッサに渡される値で ...;W7;A6;... になっているところを P8 にしてビルドすればOK。
$ cvinfo
Processor: Pentium IV or compatible
c:\Program Files\OpenCV\bin\cv100.dll:
OpenCV version 1.0 or later
c:\Program Files\Intel\IPP\6.0.2.074\ia32\bin\ippcv-6.0.dll:
IppCV UNKNOWN version beta 2+
c:\Program Files\Intel\IPP\6.0.2.074\ia32\bin\ippcvp8-6.0.dll:
IppCV UNKNOWN version beta 2+
c:\Program Files\Intel\IPP\6.0.2.074\ia32\bin\ippcvpx-6.0.dll:
IppCV UNKNOWN version beta 2+
c:\Program Files\Intel\IPP\6.0.2.074\ia32\bin\ippcvs8-6.0.dll:
IppCV UNKNOWN version beta 2+
c:\Program Files\Intel\IPP\6.0.2.074\ia32\bin\ippcvt7-6.0.dll:
IppCV UNKNOWN version beta 2+
c:\Program Files\Intel\IPP\6.0.2.074\ia32\bin\ippcvv8-6.0.dll:
IppCV UNKNOWN version beta 2+
c:\Program Files\Intel\IPP\6.0.2.074\ia32\bin\ippcvw7-6.0.dll:
IppCV UNKNOWN version beta 2+

haartraining で見ているところによると…。効果は特になく、5.3 でビルドしたものと大差ないです。OpenCV でのプロジェクトファイルが 5.1 のときのものだし、しょうがないですね。あ、ちなみに、IPP 無しとありとでは倍程度違うようです。
  • │2009-04-21 14:51:58│ カテゴリー:日記│ コメント(0) │ トラックバック(0)
  • 宛先 :
  • トラックバックURL:
  • この記事にトラックバックをする場合は、i-revoポータルサイトご利用上の注意を必ずご確認ください。
loading
loading
kwiさん
お友達人数:19人
spacer
spacer

© 2011 Internet Revolution