parallel_for

[algorithms.parallel_for]

値の範囲で並列反復を行う関数テンプレート。


// <oneapi/tbb/parallel_for.h> ヘッダーで定義 

namespace oneapi { 
    namespace tbb { 

        template<typename Index, typename Func> 
        void parallel_for(Index first, Index last, const Func& f, /* see-below */ partitioner, task_group_context& context); 
        template<typename Index, typename Func> 
        void parallel_for(Index first, Index last, const Func& f, task_group_context& context); 
        template<typename Index, typename Func> 
        void parallel_for(Index first, Index last, const Func& f, /* see-below */ partitioner); 
        template<typename Index, typename Func> 
        void parallel_for(Index first, Index last, const Func& f); 

        template<typename Index, typename Func> 
        void parallel_for(Index first, Index last, Index step, const Func& f, /* see-below */ partitioner, task_group_context& context); 
        template<typename Index, typename Func> 
        void parallel_for(Index first, Index last, Index step, const Func& f, task_group_context& context); 
        template<typename Index, typename Func> 
        void parallel_for(Index first, Index last, Index step, const Func& f, /* see-below */ partitioner); 
        template<typename Index, typename Func> 
        void parallel_for(Index first, Index last, Index step, const Func& f); 

        template<typename Range, typename Body> 
        void parallel_for(const Range& range, const Body& body, /* see-below */ partitioner, task_group_context& context); 
        template<typename Range, typename Body> 
        void parallel_for(const Range& range, const Body& body, task_group_context& context); 
        template<typename Range, typename Body> 
        void parallel_for(const Range& range, const Body& body, /* see-below */ partitioner); 
        template<typename Range, typename Body> 
        void parallel_for(const Range& range, const Body& body); 
    } // namespace tbb 
} // namespace oneapi

partitioner タイプは、次のいずれかのエンティティーになります:

  • const auto_partitioner&

  • const simple_partitioner&

  • const static_partitioner&

  • affinity_partitioner&

要件:

  • Range タイプは、Range 要件を満たしている必要があります。

  • Body タイプは、ParallelForBody 要件を満たしている必要があります。

  • Index タイプは、ParallelForIndex 要件を満たしている必要があります。

  • Func タイプは、ParallelForFunc 要件を満たしている必要があります。

oneapi::tbb::parallel_for(first, last, step, f) オーバーロードは、ループを並列実行します。

for (auto i = first; i < last; i += step) 
    f(i);

ループはラップアラウンドしてはなりません。step 値は正数でなければなりません。省略された場合は、暗黙的に 1 になります。反復が並列に実行される保証はありません。小さい反復がより大きな反復を待機する場合、デッドロックが発生する可能性があります。パラメーターが指定されていない場合、パーティショニングの方法は auto_partitioner になります。

parallel_for(range,body,partitioner) は、並列反復の一般的な形式をオーバーロードします。range の各値に対する body の並列実行を表します。オプション partitioner パラメーターは、パーティショニングの方針を指定します。

parallel_for は、is_divisible() が各サブ範囲で false になるポイントまで、範囲をサブ範囲に再帰的に分割して、これらの各サブ範囲に対してボディーのコピーを作成します。各ボディー/サブ範囲のペアに対して、Body::operator() を呼び出します。

範囲とボディーのコピーの一部は、parallel_for のリターンの後に破棄されます。この破棄の遅延は、通常の使用法では問題になりませんが、実行トレースを確認したり、複雑な副作用がある範囲またはボディーオブジェクトを記述する場合は注意する必要があります。

parallel_for は、非決定論的な順番で反復を実行することがあります。正当性のため特定の実行順序に依存しないでください。ただし、効率を考えると、parallel_for は値が連続する順に実行することを想定すべきです。

シリアル実行では、parallel_for は次の観点で左から右へ反復を実行します。

すべてのオーバーロードは task_group_context オブジェクトを受け入れることが可能であるため、アルゴリズムのタスクはこのコンテキストで実行されます。デフォルトでは、アルゴリズムは自身がバインドされているコンテキストで実行されます。

複雑性

範囲とボディーが O(1) 空間を使用して範囲をほぼ等しい断片に分割する場合、空間計算量は O(P log(N)) です。ここで、N は範囲のサイズ、P はスレッド数です。

参照: