auto_partitioner
[algorithms.auto_partitioner]
並列ループがワークスチール・イベントに基づいて範囲の細分化を最適化するように指定します。
auto_partitioner
を含むループ・テンプレートは、ワークスチールのための十分な可能性を提供しながら範囲分割を最小限に抑えようとします。
範囲分割は、最初は S サブ範囲に限定されます。ここで、S は global_contol または task_arena によって指定されたスレッド数に比例します。各サブ範囲は、アイドルスレッドによってスチールされない限りそれ以上分割されることはありません。スチールされた場合、追加のサブ範囲を作成するために再分割されます。そのため、auto_partitioner
を持つループ・テンプレートは、負荷のバランスをとる必要がある場合のみ、追加のサブ範囲を作成します。
auto_partitioner
は負荷分散に十分な分割を行いますが、Range::is_divisible
で許可されているほど細かく分割する必要はありません。blocked_range
のようなクラスとともに使用された場合、適切な粒度の選択はあまり重要ではなく、通常デフォルトの粒度 1 で許容可能なパフォーマンスを達成できます。
auto_partitioner
クラスは、ISO C++ [utility.arg.requirements] の CopyConstructibe 要件を満たしています。
ヒント
並列ループで auto_partitioner
と blocked_range
を使用すると、ボディーは blocked_range
よりも大きな粒度のサブ範囲を受け取ることがあります。そのため、粒度がサブ範囲サイズの上限であると想定してはなりません。上限を必要とする場合は simple_partitioner
を使用してください。
// <oneapi/tbb/partitioner.h> ヘッダーで定義
namespace oneapi {
namespace tbb {
class auto_partitioner {
public:
auto_partitioner() = default;
~auto_partitioner() = default;
};
} // namespace tbb
} // namespace oneapi