マルチメディア処理から信号処理まで幅広く活用できる高速ライブラリ「IPP」

 インテル C++ コンパイラーに付属するライブラリの1つに「インテル インテグレーテッド・パフォーマンス・プリミティブ」(Integrated Performance Premitive、以下IPP)がある。IPPは動画や音声、画像などの処理に向けた関数を備えたライブラリなのだが、実際のところIPPがどのようなものなのか分からない方も多いだろう。そこで本記事では、IPPには何が含まれており、またどのような用途に使えるのか、紹介していこう。

IPPとは?

 動画や画像、音声といったデータを扱うアプリケーションを作成する場合、面倒なのがデータのデコード/エンコード処理といった定型的処理や、各種処理アルゴリズムの実装だ。リファレンスコードなどを参考に実装する、という手もあるが、このようなデータを高速に処理できるように実装するのは容易ではない。そこで重宝するのが、よく使われる処理があらかじめ実装されているマルチメディア処理ライブラリである。IPPはこのようなマルチメディア処理ライブラリの1つだ。

 IPPは信号処理や動画/画像処理、行列処理および線形演算、暗号化といった用途に向けた各種関数群を集めたライブラリで、表1のような分野で利用できる関数を備えている。

表1 IPPが備える機能
分類 機能
信号処理 ベクトル処理
フィルタ処理
信号変換
話し言葉認識
音声エンコーディング
データ圧縮
信号の整合性チェック
動画/画像処理 カラー変換
比較、閾値処理
データ変換
モーフィング
フィルタ処理
線形変換
統計処理
座標変換
ウェーブレット変換
コンピュータビジョン
画像比較
動画エンコーディング
行列処理/線形演算 ベクトル演算
行列演算
線形システム処理
最小二乗法ソルバー
固有値問題
3次元データ処理
暗号化 対照暗号
ハッシュおよびデータ認証
巨大な数値の数学的処理
モンゴメリ演算
疑似乱数の生成
素数生成
RSAアルゴリズム
DSA処理

 IPPの特徴は、インテル コンパイラや、インテル コンパイラにIPPとともに同梱されるインテル マス・カーネル・ライブラリ(Math Kernel Library、以下MKL)などと同じく、インテル製CPUに最適化されている点と、Windows/Linux/Mac OS Xという複数の環境に対応していること、そして並列化に対応している点だ。

 IPPは32ビットおよび64ビットの両方の環境(x86/x64/IA-64)で利用でき、関数はすべてインテルCPU向けに最適化されているほか、ベクトル演算や統計演算、フィルタリング、動画/画像のエンコード/デコード処理などはマルチプロセッサ/マルチコア環境でより高いパフォーマンスを発揮できるよう、内部的にマルチスレッド化されている。

IPPが備える関数群

 IPPには、先で挙げた信号処理、動画/画像処理、行列処理/線形演算、暗号化の4分野について、非常に多岐に渡る関数が含まれている。たとえば画像処理ならばウェーブレット変換やフーリエ変換、さまざまなフィルタ処理やリサイズ/変形、ヒストグラムなどの統計処理などを行う関数が利用可能だ。

 また、動画/画像/音声コーデックで使われる処理を実装した関数も用意されている。動画についてはDV25/50/10やMPEG-2、MPEG-4、H.263、H.264、画像についてはJPEGおよびJPEG2000、音声についてはMP3およびAACといった音楽向け形式のほか、G.722.1やG.729、AMRなといった音声用のコーデックについて、圧縮/展開で用いられる各種アルゴリズムが低レベル関数として実装されている。たとえば、図1はH.264形式での動画圧縮/展開処理フローを示したものだ。図中の青色のブロックがIPPで実装されている処理である(IPPの製品紹介ページ)。これらのアルゴリズムを組み合わせることで独自にチューンしたコーデックを作成できるほか、後述するサンプルプログラムに含まれるコーデックライブラリも利用できる。

