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

インテル® IPP アプリケーションのビルド

インテル® IPP を初めて使用される方のために、以下に簡単なアプリケーションのサンプルコードを示します。

#include "ipp.h"
#include <stdio.h>
int main(int argc, char* argv[])
{
   const IppLibraryVersion *lib;
   IppStatus status;
   Ipp64u mask, emask;

   /* インテル® IPP ライブラリーを初期化します */
   ippInit();
   /* インテル® IPP ライブラリーのバージョン情報を取得します */
   lib = ippGetLibVersion();
   printf("%s %s\n", lib->Name, lib->Version);

   /* CPU の機能と選択したライブラリー・レベルで有効な機能を取得します */
   status = ippGetCpuFeatures( &mask, 0 );
   if( ippStsNoErr == status ) {
      emask = ippGetEnabledCpuFeatures();
      printf("CPU でサポートされる機能\tインテル® IPP でサポートされる機能\n");
      printf("-----------------------------------------\n");
      printf("  ippCPUID_MMX        = ");
      printf("%c\t%c\t",( mask & ippCPUID_MMX ) ? 'Y':'N',( emask & ippCPUID_MMX ) ? 'Y':'N');
      printf("インテル® MMX® テクノロジー\n");
      printf("  ippCPUID_SSE        = ");
      printf("%c\t%c\t",( mask & ippCPUID_SSE ) ? 'Y':'N',( emask & ippCPUID_SSE ) ? 'Y':'N');
      printf("インテル® ストリーミング SIMD 拡張命令\n");
      printf("  ippCPUID_SSE2       = ");
      printf("%c\t%c\t",( mask & ippCPUID_SSE2 ) ? 'Y':'N',( emask & ippCPUID_SSE2 ) ? 'Y':'N');
      printf("インテル® ストリーミング SIMD 拡張命令 2\n");
      printf("  ippCPUID_SSE3       = ");
      printf("%c\t%c\t",( mask & ippCPUID_SSE3 ) ? 'Y':'N',( emask & ippCPUID_SSE3 ) ? 'Y':'N');
      printf("インテル® ストリーミング SIMD 拡張命令 3\n");
      printf("  ippCPUID_SSSE3      = ");
      printf("%c\t%c\t",( mask & ippCPUID_SSSE3 ) ? 'Y':'N',( emask & ippCPUID_SSSE3 ) ? 'Y':'N');
      printf("インテル® ストリーミング SIMD 拡張命令 3 補足命令\n");
      printf("  ippCPUID_MOVBE      = ");
      printf("%c\t%c\t",( mask & ippCPUID_MOVBE ) ? 'Y':'N',( emask & ippCPUID_MOVBE ) ? 'Y':'N');
      printf("プロセッサーによる MOVBE 命令のサポート\n");
      printf("  ippCPUID_SSE41      = ");
      printf("%c\t%c\t",( mask & ippCPUID_SSE41 ) ? 'Y':'N',( emask & ippCPUID_SSE41 ) ? 'Y':'N');
      printf("インテル® ストリーミング SIMD 拡張命令 4.1\n");
      printf("  ippCPUID_SSE42      = ");
      printf("%c\t%c\t",( mask & ippCPUID_SSE42 ) ? 'Y':'N',( emask & ippCPUID_SSE42 ) ? 'Y':'N');
      printf("インテル® ストリーミング SIMD 拡張命令 4.2\n");
      printf("  ippCPUID_AVX        = ");
      printf("%c\t%c\t",( mask & ippCPUID_AVX ) ? 'Y':'N',( emask & ippCPUID_AVX ) ? 'Y':'N');
      printf("インテル® アドバンスト・ベクトル・エクステンション命令セット\n");
      printf("  ippAVX_ENABLEDBYOS  = ");
      printf("%c\t%c\t",( mask & ippAVX_ENABLEDBYOS ) ? 'Y':'N',( emask & ippAVX_ENABLEDBYOS ) ? 'Y':'N');
      printf("OS によるインテル® AVX サポート\n");
      printf("  ippCPUID_AES        = ");
      printf("%c\t%c\t",( mask & ippCPUID_AES ) ? 'Y':'N',( emask & ippCPUID_AES ) ? 'Y':'N');
      printf("インテル® AES 命令\n");
      printf("  ippCPUID_SHA        = ");
      printf("%c\t%c\t",( mask & ippCPUID_SHA ) ? 'Y':'N',( emask & ippCPUID_SHA ) ? 'Y':'N');
      printf("インテル® SHA 命令\n");
      printf("  ippCPUID_CLMUL      = ");
      printf("%c\t%c\t",( mask & ippCPUID_CLMUL ) ? 'Y':'N',( emask & ippCPUID_CLMUL ) ? 'Y':'N');
      printf("PCLMULQDQ 命令\n");
      printf("  ippCPUID_RDRAND     = ");
      printf("%c\t%c\t",( mask & ippCPUID_RDRAND ) ? 'Y':'N',( emask & ippCPUID_RDRAND ) ? 'Y':'N');
      printf("乱数読み取り命令\n");
      printf("  ippCPUID_F16C       = ");
      printf("%c\t%c\t",( mask & ippCPUID_F16C ) ? 'Y':'N',( emask & ippCPUID_F16C ) ? 'Y':'N');
      printf("Float16 命令\n");
      printf("  ippCPUID_AVX2       = ");
      printf("%c\t%c\t",( mask & ippCPUID_AVX2 ) ? 'Y':'N',( emask & ippCPUID_AVX2 ) ? 'Y':'N');
      printf("インテル® アドバンスト・ベクトル・エクステンション 2 命令セット\n");
      printf("  ippCPUID_AVX512F    = ");
      printf("%c\t%c\t",( mask & ippCPUID_AVX512F ) ? 'Y':'N',( emask & ippCPUID_AVX512F ) ? 'Y':'N');
      printf("インテル® アドバンスト・ベクトル・エクステンション 3.1 命令セット\n");
      printf("  ippCPUID_AVX512CD   = ");
      printf("%c\t%c\t",( mask & ippCPUID_AVX512CD ) ? 'Y':'N',( emask & ippCPUID_AVX512CD ) ? 'Y':'N');
      printf("インテル® アドバンスト・ベクトル・エクステンション CD (競合検出) 命令セット\n");
      printf("  ippCPUID_AVX512ER   = ");
      printf("%c\t%c\t",( mask & ippCPUID_AVX512ER ) ? 'Y':'N',( emask & ippCPUID_AVX512ER ) ? 'Y':'N');
      printf("インテル® アドバンスト・ベクトル・エクステンション ER 命令セット\n");
      printf("  ippCPUID_ADCOX      = ");
      printf("%c\t%c\t",( mask & ippCPUID_ADCOX ) ? 'Y':'N',( emask & ippCPUID_ADCOX ) ? 'Y':'N');
      printf("ADCX および ADOX 命令\n");
      printf("  ippCPUID_RDSEED     = ");
      printf("%c\t%c\t",( mask & ippCPUID_RDSEED ) ? 'Y':'N',( emask & ippCPUID_RDSEED ) ? 'Y':'N');
      printf("RDSEED 命令\n");
      printf("  ippCPUID_PREFETCHW  = ");
      printf("%c\t%c\t",( mask & ippCPUID_PREFETCHW ) ? 'Y':'N',( emask & ippCPUID_PREFETCHW ) ? 'Y':'N');
      printf("PREFETCHW 命令\n");
      printf("  ippCPUID_KNC        = ");
      printf("%c\t%c\t",( mask & ippCPUID_KNC ) ? 'Y':'N',( emask & ippCPUID_KNC ) ? 'Y':'N');
      printf("インテル® Xeon Phi™ コプロセッサー命令セット\n");
   }
   return 0;
}

