2010-01-21 1 views
7

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

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

ответ

4

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

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

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

+0

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

0

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

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^