2017-12-21 26 views
3

私は、ループの各反復をOpenMPセクションにすることで、OpenMPの範囲ベースのforループを並列化しようとしています。私はこれをしたい:なぜOpenMPにforループのセクションがないのですか?

#pragma omp parallel sections 
{ 

for (auto x : range) { 
    #pragma omp section 
    // LOTS OF CODE HERE 
} 

} 

しかし、これは動作しません - コンパイラは、セクションは、セクションでは、構築の#pragma ompの範囲内でなければならないと文句を言い。私は何か間違っているか、このセクションがforループ内にあることを理解するのに十分なほどスマートではありませんか?

+1

Wjyセクションではなくテイクで試してみませんか?それはより自然なコード、イホでしょう。 – Harald

+1

タスクを意味しますか? – xcski

+1

おっと!はい!私はタスクを意味しました:) – Harald

答えて

2

OpenMPセクションは、並行して実行できるコードとは関係のないビットです。アイデアはあなたのアルゴリズムの中にスーパー組織化されていないが、任意の順序で並行して実行できる異なる部分があるということです。これは並列化の非常に臨時の方法です。コードではそれほど目に見えないと思われます。

sectionsブロック内のすべてのブロックがsectionブロック内に囲まれている必要があります(ただし、これは最初のsectionブロックに暗黙的に囲まれているので省略可能です)。ここで、暗黙のうちに暗黙的に#pragma omp sectionを追加する場所がある場合は、forのループの直前に、コードがどれほど意味があるのか​​がわかります。

ここでは、 forループを持っていれば、これはあなたのコードをきちんと構造化して、omp parallel forディレクティブを使用できるようにする必要があります。ループ境界を明示的に改善するなど、少しだけあなたのforを書き直す必要があります。

+0

私は明示的にこれは、私はループベースの範囲を使用する必要があるため、これを行う。 OpenMPでは、このレンジベースのforループをomp parallelと一緒に使用することはできません。だから私はセクションを使用しています。私は代わりに仕事を使うことができました。 – xcski

関連する問題