このアプリケーションは、次の 3 つのセクションで構成されています。

  1. インテル® IPP ライブラリーを初期化します。インテル® IPP による最適化を最大限に利用するためには、この処理が必要です。ippInit 関数は、プロセッサーの種類を検出し、ディスパッチャーが利用可能な命令セットに対応するインテル® IPP ライブラリーのプロセッサー固有のコードを使用するように設定します。ippInit() なしでアプリケーションを実行すると、ippCore 以外のドメインで最初にインテル® IPP 関数を呼び出したときに、インテル® IPP ライブラリーが自動初期化され、最小の最適化が実装されます。

    デバッグシナリオによっては、ディスパッチャーにより選択される最適な実装よりも、ippSetCpuFeatures() で特定の実装を指定したほうが良い場合があります。

  2. ライブラリーのレイヤー名とバージョンを取得します。バージョン情報は、/include ディレクトリーにある ippversion.h ファイルでも確認できます。

  3. ライブラリー・レイヤーで使用されるハードウェアの最適化と CPU でサポートされるハードウェアの最適化を示します。

Windows* 上の Microsoft* Visual Studio* 統合でのサンプルコードのビルド

Windows* 上では、Microsoft* Visual Studio* を使用したほうが、インテル® IPP アプリケーションを簡単にビルドできます。上記のサンプルコードをビルドする場合は、次のステップを実行します。

  1. Microsoft* Visual Studio* を起動して、空の C++ プロジェクトを作成します。

  2. 新しい c ファイルを追加し、上記のサンプルコードをペーストします。

  3. 「Microsoft* Visual Studio* プロジェクトとインテル® IPP の自動リンク」で説明されているように、インクルード・ディレクトリーとリンクモデルを設定します。

  4. アプリケーションをコンパイルして実行します。

