Я только что начал изучать, как использовать 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;
}
}
Переменная V вычисляется с использованием значения V предыдущей итерации
for(t = 0; t<T; t++) {
...
v += ... ( tv - v ) ....
...
}
, вы не можете это сделать, он нарушает параллелизм. Цикл должен быть в состоянии работать в любой последовательности или с одновременно с различиями параллельных чанков, без побочных эффектов. С первого взгляда он не похож на то, что вы можете распараллелизировать этот вид петли.
Я не слишком уверен, это было долгое время, так как я использовал OpenMP, но у вас есть переменная петли T, установленная как частная. Это то, что вы хотите? Разве это не переменная параллелизации?
Одной из возможностей в том, что вы используете переменную «SUM_V». Поскольку вы выполняете сокращение, время выполнения, вероятно, ожидает, только накапливать значения там, и получить доступ к нему «нормально» только после того, как цикл выполняется.