この記事は、インテル® ソフトウェア・サイトに掲載されている「Deploying applications with Intel® IPP DLLs」の日本語参考訳です。
ステップ 1 – 概要
インテル® インテグレーテッド・パフォーマンス・プリミティブ (インテル® IPP) のダイナミック・リンク・ライブラリー (DLL) を使用して作成したアプリケーションを配布する場合、ソフトウェアの再配布で問題が発生しないように、プロセッサーの検出とライブラリー・ディスパッチについて理解しておくことが重要です。また、次の 2 つの点についても考慮する必要があります。
- 適切な DLL リンクモデルの選択
- ターゲットシステムにおける DLL の場所
この記事では、インテル® IPP DLL の動作環境を紹介し、考慮すべき点について説明します。
インテル® IPP のリンクモデルについての詳細は、「インテル® IPP リンクモデル – クイック・リファレンス・ガイド」(http://software.intel.com/en-us/articles/intel-integrated-performance-primitives-intel-ipp-intel-ipp-linkage-models-quick-reference-guide) を参照してください。
バージョン情報
この記事は、インテル® IPP 6.x Windows* 版で 32 ビットおよびインテル® 64 アプリケーションをビルドするケースを説明しています。また、この翻訳版ではバージョン 7.0 以降でも参考にできるよう、原文に無い記述を追加しています。注: インテル® IPP DLL を配布する前に、ライセンスで再配布が許可されていることを確認してください。
新しいバージョンのインテル® IPP については、「インテル® IPP 7.0 ライブラリーの新しいディレクトリー構成と命名規則」(http://software.intel.com/en-us/articles/new-directory-structure-and-library-naming-in-ipp) を参照してください。インテル® IPP はインテル® Parallel Studio ファミリーの主要コンポーネントです。インテル® Parallel Studio では、インテル® IPP ライブラリーは redist ディスレクトリーに含まれています。
商用ライセンスの取得に関する詳しい情報は、インテル® IPP の Web サイトを参照してください。
ステップ 2 – 主な概念
ライブラリー・ディスパッチャー
すべてのインテル® IPP 関数には、特定のターゲット・プロセッサー向けにパフォーマンスが最適化された、さまざまなバイナリー実装が用意されています。これらのプロセッサー固有の関数は個別の DLL に含まれています。各 DLL の名称には、ターゲット・プロセッサーの ID とインテル® IPP のバージョンを表す接頭辞が付けられています。例えば、32 ビットのインテル® Core™2 プロセッサー向け信号処理ライブラリーの名前は ippsv8-6.x.dll です (v8 は CPU ID、6.x はインテル® IPP 6.x バージョンを表します)。
表 1: CPU ID とプロセッサー固有のライブラリーの関係
32 ビット ID | 64 ビット ID | 意味 |
px | mx | 32 ビットおよびインテル® 64 ベースのプロセッサー向けにそれぞれ最適化 (6.xのみ) |
w7 | – | インテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2) 対応プロセッサー向けに最適化 |
t7 | m7 | インテル® SSE3 対応インテル® Pentium® 4 プロセッサー向けに最適化 (6.xのみ) |
v8 | u8 | インテル® Atom™ プロセッサーおよびインテル® ストリーミング SIMD 拡張命令 3 補足命令 (インテル® SSSE3) 対応プロセッサー向けに最適化 |
p8 | y8 | インテル® SSE4.1、SSE4.2、およびインテル® AES New Instructions (インテル® AES-NI) 対応プロセッサー向けに最適化 |
g9 | e9 | インテル® AVX 対応プロセッサー向けに最適化 (7.x以降) |
h9 | l9 | インテル® AVX2 対応プロセッサー向けに最適化 (7.x以降) |
アプリケーションで最初のインテル® IPP 関数が呼び出されると、アプリケーションはインテル® IPP ディスパッチャー・ライブラリーのシステムパスを検索します。ディスパッチャー・ライブラリーは、システムのプロセッサーを識別して、ターゲット・プロセッサーで最もパフォーマンスが高い関数バージョンを呼び出します。ディスパッチャーはアプリケーションの初期化中に最適化済み関数のエントリーポイントに一度だけリンクするため、このプロセスによりオーバーヘッドが増加することはありません。コードが実行されるプロセッサーを考えることなく、最適化された関数を呼び出すことができます。
ダイナミック・リンク
ダイナミック・リンク・ライブラリーは、アプリケーションを実行する時にロードされます。アプリケーションを stublib フォルダーのインテル® IPP ライブラリーにリンクしてください (インテル® IPP ライブラリー 7.0 以降では、ipp\lib\ia32 および ipp\lib\intel64 フォルダーの中にインテル® IPP ライブラリー ファイルがインストールされます)。このライブラリーは、ディスパッチャー・ライブラリーをロードして、正しいエントリーポイントにリンクします。ディスパッチャー DLL とプロセッサー固有の DLL がシステムパスに存在していることを確認してください。次の図で、アプリケーションは stublib\ipps.lib にリンクしています。ipps.dll は実行時に ippsv8-6.x.dll を自動的にロードします。
プロセッサー固有のディスパッチ
アプリケーションで多くのインテル® IPP 関数を呼び出している場合は、ダイナミック・リンクが便利です。ほとんどのアプリケーションには、このモデルが適しています。
カスタム DLL のビルド
ダイナミック・リンクに加えて、インテル® IPP には、開発者が独自の DLL を作成するためのツールも用意されています。このツールは、選択したインテル® IPP 関数をカスタム DLL にリンクして、アプリケーションにリンクできるインポート・ライブラリーを作成します。アプリケーションで特定の関数セットを使用している場合は、カスタム DLL が便利です。カスタム DLL は、アプリケーションとともに配布する必要があります。
スレッド化とマルチコアのサポート
インテル® IPP は、マルチプロセッサーおよびマルチコアシステムで優れたパフォーマンスを発揮する、マルチスレッド化されたダイナミック・ライブラリーをサポートしています。スレッドは OpenMP* を使用して実装されており、libiomp5md.dll が必要です。バージョン 5.3 以降のスレッド関数のリストは doc\ThreadedFunctionsList.txt を参照してください (バージョン 7.0 以降では、Documentation\en_US\ipp あるいは Documentation\ja_JP\ipp フォルダーの中に ThreadedFunctionList.txt がインストールされます)。バージョン 5.0、5.1、5.2 のスレッド関数のリストは、オンラインで提供されています。すべての関数はスレッドセーフです。
リンクモデルの選択
インテル® IPP は、2 つのダイナミック・リンク・オプションをサポートしています。ダイナミック・リンク・モデルの比較を表 2 に示します。
表 2: ダイナミック・リンク・モデル
機能 | ダイナミック・リンク | カスタム DLL |
プロセッサーの更新 | 自動 | 再コンパイルおよび再配布 |
最適化 | すべてのプロセッサー | すべてのプロセッサー |
ビルド | スタブ・スタティック・ライブラリーにリンク | 個別の DLL をディスパッチする個別のインポート・ライブラリーにリンク |
関数の命名規則 | 標準 | 標準 |
バイナリーのサイズ | 大きい | 小さい |
実行ファイルのサイズ | 最小 | 最小 |
カーネルモード | × | × |
マルチスレッド | ○ | 可能 |
ステップ 3 – アプリケーションのリンク
インテル® IPP は、Microsoft* Visual C++* 2005 以降とインテル® C++ コンパイラー 10.0 以降でコンパイルすることができます。Microsoft* Visual Studio* でインテル® IPP ライブラリーをリンクするための設定方法は、この後で説明します。設定の前に、開発システムでインテル® IPP ファイルが含まれている場所を確認してください。インテル® IPP ヘッダーファイル、ディスパッチャー・スタブ・ライブラリー、ダイナミック・ライブラリーのデフォルトの場所を表 3 に示します。
表 3a: IPP5.x のデフォルトのファイルの場所
ファイルタイプ | 32 ビットのデフォルトの場所 | インテル® 64 のデフォルトの場所 |
ヘッダーファイル | C:\Program Files\Intel\IPP\6.x\ia32\include | C:\Program Files\Intel\IPP\6.x\em64t\include |
ディスパッチャー・スタブ・ライブラリー | C:\Program Files\Intel\IPP\6.x\ia32\stublib | C:\Program Files\Intel\IPP\6.x\em64t\stublib |
ダイナミック・ライブラリー | C:\Program Files\Intel\IPP\6.x\ia32\bin | C:\Program Files\Intel\IPP\6.x\em64t\bin |
表 3b: IPP7.x以降のデフォルトのファイルの場所
ファイルタイプ | 32 ビットのデフォルトの場所 | インテル® 64 のデフォルトの場所 |
ヘッダーファイル | C:\Program Files (x86)\Intel\Composer XE 「2013もしくは2011」\ipp\include | C:\Program Files (x86)\Intel\Composer XE 「2013もしくは2011」\ipp\include |
ディスパッチャー・スタブ・ライブラリー | C:\Program Files (x86)\Intel\Composer XE 「2013もしくは2011」\ipp\lib\ia32 | C:\Program Files (x86)\Intel\Composer XE 「2013もしくは2011」\ipp\lib\intel64 |
ダイナミック・ライブラリー | C:\Program Files (x86)\Intel\Composer XE 「2013もしくは2011」\redist\ia32\ipp | C:\Program Files (x86)\Intel\Composer XE 「2013もしくは2011」\redist\intel64\ipp |
ダイナミック・リンク
Microsoft* Visual Studio* 2008 環境を使用して 32 ビットおよびインテル® 64 ダイナミック・ライブラリーにリンクするには、「Microsoft* Visual C++* 2008 でのインテル® IPP の呼び出し」(英語) (http://software.intel.com/en-us/articles/calling-intel-ipp-in-msvc-2008microsoft-visual-c-2008)を参照してください。
Microsoft* Visual Studio* 2005 環境を使用して 32 ビットおよびインテル® 64 ダイナミック・ライブラリーにリンクするには、以下の手順を実行します。
- ソースコードに ipp.h をインクルードします。
- [表示] > [ソリューション エクスプローラ] を選択します (このウィンドウがアクティブになっていることを確認します)。
- Microsoft* コンパイラーを使用している場合は、[ツール] > [オプション] > [プロジェクトおよびソリューション] > [Visual C++ ディレクトリ] を選択します。
- [ディレクトリを表示するプロジェクト:] ドロップダウン・メニューで [インクルード ファイル] を選択し、インテル® IPP ヘッダーファイルのディレクトリーを入力します。
- [ディレクトリを表示するプロジェクト:] ドロップダウン・メニューで [ライブラリ ファイル] を選択し、インテル® IPP ディスパッチャー・スタブ・ライブラリーのディレクトリーを入力します。
- [ディレクトリを表示するプロジェクト:] ドロップダウン・メニューで [実行可能ファイル] を選択し、インテル® IPP ダイナミック・ライブラリーのディレクトリーを入力します。
- インテル® C++ コンパイラー 10.1 を使用している場合は、[ツール] > [オプション] > [インテル(R) C++] > [コンパイラー] を選択します。
- [インクルード] フィールドに、インテル® IPP ヘッダーファイルのディレクトリーを入力します。
- [ライブラリー] フィールドに、インテル® IPP ディスパッチャー・スタブ・ライブラリーのディレクトリーを入力します。
- [実行可能ファイル] フィールドに、インテル® IPP ダイナミック・ライブラリーのディレクトリーを入力します。
- [OK] をクリックして設定を適用し、ウィンドウを閉じます。
- メインツールバーで、[プロジェクト] > [プロパティ] > [構成プロパティ] > [リンカ] > [入力] を選択し、[追加の依存ファイル] 行に必要なライブラリー (例えば、ipps.lib または ippsem64t.lib) を追加します。アプリケーションにリンクするライブラリーを判断するには、「ドメイン別のライブラリー依存関係」(http://software.intel.com/en-us/articles/intel-integrated-performance-primitives-intel-ipp-library-dependencies-by-domain) を参照してください。
- [OK] をクリックして設定を適用し、ウィンドウを閉じます。
カスタム DLL
カスタム DLL をビルドしてリンクするには、インテル® IPP サンプルコードのパッケージをダウンロードして展開します。フォルダー ipp-samples\advanced-usage\linkage\customdll に移動して、readme.htm の説明に従います。
Microsoft* Visual Studio* 2010 環境でインテル® IPP 7.0 以降のバージョンを使用する場合は、以下の手順を実行してインテル® IPP ヘッダーファイルとライブラリーのパスを設定することができます。
- ソースコードに ipp.h をインクルードします。
- [表示] > [ソリューション エクスプローラ] を選択します (このウィンドウがアクティブになっていることを確認します)。
- [プロジェクト] > [プロパティ] から [プロパティ ページ] ダイアログボックスを開きます。
- [インテル® パフォーマンス・ライブラリー] を選択して、[IPPの使用] からインテル® IPP のインクルード・ディレクトリとリンクモデルを指定します。
ステップ 3 – アプリケーションの配布
インテル® IPP ディスパッチャーとプロセッサー固有の DLL 、あるいはカスタム DLL はアプリケーションとともに配布する必要があります。インテル® IPP コア関数ライブラリー ippcore-6.x.dll および OpenMP ダイナミック・リンク・ライブラリー libiomp5md.dll も一緒に配布する必要があります。
カスタム DLL を配布する場合、競合を回避し管理を容易にするため、異なる命名規則を利用してください。インテル® IPP の新バージョンで対応した新しいプロセッサーの最適化を含めるためにカスタム DLL を再コンパイルして再配布する場合も同様です。
Windows* の PATH システム環境変数は、実行ファイルが検索するフォルダーの場所を示します。アプリケーションを起動するときに、インテル® IPP DLL が PATH 変数にリストされているフォルダーに含まれている必要があります。ターゲットシステムのインテル® IPP DLL またはカスタム DLL の場所として、 ターゲットシステムの WINDOWS\system32、アプリケーション・フォルダー、その他のフォルダーを選択します。次の表は、これらのオプションの比較です。
表 4: インテル® IPP DLL の場所
システムパス | アクセス権限 | スレッド・ライブラリー | |
WINDOWS\system32 | このフォルダーはデフォルトでシステムパスにリストされます。 | このフォルダーにファイルをコピーするには管理者権限が必要な場合があります。 | ほかのアプリケーションがこのフォルダーにスレッド・ライブラリーをコピーすると、競合が発生する可能性があります。 |
アプリケーション・フォルダーまたはサブフォルダー | Windows は DLL のアプリケーション・フォルダーを最初に確認します。 | 特別なアクセス権限が必要な場合があります。 | 競合は発生しません。 |
その他のフォルダー | このディレクトリーをシステムパスに追加します。 | 特別なアクセス権限が必要な場合があります。 | 競合が発生する可能性があります。 |
すべてのケースで、アプリケーションを正しく実行するには、インテル® IPP DLL またはカスタム DLL を特定の場所に配置する必要があります。
インテル® IPP は、最新のプロセッサー向けに 32 ビットおよびインテル® 64 対応アプリケーションのパフォーマンスを最適化する手法を提供しています。アプリケーションおよび DLL を配布するには、以下の操作を行います。
- 適切な DLL リンクモデルを選択します。
- ダイナミック・リンク – アプリケーションはスタブ・ライブラリーにリンクされます。実行時に、ディスパッチャー DLL がターゲット・プロセッサーを検出して、プロセッサー固有の DLL をディスパッチします。ディスパッチャーおよびプロセッサー固有の DLL は、アプリケーションとともに配布されます。
- カスタム DLL – アプリケーションはカスタム・インポート・ライブラリーにリンクされます。実行時に、カスタム DLL が呼び出されます。カスタム DLL は、アプリケーションとともに配布されます。
- エンドユーザー・システムでインテル® IPP DLL を配置する場所を決定します。
- WINDOWS\system32
- アプリケーション・フォルダーまたはサブフォルダー
- その他のフォルダー
付録 A – 正当性の検証
インテル® IPP デモ・ソフトウェアまたはサンプル・コード・プログラムを使用して DLL の再配布をテストすることができます。
- 2 つのテスト・アプリケーションが demo フォルダーに含まれています。
- インテル® IPP サンプルは、配布のテストにも利用できます。
Windows* アプリケーションが DLL を見つけられない場合、エラーが発生します。次の表は、これらのエラーについて説明しています。
表 5: 一般的なエラーメッセージ
問題 | エラーメッセージ (英語) |
コア・ライブラリーが見つからない。 | “The application has failed to start because ippcore-6.x.dll was not found. Re-installing the application may fix this problem.” |
ディスパッチャー DLL またはカスタム DLL が見つからない。 | “The application has failed to start because ipps-6.x.dll was not found. Re-installing the application may fix this problem.” |
スレッド・ライブラリーが見つからない。 | “The application has failed to start because libiomp5md.dll was not found. Re-installing the application may fix this problem.” |
プロセッサー固有の DLL が見つからない。 | “No DLLs were found in the Waterfall procedure” |
付録 B – 既知の問題点と制限事項
- インテル® IPP DLL の名前には、バージョン 5.1 からインテル® IPP のバージョンが追加されるようになりました (例えば、ippst7-5.1.dll)。
- 異なるインテル® ソフトウェア開発製品からスレッド・ライブラリーの複数のバージョンを使用している場合、アプリケーションとともに再配布するライブラリーとして最新バージョンのライブラリーを選択してください。
- インテル® IPP ランタイム・インストーラー (RTI) は使用しないでください。インテル® IPP バージョン 6.x 以降には RTI ユーティリティーは含まれていません。
付録 C – リファレンス
- マルチコア・プロセッサー向けアプリケーションの最適化: インテル® インテグレーテッド・パフォーマンス・プリミティブ、第 2 版 (http://www.intel.com/intelpress/sum_ipp2.htm)
- インテル® アーキテクチャー向けアプリケーションの最適なインテル® インテグレーテッド・パフォーマンス・プリミティブ リンクモデルの選択 (http://software.intel.com/sites/default/files/m/d/4/1/d/8/219301_linkage_models.pdf)
- スレッド化/OpenMP* FAQ (href=”http://software.intel.com/en-us/articles/intel-integrated-performance-primitives-intel-ipp-threading-openmp-faq)
- EULA/ライセンス FAQ (http://software.intel.com/en-us/articles/intel-integrated-performance-primitives-licensing-faq)
- インテル® IPP のユーザーフォーラム (http://software.intel.com/en-us/forums/intel-integrated-performance-primitives)
- インテル® プレミアサポート (https://premier.intel.com/)
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。