プログラムに並列処理を実装するには 2 つの方法があります。次のいずれかを選択できます。
インテル® oneAPI スレッディング・ビルディング・ブロック (oneTBB) や OpenMP* などの高レベルな並列フレームワーク。ネイティブコード向けのこれらの並列フレームワークのうち、oneTBB は C++ プログラムをサポートし、OpenMP* は C/C++ および Fortran プログラムをサポートします。Windows* 上での C# のマネージドコードには、Microsoft* タスク並列ライブラリー (TPL) を使用します。
低レベルのスレッド化 API には、Windows* スレッドや POSIX* スレッドなどがあります。この場合、低レベルのインターフェイスを使用して直接スレッドを生成および制御します。この実装は高レベルのフレームワークほど移植性はありません。
高レベルの並列フレームワークを使用する理由は次のとおりです。
簡素性: スレッド化 API によって要求されるすべての詳細な操作をコード化する必要はありません。例えば、OpenMP* #pragma omp parallel for (または Fortran の!$OMP parallel do) と oneTBB の parallel_for() は、ループを容易に並列化するための設計されています。フレームワークを使用してタスクとワークを判断します。また、それぞれのスレッドの動作を決定する必要があります。
スケーラビリティー: フレームワークは、利用可能なコアを使用するのに最適なスレッド数を選択して、効率良くタスクをスレッドに割り当てます。これにより、システム上で利用可能なすべてのコアを使用できます。
ループのスケーラビリティー: oneTBB と OpenMP* は、ループ反復の連続したチャンクを既存のスレッドに割り当て、 複数の反復間のスレッド化のオーバーヘッドを償却します (oneTBB のグレインサイズ (grain size) を参照してください)。
自動ロードバランス: oneTBB と OpenMP* は、コア間でワークを分割するため適切な粒度を自動調整する機能を備えています。さらに、ループ反復や並列タスク数が均一ではないワークを実行する場合、oneBB のスケジューラーは、コアがアイドルにならないように動的にワークを再スケジュールします。
並列処理の実装には、慣れ親しんだ任意の並列フレームワークを使用できます。
それぞれのプログラミング言語で使用可能な高レベルの並列フレームワークは、次のとおりです。
言語 |
利用可能な高レベルの並列フレームワーク |
|---|---|
C |
OpenMP* |
C++ |
インテル® oneAPI スレッディング・ビルディング・ブロック (oneTBB) OpenMP* |
C# |
Microsoft*タスク並列ライブラリー (Windows* のみ) |
Fortran |
OpenMP* |