Попытка знать, почему код OpenMP не параллелизирует

Я только что начал изучать, как использовать OpenMP. Я пытаюсь выяснить, почему следующий код не выполняет параллельно с Visual Studio 2008. Это компилирует и хорошо работает. Однако это использует только одно ядро на моей четырехъядерной машине. Это - часть кода, что я пытаюсь портировать на MATLAB mex функцию. Любой указатель ценится.

#pragma omp parallel for default(shared) private(dz, t, v, ts_count) reduction(+: sum_v)
for(t = 0; trandn();
    v += mrdt* (tv - v) +
         vv_v_sqrt_dt * dz +
         vv_vv_v_dt*(dz*dz - 1.);

    sum_v += v;
    if(t == ts_count-1)
    {
        int_v->at_w(k++) = sum_v/(double)(t+1);
        ts_count += ts;
    }
}

7
задан Peter Mortensen 27 January 2010 в 19:18
поделиться

3 ответа

Переменная V вычисляется с использованием значения V предыдущей итерации

  for(t = 0; t<T; t++) {
     ...
     v += ... ( tv - v ) ....
     ...
  }

, вы не можете это сделать, он нарушает параллелизм. Цикл должен быть в состоянии работать в любой последовательности или с одновременно с различиями параллельных чанков, без побочных эффектов. С первого взгляда он не похож на то, что вы можете распараллелизировать этот вид петли.

4
ответ дан 7 December 2019 в 14:33
поделиться

Я не слишком уверен, это было долгое время, так как я использовал OpenMP, но у вас есть переменная петли T, установленная как частная. Это то, что вы хотите? Разве это не переменная параллелизации?

0
ответ дан 7 December 2019 в 14:33
поделиться

Одной из возможностей в том, что вы используете переменную «SUM_V». Поскольку вы выполняете сокращение, время выполнения, вероятно, ожидает, только накапливать значения там, и получить доступ к нему «нормально» только после того, как цикл выполняется.

0
ответ дан 7 December 2019 в 14:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: