2012-03-01 110 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