私はコンピュータビジョンライブラリを開発している会社で働いています。それは、より複雑なアルゴリズムを用いた多くの行列演算を部分的に含む。すべてを高速化するために、我々は行列演算で実行しなければならない膨大な量の二重ループを並列化するために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
です。しかし、プラグマ自体でそれを制御する方法はありますか?
外側ループでのみ '#pragma 'を使うためにアプリケーションを設計することができるので、内部関数から削除する必要があります。 – Jepessen