統合プラグインをインストールしていない場合は、インテル® IPP アプリケーションをビルドするため、「Microsoft* Visual Studio* IDE でインテル® IPP をリンクする場合の構成」の手順に従って Microsoft* Visual Studio* IDE を設定します。

Linux* でのサンプルコードのビルド

Linux* 上で上記のサンプルコードをビルドする場合は、次のステップを実行します。

  1. サンプルコードをコピーして、エディターにペーストします。

  2. シェルでコンパイラー変数とインテル® IPP 変数が設定されていることを確認してください。環境変数の設定方法については、「環境変数の設定」を参照してください。

  3. 次のコマンドを使用してコンパイルします: icc ipptest.cpp -o ipptest -I $IPPROOT/include -L $IPPROOT/lib/<arch> -lippi -lipps -lippcore。リンクするインテル® IPP ライブラリーの詳細については、「ドメイン別のライブラリー依存関係」「リンクオプション」を参照してください。

    インテル® Xeon Phi™ コプロセッサー上でのオフロードコンパイルには、次のコマンドを使用します: icc -qoption,link,"--no-undefined" $< -o application test.o -qoffload-option,mic,link," -L$(IPPROOT)/lib/mic -lippi -lipps -lippcore"。インテル® Xeon Phi™ コプロセッサー上でのインテル® IPP の使用に関する詳細は、<ipp directory>/examples/ サブディレクトリーの アーカイブにある、インテル® Xeon Phi™ コプロセッサー向けのマルチスレッド・サンプル (ipp_thread_mic) と関連資料 (ipp-examples.html) を参照してください。

  4. アプリケーションを実行します。

macOS* でのサンプルコードのビルド

macOS* 上で上記のサンプルコードをビルドする場合は、次のステップを実行します。

  1. サンプルコードをコピーして、エディターにペーストします。

  2. シェルでコンパイラー変数とインテル® IPP 変数が設定されていることを確認してください。環境変数の設定方法については、「環境変数の設定」を参照してください。

  3. 次のコマンドを使用してコンパイルします: icc ipptest.cpp -o ipptest -I $IPPROOT/include -L $IPPROOT/lib/ -lippi -lipps -lippcore。リンクするインテル® IPP ライブラリーの詳細については、「ドメイン別のライブラリー依存関係」「リンクオプション」を参照してください。

  4. アプリケーションを実行します。

関連情報