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

メモリー割り当ての管理

インテル® IPP 関数では、ソースとデスティネーション・データに割り当てられるメモリー領域は、名前に I 記述子を含む関数を除き、オーバーラップしてはなりません。名前に I 記述子 (「記述子」を参照) を含む関数のみ、ソースとデスティネーション・データの両方を同じメモリー領域に割り当てることができます。インテル® IPP は、インプレースではない関数がインプレース・モードで使用された場合、正しい動作と結果を保証しません。

実装レイヤーと特定の演算パラメーターに応じて、一部のインテル® IPP 関数では、内部構造と作業バッファーに必要なメモリー容量が異なります。この違いに対応するには、次の操作を行います。

  1. <関数の基本名>GetSize 関数を使用して、必要なバッファーサイズを計算します (一部の関数は、名前に GetSize の代わりに GetBufSizeGetBufferSize が含まれます)。
  2. 初期化に必要なバッファーをセットアップします。詳細は、以下の「バッファーのセットアップ」を参照してください。
  3. <関数の基本名>Init 関数を使用して、操作の仕様および状態構造を初期化します。仕様および状態構造の詳細は、以下の「仕様および状態構造」を参照してください。
  4. (ステップ 2 でセットアップした) 初期化に使用したバッファーのみ解放します。
  5. メイン操作用の作業バッファーをセットアップします。詳細は、以下の「バッファーのセットアップ」を参照してください。
  6. メイン操作を実行します。
  7. ステップ 3 でセットアップした仕様および状態バッファーとステップ 5 でセットアップした作業バッファーを解放します。

pBuffer 引数 (外部メモリーバッファー) を含むインテル® IPP 関数を使用する場合、より優れた効率とパフォーマンスが得られるように、アプリケーションの 1 つの場所ですべての <関数の基本名>GetSize 関数を呼び出し、最大サイズの 1 つのバッファーのみ割り当てることを推奨します。このアプローチにより、システムメモリーとすべてのキャッシュレベルを最適に使用できます。

バッファーのセットアップ

ここで「バッファーのセットアップ」は、呼び出すインテル® IPP 関数に必要なメモリー容量を割り当てて、そのメモリー位置へのポインターを提供することを指します。より優れたパフォーマンスが得られるように、アライメントされたメモリーバッファーを割り当てるべきです。アライメント境界はアーキテクチャーにより異なり、インテル® ストリーミング SIMD 拡張命令 (インテル® SSE) では少なくとも 16 バイト、インテル® アドバンスト・ベクトル・エクステンション (インテル® AVX) では 32 バイト、インテル® アドバンスト・ベクトル・エクステンション 512 (インテル® AVX-512) 基本命令セットでは 64 バイトにすべきです。

アライメントされたメモリーバッファーをセットアップするには、ipp<ドメイン文字>Malloc_<インテル® IPP データ型> 関数の使用を推奨します。これらの関数は、常に適切にアライメントされたメモリーバッファーを提供します。

インテル® IPP 関数は、内部でメモリーを割り当てません。インテル® IPP 関数に必要なメモリーは、手動で適切なレベルで割り当てる必要があります。ipp<ドメイン文字>Malloc_<インテル® IPP データ型> 関数は、インテル® IPP 固有のメモリー・マネージャーを使用しません。単なる現在の C ランタイムの malloc() 関数のラッパーです。

仕様および状態構造

仕様構造は const です。インテル® IPP 関数呼び出し間で仕様構造のインスタンスが変更されることはありません。そのため、仕様構造の 1 つのインスタンスを、同じ操作を実行する別のアプリケーション・スレッドで同時に使用することができます。

状態構造は const ではありません。状態構造には、常にインテル® IPP 関数の中間計算ステージの状態が含まれます。そのため、状態構造の単一のインスタンスは、連続する操作にのみ使用できます。スレッド化されたアプリケーションでは、スレッドごとに個別の状態構造のインスタンスが必要です。

最適化に関する注意事項

インテル® コンパイラーでは、インテル® マイクロプロセッサーに限定されない最適化に関して、他社製マイクロプロセッサー用に同等の最適化を行えないことがあります。これには、インテル® ストリーミング SIMD 拡張命令 2、インテル® ストリーミング SIMD 拡張命令 3、インテル® ストリーミング SIMD 拡張命令 3 補足命令などの最適化が該当します。インテルは、他社製マイクロプロセッサーに関して、いかなる最適化の利用、機能、または効果も保証いたしません。本製品のマイクロプロセッサー依存の最適化は、インテル® マイクロプロセッサーでの使用を前提としています。インテル® マイクロアーキテクチャーに限定されない最適化のなかにも、インテル® マイクロプロセッサー用のものがあります。この注意事項で言及した命令セットの詳細については、該当する製品のユーザー・リファレンス・ガイドを参照してください。

注意事項の改訂 #20110804