2012-03-01 4 views
1

バリアを正しく実装したいのですが、今、amStaticThreadedは呼び出されるたびに新しいスレッドを大量に開始します。私のメインルーチンでは、amStaticThreadedの後のすべてが1つのスレッドでしか実行できませんが、その部分は非常に高速です。OpenMPバリアの使い方

void amStaticThreaded(int nshocks, int nstates, 
         MatrixXd& valmat, MatrixXd& EV_prev, MatrixXd& fullmat) { 

    #pragma omp parallel for 
    for(int i = 0; i < nshocks; i++) { 

    // this does the add part  
    RowVectorXd vrow(nstates); 
    vrow = EV_prev.row(i); 

    fullmat.middleRows(i*nstates, nstates).rowwise() += vrow; 
    valmat.row(i) = fullmat.middleRows(i*nstates, nstates).rowwise().maxCoeff().transpose(); 

    } 

} 

int main() { 

    // ... 

    // ITERATION ON CONTINUATION VALUE 
    cout << "entering loop" << endl; 
    while ((err > TOL) && (itercount < MAXIT)) { 

    // GET NEW EXPECTED VALUE FUNCTION 
    EV_prev = (T_BIG * V_prev); 
    EV_prev.array() *= beta; 

    fullmat = staticmat; 
    amStaticThreaded(Nshocks, nstates, V_new, EV_prev, fullmat); 

    // THERE SHOULD BE A BARRIER HERE 

    // FIGURE OUT THE ERROR BOUNDS 
    mmdiff = (V_new.array() - V_prev.array()); 
    lbound = beta * double(mmdiff.minCoeff()); 
    ubound = beta * double(mmdiff.maxCoeff()); 

    // POSSIBLY ADJUST THE VALUE FUNCTION 
    relres = ubound - lbound; 
    if(relres < TOL) { 
     V_new.array() += (ubound + lbound)/2.0; 
    } 
    err = relres; 

    // UPDATE ITER COUNT AND VALUE FUNCTION 
    cout << "i: " << itercount << ": " << err << endl; 
    itercount++; 
    V_prev = V_new; 
    } // end while 
    cout << "DONE with iteration!" << endl; 
} 

答えて

2

あなたのコードをそのまま正しいです:amStaticThreadedスレッドの新しいセットに私は私のコードでは、次のセットアップを持っているたびに

を開始していることがより良い方法はあります。パラレルセクションの最後には暗黙のバリアがあります。マスタスレッドのみがパラレルセクションの外側の命令を実行します。

並列スレッドを開始するたびに多くのスレッドが開始されるため、これはOpenMP実装が処理するものです。ほとんどの実装では、スレッドの作成と削除ではなく、必要に応じてスレッドのプールを保持して使用します。

+0

大丈夫ですので、amStaticThreadedを呼び出す際のオーバーヘッドはありませんか?それは本当に知って良いです。ありがとう。 – stevejb

関連する問題