2012-03-07 2 views
0

私は実行するのに約16msかかるループを持っており、別のループの下で条件付きで500回実行されます。内部ループのみを並列化する

シリアルコードの形式は、このようなものです:

//Outer for loop 
for(i=0;i<500;i++){ 
//read some entity 
//some conditions 

// some function calls 
    // some nested function calls 
     // inner for loop 
      for (j=0;some condition;j++){ 
      // work on the entity read in outer for loop 

      } 

} 

私はforループの内側を並列化したいです。 OpenMPを使用してinner forループを実行するのに必要な時間を40%短縮し、シリアルコードを実行するのに必要な時間を短縮することは可能ですか?

コードを実行するために全体的な時間短縮が必要です。私のケースでは、inner forループの で作業するために一度に1つのエンティティだけを読み込むようにコードが記述されているため、outer forループを並列化することはできません。

助けてください。

ありがとうございます!

+0

16ミリ秒は、並列化するための多くの作業のようではありません。 – Mysticial

+0

ええ、絶対に正しい。しかし、内部のforループは何度も実行されます。プログラムの実行に要する全体的な時間を短縮したい。 – user1252852

+0

私はH.264コーデックでイントラ予測とインター予測を並列化しようとしています。それに関する提案はありますか? – user1252852

答えて

0

OpenMPはこのような小さなタスクをパラレル化できます。私は30fpsのビデオで5x5のカーネルフィルタを実行するためにこれを一度行った。

最高の細かさが何であるかをテストする必要があります。タスクを2つに分割すると、オーバーヘッドは最小限に抑えられますが、パラレル化は制限されます。細かさが高すぎるとループovrheadが大きくなり、異なるコアから隣接するメモリ位置に書き込むことができ、キャッシュのパフォーマンスが低下します。

上記の例では、画像をスキャンラインで分割しました。各画像は順次計算されました。これはうまくいった。

+0

素晴らしい!ありがとう。あなたはリルのビットを詳しく教えていただけますか? inner forループの代わりに#pragma ompセクションを使用し、内部データを複数コピーするだけで、出力を達成する方法はありますか?そしてこの内側forループはnoを実行します。 outer forループによって定義された回数。 – user1252852

+0

これを実際に行うには、openmpとalgoの両方の知識が必要です。 #pragmasを散らすだけでそれはできません。私がビデオ予測を知っているので、データをコピーする必要はなく、すべてのスレッドが入力を共有できます。 –

+0

あなたは、データの重複コピーは必要ではなく、まだいくつかの変更を加えてコードを並列化できると言っていますか? – user1252852

関連する問題