パーティショナーのまとめ

パーティショナーのまとめ#

並列ループ・テンプレート parallel_for および parallel_reduce は、ループを実行する戦略を指定するオプションのパーティショナー引数を受け取ります。次の表は、パーティショナーを blocked_range と組み合わせて使用した効果をまとめたものです。

パーティショナー

説明

blocked_range(i,j,g) と使用する場合

simple_partitioner

粒度によって制限されるチャンクサイズ。

g/2 chunksize g

auto_partitioner (デフォルト)

自動チャンクサイズ。

g/2 chunksize

affinity_partitioner

自動チャンクサイズ、キャッシュ・アフィニティー、反復の均一な分散。

g/2 chunksize

static_partitioner

決定論的なチャンクサイズ、キャッシュ・アフィニティー、および負荷分散なしの反復の均一な分散。

max(g/3, problem_size/num_of_resources) chunksize

パーティショナーが指定されていない場合、auto_partitioner が使用されます。一般的には、利用可能な実行リソースに基づいてチャンク数が調整されるため、auto_partitioner または affinity_partitioner を使用する必要があります。affinity_partitionerstatic_partitioner は、指定された比率で分割する Range 機能 (「高度なトピック: その他の種類の反復空間」を参照) を利用して、計算リソース間で反復をほぼ均等に分散できます。

simple_partitioner は次のような状況で役立ちます。

  • operator() のサブレンジ・サイズは制限を超えてはなりません。例えば、operator() がレンジのサイズに比例した一時配列を必要とする場合、これは有利になる可能性があります。サブレンジのサイズが制限されている場合、動的メモリー割り当ての代わりに、配列に自動変数を使用できます。

  • サブレンジが大きいと、キャッシュに収まらず、非効率的になる可能性があります。例えば、サブレンジの処理に、同じメモリー位置の繰り返しスイープが含まれるとします。サブレンジを制限以下に保つことで、繰り返し参照されるメモリー位置をキャッシュに収めることができます。

  • 特定のマシンに合わせて調整したい。