Попытка узнать, почему код OpenMP не распараллеливается - PullRequest
7 голосов
/ 22 января 2010

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

#pragma omp parallel for default(shared) private(dz, t, v, ts_count) reduction(+: sum_v)
for(t = 0; t<T; t++)
{
    dz = aRNG->randn();
    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;
    }
}

Ответы [ 3 ]

4 голосов
/ 22 января 2010

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

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

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

0 голосов
/ 22 января 2010

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

0 голосов
/ 22 января 2010

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

...