を阻害する:OpenMPのparalelization私はOpenMPのに新しいですし、私は、OpenMPを使用して、次のコードをparalelizeしようとしていますベクトル
#pragma omp parallel for
for(int k=0;k<m;k++)
{
for(int j=n-1;j>=0;j--)
{
outX[k+j*m] = inB2[j+n * k]/inA2[j*n + j];
for(int i=0;i<j;i++)
{
inB2[k*n+i] -= inA2[i+n * j] * outX[k + m*j];
}
}
}
Paralelize外側のサイクルは非常に単純明快ですが、それを最適化するために、私はparalelizeしたかったです最も内側のサイクル(iを反復するサイクル)も同様です。私はこのようなことをしようとするとき、しかし:
#pragma omp parallel for
for(int i=0;i<j;i++)
{
inB2[k*n+i] -= inA2[i+n * j] * outX[k + m*j];
}
をコンパイラは、それが遅くなる可能インナーサイクル(「ための可能なエイリアシングのベクトル化のためのバージョン管理ループ」)、ベクトル化されません。私はそれを使用してコンパイルしましたgcc -ffast-math -std=c++11 -fopenmp -O3 -msse2 -funroll-loops -g -fopt-info-vec prog.cpp
ありがとうございました!
EDIT:配列に__restrictキーワードを使用しています。
EDIT2興味深いのは、プラグマのみを内側のサイクルに置き、外側から削除すると、gccがそれをベクトル化するということです。ですから、私は両方のサイクルをパラレル化しようとすると、問題が発生します。
EDIT3:#pragma omp parallelをsimdに使用すると、コンパイラはループをベクトル化します。しかし、内部ループを並列化しないよりもまだ遅いです。
手動でベクトル化する方が、並列化する方が簡単です。なぜそれをしないのですか? (そして自動並列化を維持する) –