パーティショナーのまとめ#
並列ループ・テンプレート parallel_for および parallel_reduce は、ループを実行する戦略を指定するオプションのパーティショナー引数を受け取ります。次の表は、パーティショナーを blocked_range と組み合わせて使用した効果をまとめたものです。
パーティショナー |
説明 |
|
|---|---|---|
|
粒度によって制限されるチャンクサイズ。 |
|
|
自動チャンクサイズ。 |
|
|
自動チャンクサイズ、キャッシュ・アフィニティー、反復の均一な分散。 |
|
|
決定論的なチャンクサイズ、キャッシュ・アフィニティー、および負荷分散なしの反復の均一な分散。 |
|
パーティショナーが指定されていない場合、auto_partitioner が使用されます。一般的には、利用可能な実行リソースに基づいてチャンク数が調整されるため、auto_partitioner または affinity_partitioner を使用する必要があります。affinity_partitioner と static_partitioner は、指定された比率で分割する Range 機能 (「高度なトピック: その他の種類の反復空間」を参照) を利用して、計算リソース間で反復をほぼ均等に分散できます。
simple_partitioner は次のような状況で役立ちます。
operator()のサブレンジ・サイズは制限を超えてはなりません。例えば、operator()がレンジのサイズに比例した一時配列を必要とする場合、これは有利になる可能性があります。サブレンジのサイズが制限されている場合、動的メモリー割り当ての代わりに、配列に自動変数を使用できます。サブレンジが大きいと、キャッシュに収まらず、非効率的になる可能性があります。例えば、サブレンジの処理に、同じメモリー位置の繰り返しスイープが含まれるとします。サブレンジを制限以下に保つことで、繰り返し参照されるメモリー位置をキャッシュに収めることができます。
特定のマシンに合わせて調整したい。