2017-03-07 12 views
0

私はコンピュータビジョンライブラリを開発している会社で働いています。それは、より複雑なアルゴリズムを用いた多くの行列演算を部分的に含む。すべてを高速化するために、我々は行列演算で実行しなければならない膨大な量の二重ループを並列化するためにOpenMPを使い始めました。プラグマ内でOpenMPプラグマを処理する方法

他のプラグマの中でOpenMPプラグマを使用するのに最適なパフォーマンスは得られません。しかし、私たちの複雑なアルゴリズムはできるだけ遅くても、基本的な操作はもっと速くなります。

// in resize.c 
image resize_bilinear(const image& img, int rows, int cols) { 
image out(rows, cols); 
#pragma omp parallel for 
for (int i = 0; i < rows; ++i) { 
    for (int j = 0; j < cols; ++j) { 
    // bilinear interpolation to get out(i,j) 
    } 
} 
return out; 
} 

そして、私たちはどこかに持っているかもしれません:この問題が発生したものになる可能性がある例を与えることを

// in more_complex.c 
std::vector<image> resize_all(const std::vector<image> imgs, int rows, int cols) { 
std::vector<image> out(imgs.size()); 
#pragma omp parallel for 
for (int i = 0; i < imgs.size(); ++i) { 
    out[i] = resize_bilinear(imgs[i], rows, cols); 
} 
} 

は、彼がするすべての下のプラグマを無効上位プラグマを作ることは可能です出会う? OpenMPを使ってすべてのライブラリを並列化すると、私たちは運命づけられますか?

環境変数はOMP_MAX_ACTIVE_LEVELSです。しかし、プラグマ自体でそれを制御する方法はありますか?

+0

外側ループでのみ '#pragma 'を使うためにアプリケーションを設計することができるので、内部関数から削除する必要があります。 – Jepessen

答えて

1

ネストされた並列性を有効または無効にできるomp_set_nestedを試すことができます。

+0

ええ、私はそれを見た!これは私が思っているものです。私の知る限りでは、地域によっては設定できる特別なケースがあるかどうかは分かりますか?いくつかのプラグマのように、ネストされた並列処理は許可されていませんが、それ以外の場合は問題ありません。 – baptiste

+0

私はそれを試したことはありませんが、それを関数と見なして、この関数を使用して、必要に応じて入れ子になった並列処理を有効/無効にすることができます。ネストされたループの前に1に設定し、別のネストされたループの前に0に設定することができます。 – Jepessen

+0

あなたがしていることを本当に*知っていなければ、入れ子にされた並列性を避けることを強くお勧めします。マシンを過度に購読するのは簡単です(N個の論理CPU上にN ** 2スレッドを持つ)ので、パフォーマンスが非常に悪くなります。また、パラレルプラグマのomp_in_parallel()と "if"節を見てください。必要なところで並列処理を導入することができます。また、 "omp parallel for"は単に "omp parallel"続いて "omp for"と表示されるので、並列領域を大きくすることができます。 –

関連する問題