Parallel STL は、一般に C++17 と呼ばれる C++ 標準の次期バージョンの Working Draft N4659 で指定されている、実行ポリシーをサポートする C++ 標準ライブラリー・アルゴリズムの実装です。この実装は、ISO C++ Working Group Paper P0076R3 で指定されている、順序関係が存在しない実行ポリシーもサポートしています。
Parallel STL は、インテル® プロセッサー向けアルゴリズムの並列実行とベクトル実行の両方を効率的にサポートします。シーケンシャル実行は、C++ 標準ライブラリーの利用可能な実装に依存します。
Parallel STL は、インテル® Parallel Studio XE およびインテル® System Studio の一部として利用できます。
Parallel STL を使用するには、次のソフトウェアをインストールする必要があります。
コマンドラインで Parallel STL を使用するアプリケーションをビルドするには、コンパイルとリンクの環境変数を設定する必要があります。これらの環境変数を設定するには、compilervars.{sh|csh|bat}
のようなスイートレベルの環境スクリプトを呼び出すか、<install_dir>/{linux|mac|windows}/pstl/bin
で pstlvars.{sh|csh|bat}
を実行して Parallel STL の環境変数を設定します。
<install_dir>
はインストール・ディレクトリーです。デフォルトでは次の場所にあります。
Linux* および macOS*:
/opt/intel/compilers_and_libraries_<version>
$HOME/intel/compilers_and_libraries_<version>
Windows*:
<Program Files>\IntelSWTools\compilers_and_libraries_<version>
次の手順に従って、アプリケーションに Parallel STL を追加します。
コンパイラーのインクルード・パスに <install_dir>/pstl/include
フォルダーを追加します。スクリプトを使用する場合は pstlvars
スクリプトを呼び出します。
コードに #include "pstl/execution"
を追加します。次に、使用するアルゴリズムに応じて、次の行のサブセットを追加します。
#include "pstl/algorithm"
#include "pstl/numeric"
#include "pstl/memory"
std
および std::execution
名前空間を指定します。この後の「サンプル」セクションを参照してください。実装されているアルゴリズムでは、呼び出しの最初の引数として値の 1 つ (seq
、unseq
、par
または par_unseq
) をアルゴリズムに渡して、実行ポリシーを指定します。ポリシーには次の意味があります。
実行ポリシー |
意味 |
---|---|
|
シーケンシャル実行。 |
|
SIMD を使用します。提供されているすべての関数が SIMD セーフである必要があります。 |
|
マルチスレッドを使用します。 |
|
|
コードを C++11 (またはそれ以降) としてコンパイルし、ベクトル化のコンパイラー・オプションを使用します。
-qopenmp-simd
または -qopenmp
/Qopenmp-simd
または /Qopenmp
優れたパフォーマンスを得るには、ターゲット・プラットフォームを指定します。インテル® C++ コンパイラーの場合、適切なオプションは次のとおりです。
-xHOST
、-xSSE4.1
、-xCORE-AVX2
、-xMIC-AVX512
/QxHOST
、/QxSSE4.1
、/QxCORE-AVX2
、/QxMIC-AVX512
並列処理を行うにはインテル® TBB ダイナミック・ライブラリーとリンクします。インテル® C++ コンパイラーの場合、次のオプションを使用します。
-tbb
/Qtbb
(オプション、#pragma comment(lib, <libname>)
で処理)PSTL_USE_PARALLEL_POLICIES
マクロは、並列ポリシーの使用を制御します。0 に設定すると、par および par_unseq ポリシーが無効になり、これらのポリシーを使用するとコンパイル・エラーになります。unseq ポリシーのみを使用するベクトル化されたコードで、インテル® TBB ランタイム・ライブラリーへの依存を回避するために推奨します。マクロが定義されていない場合 (デフォルト)、またはマクロが非ゼロ値に評価された場合、すべての実行ポリシーが有効になります。
サンプル 1
このサンプルはベクトル化された copy
を呼び出します。
#include "pstl/execution"
#include "pstl/algorithm"
void foo(float* a, float* b, int n) {
std::copy(std::execution::unseq, a, a+n, b);
}
サンプル 2
このサンプルは fill_n
の並列化バージョンを呼び出します。
#include <vector>
#include "pstl/execution"
#include "pstl/algorithm"
int main()
{
std::vector<int> data(10000000);
std::fill_n(std::execution::par_unseq, data.begin(), data.size(), -1); // Fill the vector with -1
return 0;
}
Parallel STL は、次の表にリストされているアルゴリズムでのみ、前述のすべての実行ポリシーをサポートします。その他の C++ 標準ライブラリー・アルゴリズムにポリシー引数を追加すると、シーケンシャル実行になります。
アルゴリズム |
cppreference.com のアルゴリズム・ページ (英語) |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
http://en.cppreference.com/w/cpp/algorithm/transform_exclusive_scan |
|
http://en.cppreference.com/w/cpp/algorithm/transform_inclusive_scan |
|
|
|
ランダムアクセス・イテレーターが提供される場合、並列実行とベクトル実行は前述のアルゴリズムのサブセットでのみサポートされ、残りの実行はシリアルのままです。
最適化に関する注意事項 |
---|
インテル® コンパイラーでは、インテル® マイクロプロセッサーに限定されない最適化に関して、他社製マイクロプロセッサー用に同等の最適化を行えないことがあります。これには、インテル® ストリーミング SIMD 拡張命令 2、インテル® ストリーミング SIMD 拡張命令 3、インテル® ストリーミング SIMD 拡張命令 3 補足命令などの最適化が該当します。インテルは、他社製マイクロプロセッサーに関して、いかなる最適化の利用、機能、または効果も保証いたしません。本製品のマイクロプロセッサー依存の最適化は、インテル® マイクロプロセッサーでの使用を前提としています。インテル® マイクロアーキテクチャーに限定されない最適化のなかにも、インテル® マイクロプロセッサー用のものがあります。この注意事項で言及した命令セットの詳細については、該当する製品のユーザー・リファレンス・ガイドを参照してください。注意事項の改訂 #20110804 |
Intel、インテル、Intel ロゴは、アメリカ合衆国および / またはその他の国における Intel Corporation の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。
© Intel Corporation.