C++ – Trying to know why the OpenMP code does not parallelise

cMATLABopenmpparallel-processing

I just started learning how to use OpenMP. I am trying to figure out why the following code does not run in parallel with Visual Studio 2008. It compiles and runs fine. However it uses only one core on my quad core machine. This is part of the code that I am trying to port to a MATLAB mex function. Any pointer is appreciated.

#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;
    }
}

Best Answer

The v variable is computed using the v value of the previous iteration

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

You cannot do that, it breaks the parallelism. The loop must be able to be run in any sequence, or with differents parallel chunks at once, with no side effects. From a first glance, it doesnt look like you can parallelize this kind of loop.