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