2012-03-01 111 views
1

我想確保我正確實施障礙。現在,amStaticThreaded每次調用時都會啓動大量新線程。在我的主程序中,amStaticThreaded之後的所有內容都只能由一個線程完成,但這部分速度非常快。有沒有更好的辦法,而不是有amStaticThreaded開始新的一組線程每次如何使用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

你的代碼是正確的,因爲它是。平行部分末尾有一個隱含的屏障;只有主線程在並行部分之外執行指令。

至於每次輸入並行時啓動多個線程,這是OpenMP實現將要處理的事情。大多數實現會保留一個線程池並在需要時使用它們,而不是始終創建和刪除線程。

+0

哦好吧,所以調用amStaticThreaded時不會涉及大量的開銷?這真的很好知道。謝謝。 – stevejb 2012-03-01 19:37:17