利用するインテル® IPP 関数の数が少なく、必要なメモリー・フットプリントが小さいアプリケーションもあります。スタティック・リンク・ライブラリーを使用すると、小さなフットプリントと、複数のプロセッサーにおける最適化という両方の長所を活かすことができます。 スタティック・ライブラリー (例えば、libipps_l.a) は、非修飾の (標準名の) インテル® IPP 関数のエントリーポイントと、各プロセッサー固有の実装へのジャンプテーブルを提供します。 アプリケーションをリンクするとき、関数は、libippcore_l.a の関数で検出されたプロセッサーの設定に従って対応する関数を呼び出します。
スレッド化されたインテル® IPP 関数を使用する場合は、スタティック・ライブラリーのマルチスレッド・バージョン (例えば、libipps_t.a) とマルチスレッド・バージョンの libippcore_t.a にリンクする必要があります。
次のいずれかの関数を選択してライブラリーを初期化できます。
この 2 つのうちいずれかの関数を、他のインテル® IPP 関数を使用する前に呼び出す必要があります。初期化関数を呼び出さなかった場合、インテル® IPP 関数の C 最適化バージョンが呼び出されます。その結果、アプリケーションのパフォーマンスが低下します。次の例は、パフォーマンスの違いを示しています。この例は、t2.cpp ファイルに含まれています。
#include <stdio.h> #include <ipp.h> int main() { const int N = 20000, loops = 100; Ipp32f src[N], dst[N]; unsigned int seed = 12345678, i; Ipp64s t1,t2; /// no StaticInit call, means PX code, not optimized ippsRandUniform_Direct_32f(src,N,0.0,1.0,&seed); t1=ippGetCpuClocks(); for(i=0; i<loops; i++) ippsSqrt_32f(src,dst,N); t2=ippGetCpuClocks(); printf("without StaticInit: %.1f clocks/element\n", (float)(t2-t1)/loops/N); ippStaticInit(); t1=ippGetCpuClocks(); for(i=0; i<loops; i++) ippsSqrt_32f(src,dst,N); t2=ippGetCpuClocks(); printf("with StaticInit: %.1f clocks/element\n", (float)(t2-t1)/loops/N); return 0; } t2.cpp cmdlinetest>t2 without StaticInit: 61.3 clocks/element with StaticInit: 4.5 clocks/element
次の表は、スタティック・リンクの長所と短所の要約です。
長所 |
短所 |
---|---|
|
|
ディスパッチありのスタティック・リンクを使用するには、次の操作を行います。
アプリケーションに ipp.h をインクルードします。このヘッダーはすべてのインテル® IPP ドメインのヘッダーファイルをインクルードします。
ippStaticInit() または ippInitCPU() のいずれかの関数をヘッダーファイル ippcore.h で宣言して使用し、スタティック・ディスパッチャーを初期化します。
標準 (非修飾) の関数名を使用してインテル® IPP 関数を呼び出します。
対応するスタティック・ライブラリー、libippcore_l.a または libippcore_t.a を (順に) リンクします。 例えば、ippsCopy_8u() 関数を使用する場合、libipps_l.a および libippcore_l.a ライブラリーをリンクします。
© 2008 - 2010 Intel Corporation. 無断での引用、転載を禁じます。