2017-02-08 11 views
2

ネストされたforループを使用してシーケンシャルプログラムを設計し、それをOpenMPと並列に変換し、デバッグするために作業していると仮定すると...一番外側のループで最初に作業し、あなたのやり方で作業するか、最も内側のループから開始しますか?私は折りたたみ機能を認識していますが、すべてのネストされたループが折り畳まれるわけではありません。OpenMPのネストループ設計方針

+1

これはかなり広い質問です。推薦には多くの要因があります。一般的なネストされたループのいくつかの詳細を、最も好ましくは実際のコードの形で提供することによって、それを絞り込むことができます。 – Zulan

+0

ところで、私はできるだけ外側に、必要に応じて内側と言います。しかし、私はそれを有用な答えとは考えていません。 – Zulan

+0

'collapse'節で折りたたむことができないいくつかのネストされたループは手で折りたたむことができます。三角形ループ。とにかくループを手で倒す方法を学ぶと便利です。 –

答えて

0

が最も内側のループにあります。これは、開始スレッドは一般的に高価であるためです。

一方、最も内側のループでスレッドを開始するよりも実行するリソースが多い場合は、それほど大きな違いはありません。それ以外の場合は、最も外側のループが常に最良の選択です。

もちろん、これは非常に幅広い質問で非常に幅広い答えです。異なる特殊ケースごとに異なる答えが常にあります。

一方、このような複雑な問題がある場合は、低レベルのstd::threadを使用し、スレッドを手動で制御することをお勧めします。それはより多くの作業を必要としますが、より多くの制御と最良の結果が得られます。次に、スレッドプールを使用し、最も効率的なソリューションを使用できます。

+0

これは非常に思慮深く、詳細な答えです(はい、広い質問です.2次元行列の周りを横切る/解析することを念頭に置いていましたが、故意にこのビットを残しました。私がそれを掲示すれば必然的に得たはずの、私の特定の問題に対する答えではなく、一般的な力学と問題解決の方法が不思議です)。ありがとうございました。 – theupandup

+0

行列は1次元ベクトルとして格納する必要があります。それはそれを行う最も効率的な方法です。 OpenBLAS(またはArmadilloなどのラッパー)などの高性能ライブラリの使用方法を学ぶことを検討してください。あなたは車輪を再発明するべきではありません。マトリックス演算は巨大なフィールドです。 –

+0

私は現在、クラスに入っていますが、通常、特定のプロジェクトでは特定のライブラリのみを使用することになっています。 2Dベクトルは、この課題(と私たちが使用するように指示されたもの)には問題ありません – theupandup

関連する問題