この記事は、インテル® デベロッパー・ゾーンに掲載されている「Using Intel® Threading Building Blocks in Universal Windows Platform applications」(https://software.intel.com/en-us/blogs/2017/11/27/using-intel-threading-building-blocks-in-universal-windows-platform-applications) の日本語参考訳です。
インテル® スレッディング・ビルディング・ブロック (インテル® TBB) ライブラリーは、C++ アプリケーションで容易に並列処理の実装を可能にする一連のアルゴリズムを提供します。インテル® TBB は高い移植性を持ち、インテル® アーキテクチャーをベースとする Windows* デバイスの全機能を含む複数のプラットフォームをサポートします。
インテル® TBB 2018 リリースでは、ユニバーサル Windows* プラットフォーム (UWP) のサポートが追加され、開発者はすべての Windows* デバイス (PC、タブレット、携帯電話、Xbox*、HoloLens*、Surface Hub*、および IoT) 上で実行するアプリケーションの開発ができるようになりました。
UWP は広範囲に渡るため、プラットフォームのセキュリティーに違反する可能性のある API に制限があります。Microsoft* Visual C++* コンパイラーは、そのような API 呼び出しを識別する際に使用する /ZW オプションを提供しています。しかし、アプリケーションが完全に UWP に準拠していることを確認するには、パッケージ全体を Windows* アプリ認定キットを使用してチェックする必要があります。
インテル® TBB を使用して UWP アプリケーションの開発を始める
「Windows* 8 チュートリアル: インテル® スレッディング・ビルディング・ブロックを使用して、Windows* ストア向けのマルチスレッド・アプリケーションを記述」 (https://software.intel.com/en-us/blogs/2013/02/05/writing-a-multithreaded-application-for-the-windows-store) および「Windows* 8 チュートリアル: インテル® スレッディング・ビルディング・ブロックを使用して、Windows* ストア向けのマルチスレッド・アプリケーションと DLL を記述」 (https://software.intel.com/en-us/articles/windows-8-tutorial-writing-a-multithreaded-application-for-the-windows-store-using-intel-threading-building-blocks-now-with-dlls) は、わずかな変更での UWP アプリケーション開発に最適です。
- Microsoft* Visual Studio* 2015/2017 のテンプレート 空白のアプリ (Windows* ストア) の代わりに、空白のアプリ (ユニバーサル Windows*) を使用する必要があります。
- インテル® TBB ライブラリーの事前ビルドされた UWP 対応のバイナリーは、商用版またはオープンソース版のディストリビューションに含まれています。以下のドキュメントをご覧ください。
- オープンソース・ディストリビューション: <distribution_root>\lib\<target_architecture>\vc14_uwp
- 商用版: <suite_install_dir>\compilers_and_libraries_<version>\windows\tbb\lib\<target_architecture>\vc14_uwp。ここで、<suite_install_dir> は、インテル® TBB を含むソフトウェア・スイートのインストール先です (C:\Program Files (x86)\IntelSWTools\)。
ユニバーサル Windows* ドライバー・プラットフォームもまたサポートされます。インテル® TBB の商用版では、vc14_uwd ディレクトリーにそれらのバイナリーが格納されています。また、Windows* ランタイム (WinRT) 向けのバイナリーも vc12_ui ディレクトリーに残されています。
ソースからバイナリーをビルドする場合、「インテル® TBB をソースからビルドする」セクションをご覧ください。
インテル® TBB を UWP アプリケーションにパッケージ化する手順は、Windows* 8 アプリケーションとほぼ同じです。
- Microsoft* Visual Studio* で、プロジェクトのプロパティーから、[リンカー] オプションを選択し、[入力] > [追加の依存ファイル] に tbb.dll を設定し、[全般] > [追加のライブラリ ディレクトリ] にインテル® TBB バイナリーが含まれるディレクトリーを指定します。
- プロジェクトのルートで右クリックし、[追加] > [既存の項目…] を選択します。tbb.dll ファイルを選択して、UWP プロジェクトの依存関係に追加します。
- プロジェクト・ツリーの tbb.dll を右クリックし、プロパティーを選択します。プロパティー・ページで、[コンテンツ] を [はい] にしてファイルをコンテンツとしてマークします。これで、インテル® TBB ライブラリーを UWP アプリケーション・パッケージ内に含めることができます。
- プロジェクトのルートを右クリックして、[ストア] > [アプリ パッケージの作成…] を選択し、Windows* ストア・アプリケーション・ パッケージを作成します。
最後に、Windows* アプリ認定キットを起動して、アプリケーションの検証テストが成功することを確認します。ここで注目するのは [サポートされる API のテスト] であり、アプリケーションの呼び出しが Windows* ストア API に違反していないかチェックされます。
アプリケーションが合格すると、ストアへのアップロードの準備は整いました!! これで、皆さんのユニバーサル Windows* プラットフォーム・アプリケーションは、インテル® TBB を使用してインテル® アーキテクチャー・ベースの Windows* デバイスの多様な並列性を活用できます。
インテル® TBB をソースからビルドする
ユニバーサル Windows* プラットフォーム・バイナリー
UWP 対応のインテル® TBB をソースからビルドするには、次のコンポーネントをインストールする必要があります。
- GNU* Make
- Microsoft* Visual Studio* 2015/2017
- Windows® 10 SDK
環境設定:
- 使用する Visual Studio* の [Developer Command Prompt] を起動します。
- [Developer Command Prompt] からインストールされている Microsoft* Visual Studio* のスクリプト vcvarsall.bat を検索して、vcvarsall.bat <arch> store オプションで起動します。ここで、<arch> はターゲットのアーキテクチャーを指定します。ここでは、UWP ライブラリーにリンクするため環境を設定します。
同じコマンドラインから次のコマンドを実行します。
gmake tbb tbbmalloc target_app=uwp target_mode=store
オプションを見てみましょう。
- target_app=uwp 設定で、インテル® TBB を OneCore.lib にリンクし、ユニバーサル Windows* プラットフォーム・アプリケーション向けの API セットのみを使用します。
- target_mode=store で、tbb.dll がアプリケーション・コンテナー内で実行されるように構成されていることを明確にします (Windows* ストア UWP パッケージの要件)。
ユニバーサル Windows* ドライバーバイナリー
UWD 互換ライブラリーをビルドするため、UWP 対応のインテル® TBB に加え同じソフトウェア・セットの Windows* ドライバーキットをインストールする必要があります。
使用する Visual Studio* の [Developer Command Prompt] を起動します。UWD バイナリー向けには、vcvarsall.bat を store 引数で起動してはいけません。コマンドラインから次のコマンドを実行します。
gmake tbb tbbmalloc target_app=uwd
- ユニバーサル Windows* ドライバーは、UWP アプリケーション環境で実行を制限する必要がないため target_mode オプションは必要ありません。
- target_app=uwd 設定は、インテル® TBB を OneCore.lib へ動的にリンクし、C のランタイム・ライブラリー (CRT) に静的にリンクします。CRT にリンクするには、ユニバーサル Windows* ドライバーが必要です。
ドライバーが、Windows* ドライバーキットともに提供される ApiValidator (https://docs.microsoft.com/en-us/windows-hardware/drivers/develop/validating-universal-drivers) アプリケーションとユニバーサル・デバイス・ドライバー・キット (DDI) のみを使用することを確認する必要があることに注意してください。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。