インテル® IPP DLL を含むアプリケーションの配布

インテル® IPP

この記事は、インテル® ソフトウェア・サイトに掲載されている「Deploying applications with Intel® IPP DLLs」の日本語参考訳です。


ステップ 1 – 概要

インテル® インテグレーテッド・パフォーマンス・プリミティブ (インテル® IPP) のダイナミック・リンク・ライブラリー (DLL) を使用して作成したアプリケーションを配布する場合、ソフトウェアの再配布で問題が発生しないように、プロセッサーの検出とライブラリー・ディスパッチについて理解しておくことが重要です。また、次の 2 つの点についても考慮する必要があります。

  • 適切な DLL リンクモデルの選択
  • ターゲットシステムにおける DLL の場所

この記事では、インテル® IPP DLL の動作環境を紹介し、考慮すべき点について説明します。

インテル® IPP のリンクモデルについての詳細は、「インテル® IPP リンクモデル – クイック・リファレンス・ガイド (英語)」を参照してください。

バージョン情報

この記事は、インテル® 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 ダイナミック・ライブラリーにリンクするには、以下の手順を実行します。

  1. ソースコードに ipp.h をインクルードします。
  2. [表示] > [ソリューション エクスプローラ] を選択します (このウィンドウがアクティブになっていることを確認します)。
  3. Microsoft* コンパイラーを使用している場合は、[ツール] > [オプション] > [プロジェクトおよびソリューション] > [Visual C++ ディレクトリ] を選択します。
    • [ディレクトリを表示するプロジェクト:] ドロップダウン・メニューで [インクルード ファイル] を選択し、インテル® IPP ヘッダーファイルのディレクトリーを入力します。
    • [ディレクトリを表示するプロジェクト:] ドロップダウン・メニューで [ライブラリ ファイル] を選択し、インテル® IPP ディスパッチャー・スタブ・ライブラリーのディレクトリーを入力します。
    • [ディレクトリを表示するプロジェクト:] ドロップダウン・メニューで [実行可能ファイル] を選択し、インテル® IPP ダイナミック・ライブラリーのディレクトリーを入力します。

  4. インテル® C++ コンパイラー 10.1 を使用している場合は、[ツール] > [オプション] > [インテル(R) C++] > [コンパイラー] を選択します。
    • [インクルード] フィールドに、インテル® IPP ヘッダーファイルのディレクトリーを入力します。
    • [ライブラリー] フィールドに、インテル® IPP ディスパッチャー・スタブ・ライブラリーのディレクトリーを入力します。
    • [実行可能ファイル] フィールドに、インテル® IPP ダイナミック・ライブラリーのディレクトリーを入力します。

  5. [OK] をクリックして設定を適用し、ウィンドウを閉じます。
  6. メインツールバーで、[プロジェクト] > [プロパティ] > [構成プロパティ] > [リンカ] > [入力] を選択し、[追加の依存ファイル] 行に必要なライブラリー (例えば、ipps.lib または ippsem64t.lib) を追加します。アプリケーションにリンクするライブラリーを判断するには、「ドメイン別のライブラリー依存関係」(http://software.intel.com/en-us/articles/intel-integrated-performance-primitives-intel-ipp-library-dependencies-by-domain) を参照してください。
  7. [OK] をクリックして設定を適用し、ウィンドウを閉じます。

カスタム DLL
カスタム DLL をビルドしてリンクするには、インテル® IPP サンプルコードのパッケージをダウンロードして展開します。フォルダー ipp-samples\advanced-usage\linkage\customdll に移動して、readme.htm の説明に従います。

Microsoft* Visual Studio* 2010 環境でインテル® IPP 7.0 以降のバージョンを使用する場合は、以下の手順を実行してインテル® IPP ヘッダーファイルとライブラリーのパスを設定することができます。

  1. ソースコードに ipp.h をインクルードします。
  2. [表示] > [ソリューション エクスプローラ] を選択します (このウィンドウがアクティブになっていることを確認します)。
  3. [プロジェクト] > [プロパティ] から [プロパティ ページ] ダイアログボックスを開きます。
  4. [インテル® パフォーマンス・ライブラリー] を選択して、[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 を配布するには、以下の操作を行います。

  1. 適切な DLL リンクモデルを選択します。
    • ダイナミック・リンク – アプリケーションはスタブ・ライブラリーにリンクされます。実行時に、ディスパッチャー DLL がターゲット・プロセッサーを検出して、プロセッサー固有の DLL をディスパッチします。ディスパッチャーおよびプロセッサー固有の DLL は、アプリケーションとともに配布されます。
    • カスタム DLL – アプリケーションはカスタム・インポート・ライブラリーにリンクされます。実行時に、カスタム DLL が呼び出されます。カスタム DLL は、アプリケーションとともに配布されます。
  2. エンドユーザー・システムでインテル® 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/)

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

タイトルとURLをコピーしました