図1 H.264のエンコード/デコード
図1 H.264のエンコード/デコード

 そのほか、色変換関数や3Dレンダリング、文字列処理、データの暗号化や圧縮/展開といった処理を行う関数も用意されおり、さまざまな分野での活用が可能だ。含まれる関数の詳細については製品紹介ページを参照してほしい。

 なお、IPPを利用したアプリケーションの配布については有償/無償を問わずロイヤリティーフリー、つまり別途追加料金なしで行える。ただし、各種エンコード/デコード処理などに関わる特許などの使用料は含まれていないため、アプリケーションを配布する場合などは注意してほしい。

充実したサンプルコード

 IPPには充実したサンプルコードが用意されているのも特徴だ。IPPサンプルコードの詳細情報やダウンロードはエクセルソフトのWebサイトから行え、現在表2のようなものが用意されている。これらのサンプルはWindows/Linux/Mac OS Xそれぞれに向けて用意されており、これらを利用することでアプリケーション開発の手間を大幅に削減することができるだろう。また、サンプルコードの多くはC++で記述されており、ほかのアプリケーションからも利用しやすいようにモジュール化されているため、これらを高レベルライブラリとして活用することもできる。これらのコードを使用して作成した製品の配布についてもロイヤリティーフリーで行える。ただし、こちらについても各種特許などの使用料は含まれていないため、アプリケーションを配布する場合などは注意が必要だ。

表2 用意されているIPPのサンプルコード(Windows環境向け)
分野 用意されているサンプル例(抜粋)
動画/音声エンコード/デコード DV/MPEG-2/MPEG-4/H.263/H.264に対応した動画再生ソフトや各種エンコーダ/デコーダ
画像エンコード/デコード JPEGビューアやJPEG2000のエンコーダ/デコーダ
コンピュータビジョン 顔認識
データ圧縮 zlib/bzip2/GZIPなどの圧縮/展開ライブラリ
暗号化 OpenSSL暗号化関数
信号処理 一般的な信号処理サンプル
文字列処理 正規表現マッチ
音声処理 さまざまな音声エンコード/デコード
音声認識 話し言葉処理

 たとえば動画/音声エンコード/デコード(audio-video-codecs)サンプルには、JPEGエンコーダ/デコーダやAAC/AC3/MP3エンコーダおよびデコーダ、AVI/AVS/DV50/DV100/H261/H263/H264/MPEG2/MPEG4/VC1エンコーダおよびデコーダ、各種スプリッタやマルチプレクサといった機能を備えたC++クラスが用意されており、これらを用いて比較的簡単に動画エンコード/デコード処理をアプリケーションに実装可能だ。これらのクラスを使った動画エンコーダ/デコーダ/プレーヤーもサンプルコードとして用意されている。

 また、データ圧縮(data-compression)サンプルには、BZ2(bzip2)/Z(compress)/GZ(gzip)/ZIP(zip)といったメジャーなファイル圧縮形式に対応する圧縮/展開ライブラリが含まれているほか、正規表現やレイトレーシング法による3Dレンダリング、画像に対する各種フィルタ処理といった処理を行うライブラリもサンプルコードに含まれている。IPPは低レイヤー関数が多く複雑な構成をしているが、これらのサンプルコードを活用すれば、比較的手軽に各種処理をアプリケーションに実装できるだろう。

 また、Windows版のサンプルコードはすべてVisual Studio用のプロジェクト設定ファイルが付属するほか、コンパイル用のバッチファイルが用意されているものもある。たとえばWindows(x86)環境で動画/音声エンコード/デコードサンプル(audio-video-codecs)をコンパイルするには、まずスタートメニューの「Intel Software Development Tools」内にある「IA-32 対応アプリケーション用 C++ ビルド環境」を実行してコマンドプロンプトを開き、下記のように実行すれば良い。

> cd <サンプルコードを展開したディレクトリ>\audio-video-codecs
> build32.bat

 これでaudio-video-codesフォルダ内の「_bin\Win32_icl110\」フォルダ内に動画エンコーダ「umc_video_enc_con.exe」およびH.264デコーダ「umc_h264_dec_con.exe」、動画プレーヤー「simple_player.exe」が作成される。なお、このaudio-video-codecsサンプルのみ、コンパイルには別途DirectX SDKが必要なので注意して欲しい。

