私はここにいくつかのものを置いて、孤児化を機能させようとしています#pragma omp parallel
. 私がしようとしているのは次のようなものです:
#pragma omp parallel default(none) shared(mat,mat2,f,max_iter,tol,N,conv) private(diff,k)
{
#pragma omp master // I'm not against using #pragma omp single or whatever will work
{
while(diff>tol) {
do_work(mat,mat2,f,N);
swap(mat,mat2);
if( !(k%100) ) // Only test stop criteria every 100 iteration
diff = conv[k] = do_more_work(mat,mat2);
k++;
} // end while
} // end master
} // end parallel
は前のdo_work
反復に依存するため、while ループは順次実行する必要があります。しかし、「do_work」を並行して実行できるようにしたいので、次のようになります。
void do_work(double *mat, double *mat2, double *f, int N)
{
int i,j;
double scale = 1/4.0;
#pragma omp for schedule(runtime) // Just so I can test different settings without having to recompile
for(i=0;i<N;i++)
for(j=0;j<N;j++)
mat[i*N+j] = scale*(mat2[(i+1)*N+j]+mat2[(i-1)*N+j] + ... + f[i*N+j]);
}
これが何らかの方法で達成できることを願っていますが、方法がわかりません。ですから、私が得ることができるどんな助けも大歓迎です (また、これが不可能だと言っている場合も)。ところで、私は open mp 3.0、gcc コンパイラ、sun studio コンパイラを使用しています。