インテル® IPP 2017 デベロッパー・ガイド

コア関数とサポート関数

ライブラリーとその動作状況に関する情報を簡単に使用できるようにする汎用関数がいくつかあります。

Init/GetCpuFeatures/ SetCpuFeatures/GetEnabledCpuFeatures

ippInit 関数は、プロセッサーの種類を検出し、ディスパッチャーが利用可能な命令セットに対応するインテル® IPP ライブラリーのプロセッサー固有のコードを使用するように設定します。アプリケーションで ippInit 関数を呼び出さない場合、ippCore 以外のドメインで最初にインテル® IPP 関数を呼び出したときに、利用可能な命令セット機能へのライブラリーの初期化が自動的に行われます。

デバッグやパフォーマンス解析のように、同じマシンでプロセッサー固有のコード間の違いに関するデータを取得する場合は、ippSetCpuFeatures 関数を使用します。この関数は、指定した CPU 機能のセットに応じたプロセッサー固有のコードを使用するように設定します。CPU でサポートされる機能は、ippGetCpuFeatures を使用して取得できます。また、現在ディスパッチされているインテル® IPP コードでサポートされる機能は、ippGetEnabledCpuFeatures を使用して取得できます。システムを照会せずに (CPUID 命令呼び出しを行わずに) 一部の CPU 機能のサポートを有効にする場合は、ippSetCpuFeaturesippCPUID_NOCHECK ビットをセットする必要があります。このビットをセットしない場合、現在の CPU でサポートされている機能のみ利用できます。

ippInit 関数、ippGetCpuFeatures 関数、ippGetEnabledCpuFeatures 関数および ippSetCpuFeatures 関数は、ippCore ライブラリーの一部です。

GetStatusString

ippGetStatusString 関数は、インテル® IPP 関数のリターンステータス (数値) を読みやすいテキスト形式にデコードします。

        status= ippInit();
        if( status != ippStsNoErr ) {
                printf("IppInit() Error:\n");
                printf("%s\n", ippGetStatusString(status) );
                return -1;
        }

ippGetStatusString 関数は、ippCore ライブラリーの一部です。

GetLibVersion

各ドメインには、ディスパッチャーからの使用中のライブラリー・レイヤーに関する情報を返す GetLibVersion 関数があります。次のコードは、画像処理ドメインから ippiGetLibVersion を使用する方法を示します。

const IppLibraryVersion* lib = ippiGetLibVersion();
printf(“%s %s %d.%d.%d.%d\n”, lib->Name, lib->Version,
lib->major, lib->minor, lib->majorBuild, lib->build);

この関数と ippInitCpu を併せて使用すると、同一マシン上で異なる実装の出力を比較することができます。

Malloc/Free

インテル® IPP 関数は、ポインターがアライメントされている場合、データをより高速に処理できます。次のインテル® IPP 関数は、データが適切にアライメントされることを保証します。インテル® AVX 命令セットをサポートしない CPU では 16 バイト、インテル® AVX およびインテル® AVX 2 をサポートする CPU では 32 バイト、インテル® MIC 命令をサポートする CPU では 64 バイトにデータがアライメントされます。

void* ippMalloc(int length)
void ippFree(void* ptr)

ippMalloc 関数は適切にアライメントされたバッファーを提供し、ippFree 関数はそのバッファーを解放します。

信号/画像処理ライブラリーはそれぞれ、適切にアライメントされたバッファーを割り当てる ippsMalloc 関数と ippiMalloc 関数、およびそれらを解放する ippsFree 関数と ippiFree 関数を提供します。

  • インテル® IPP とは異なるルーチンにより割り当てられたバッファーを使用する場合、開始アドレスがアライメントされていたほうがより高速に実行される可能性があります。バッファーがアライメントされていない場合は、ippAlignPtr 関数を使用します。
  • インテル® 64 アーキテクチャーで (2GB-1 を超えるサイズの) 大きなバッファーを割り当てるには、_L バージョンの Malloc 関数を使用します (ほかのバージョンの Malloc 関数はサイズ・パラメーターが 32 ビットの符号付き整数であるため)。ほかのアロケーターにより割り当てられた大きなバッファーの使用は、プラットフォーム認識関数およびスレッド化レイヤー (TL) 関数でのみ推奨します。

インテル® IPP 関数の詳細については、インテル® ソフトウェア・ドキュメント・ライブラリー (英語) にある『Intel® Integrated Performance Primitives for Intel® Architecture Developer Reference』を参照してください。

関連情報