入門チュートリアル: インテル® インテグレーテッド・パフォーマンス・プリミティブ 8.2 を使用したアプリケーションの最適化
シリアル C コードを実行する前に、Life.vb で以下の項目を確認します。
SerialLife 関数のコメントが外されていること。
IPPCilkLife 関数および IPPTBBLife 関数がコメントアウトされていること。
PictureBox1.Refresh() のコメントが外されていること。
アプリケーションを実行して、アプリケーションのパフォーマンスを確認します。
インテル® IPP は、可能な場合、インテル® ストリーミング SIMD 拡張命令 (インテル® SSE、SSE2、SSE3、SSE4、AVX など) を利用して、操作をベクトル化し高速化します。
インテル® IPP 最適化コードを実行する前に、Life.vb プロジェクトで以下の操作を行います。
IPPTBBLife 関数呼び出しのコメントを外します。
SerialLife 関数呼び出しをコメントアウトします。
アプリケーションを実行して、アプリケーションのパフォーマンスを確認します。
インテル® IPP には、特定のプロセッサーのタイプと命令セットで実行されるように、ランタイムにインテル® IPP の適切なバージョンを自動的に実行するディスパッチャーが含まれています。コードをインテル® IPP に静的にリンクする場合、ほかの関数呼び出しの前に ippInit() 関数を呼び出す必要があります。 この関数は、ランタイム・プロセッサー向けに最も適切に最適化されたコードを自動的に初期化します。この関数呼び出しが行われない場合、デフォルトの SIMD 命令セット (IA-32 対応プロセッサーの場合は SSE2、インテル® 64 対応プロセッサーの場合は SSE3) が使用されます。
最小限の最適化が行われたコードと、特定の CPU 向けに最適化されたコードの違いを確認するには、以下の操作を行います。
Lafe.vb の 68 行目付近の PictureBox1.Refresh() 関数の呼び出しをコメントアウトして、インテル® IPP 最適化コードの CPU 使用率を表示します。
CheckIPPTBBLife.cpp の 17 行目付近の ippInit() 関数をコメントアウトします。 アプリケーションを実行して、パフォーマンスを確認します。次に、この関数のコメントを外してアプリケーションを再度実行し、パフォーマンスの違いを評価します。
ライフゲームのアルゴリズムでは、「セルが生存するには、そのセルに隣接する生存セルが 2 つまたは 3 つでなければならない」と定められています。 インテル® IPP 関数 ippiCompareC_8u_C1R は、このテストを一度に 1 つのセルで実行するのではなく、セルデータのバッファーで実行します。
ippiCompareC_8u_C1R 関数は 8 ビットの符号なし画像データのバッファーを受け取り、ソース画像 ROI のピクセル数と指定された value を比較して、Ipp8u データの 1 チャネルの画像に結果を書き込みます。 値 (ここでは 2) が等しい場合、対応する出力ピクセルは IPP_MAX_8U に設定されます。等しくない場合、0 に設定されます。 画像 ROI は、バッファー全体になるように設定されます。このバッファーは、隣接するセルが 2 つのセルを格納するために使用されます。
IPPTBBLife.cpp の 62 行目付近の 2 つ目の関数 ippiCompareC_8u_C1R をコメントアウトします。
Lafi.vb の 68 行目付近の PictureBox1.Refresh() をコメントアウトします。
アプリケーションを実行します。表示されるセルのアクティビティーが大幅に減少していることが分かります。
ippiDup_8u_C1C3R 関数は、1 チャネルの (グレースケール) 画像を 3 チャネルの (カラー) 画像の各チャネルにコピーします。 ここでは、この関数は新しいセルの状態を出力バッファーにコピーします。
IPPTBBLife.cpp の 76 行目付近の ippiDup_8u_C1C3R 関数をコメントアウトして、プログラムを実行します。 出力ウィンドウが空になります。