並列ループ・テンプレート parallel_for および parallel_reduce には、パーティショナー (ループを実行する手法) を指定するオプションの引数があります。次の表は、パーティショナーの説明および blocked_range とともに使用した場合の効果をまとめたものです。
パーティショナー |
説明 |
blocked_range(i,j,g) とともに使用した場合 |
---|---|---|
simple_partitioner |
チャンクサイズを粒度によって制限します。 |
g/2 ≤ chunksize ≤ g |
auto_partitioner (デフォルト)[4] |
チャンクサイズを自動的に設定します。 |
g/2 ≤ chunksize |
affinity_partitioner |
チャンクサイズ、キャッシュ・アフィニティーおよび反復の均等分散を自動的に設定します。 |
|
static_partitioner |
チャンクサイズ、キャッシュ・アフィニティーおよび反復の均等分散をロード・バランシングなしで設定します。 |
max(g/3, problem_size/num_of_resources) ≤ chunksize |
パーティショナーが指定されない場合、auto_partitioner が使用されます。通常は、auto_partitioner または affinity_partitioner を使用してください。これらのパーティショナーは、利用可能な実行リソースに基づいてチャンクの数を調整します。affinity_partitioner および static_partitioner は、指定された比率に分割する Range の機能 (「高度なトピック: 異なる種類の反復空間」を参照) を活用して、計算リソース間で反復をほぼ等しいチャンクサイズに分散します。
次の場合は simple_partitioner が便利です。
operator() のサブ範囲のサイズが制限を超えない。例えば、operator() で範囲のサイズに比例した一時配列が必要な場合は、このパーティショナーを使用すると良いでしょう。サブ範囲のサイズが制限されている場合、ダイナミック・メモリー割り当てを使用する代わりに、配列に自動変数を使用できます。
サブ範囲が大きいため、キャッシュが効率良く使用されない。例えば、サブ範囲の処理で同じメモリーの場所が繰り返し解放されていると仮定します。サブ範囲を制限以下に保つことで、繰り返し参照されているメモリーの場所をキャッシュに格納できる可能性があります。このシナリオのサンプルは、examples/parallel_reduce/primes/primes.cpp で parallel_reduce の使用方法を参照してください。
特定のコンピューター向けのチューニングを行う。
[4] インテル® スレッディング・ビルディング・ブロック (インテル® TBB) 2.2 より前のバージョンでは、デフォルトが simple_partitioner でした。以前のデフォルトの動作にするには、TBB_DEPRECATED=1 を指定してコンパイルします。