IPPのパフォーマンスを検証

 IPPは様々な分野で活用できる関数群を備えているだけでなく、さらにそれらのパフォーマンスが高いというのもポイントだ。例えば表3は先に紹介した、IPPのサンプルコードに含まれている動画エンコーダ(umc_video_enc_con.exe、以下IPPエンコーダ)と、オープンソースのH.264エンコーダである「x264」とで同じ動画をH.264形式でエンコードし、エンコードにかかった時間を比較したものだ。IPPエンコーダとx264とでは設定できるパラメータが微妙に異なるため、細かい部分の設定は完全に同一ではないが、IPPを使ったエンコーダがx264と比べて高いパフォーマンスを出していることが分かる。

表3 MPEG4/AVC H.264形式での動画エンコード時間
エンコーダ 1回目 2回目 3回目 平均
IPPエンコーダ 8.892 8.642 8.720 8.751
x264 14.165 14.118 14.243 14.175

 なお、x264にはVisual Studioのプロジェクトファイルが付属しているので、それをVisual Studioで開き、インテル C++ コンパイラでコンパイルしたものを使用している。コンパイル時のオプションは図2のように設定している。

図2 x264のコンパイルオプション
図2 x264のコンパイルオプション

 また、テストに使用したPCのスペックは表4のようなもので、エンコーディング設定は表5のように設定した。下記はx264のコマンドライン、こちらはIPPエンコーダで使用した設定ファイルである。

> x264.exe -I 250 -b 0 -r 1 -q 20 -B 2000 --frames 150 -o test_icc.mp4 test1.yuv 1280x720
表4 テストに使用したPCのスペック
項目 スペック
OS Windows Vista Businness SP1
CPU Core 2 Duo E6550(2.33GHz)
メモリ 2048MB


表5 テストでのエンコーディング設定
パラメータ
画像サイズ 1280×720
FPS 30
エンコードするフレーム数 150(約5秒)
パス数 1
ビットレート 2kbps
QP 20
GOPサイズ 250

 また、CPUをどのように使っているかをWindowsのタスクマネージャで確認したところ、IPPサンプルは2つのコアをほぼ均等に使っていたが(図3)、x264は片方のコアに多く負荷がかかっていた状態であった(図4)。このことからIPPを使ったエンコーダは並列処理の粒度が低く、より効率的に処理を実行できていると言える。

図3 IPPサンプル実行時のCPU利用状況
図3 IPPサンプル実行時のCPU利用状況


図4 x264実行時のCPU利用状況
図4 x264実行時のCPU利用状況

各種画像/音声/動画/統計処理などに活用できる

 以上で述べてきたとおり、IPPは画像/音声/動画/統計処理などに幅広く活用できるライブラリである。IPP本体は比較的低レベルなレイヤーの関数が多く、理解するまでのハードルが若干高い感はあるものの、サンプルコードを活用することで比較的簡単に高速な処理をアプリケーションへ実装できる。

 他の記事でも述べられているように、インテル コンパイラーを単体で使うだけでもアプリケーションの高速化が期待できるが、付属するMKLやこのIPPを活用することで、より大幅な高速化が期待できる。逆にいうと、IPPを使いこなすことさえできれば、非常に高速なマルチメディアアプリケーションや各種処理アプリケーションを実現できるということだ。

 インテル コンパイラーやMKL、IPPの国内での総代理店であるエクセルソフトのWebサイトでは、「インテル コンパイラーやMKL、IPPの採用で大幅にアプリケーションのパフォーマンスが向上した」との声も掲載されている。各種科学計算処理やマルチメディアアプリケーションなど、パフォーマンスが必要なアプリケーションの開発を行っているなら、インテル コンパイラーやMKL、IPPの導入を検討する十分な価値があるだろう。