我刚开始学习如何使用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;
}
}
答案 0 :(得分:4)
使用前一次迭代的v值计算v变量
for(t = 0; t<T; t++) {
...
v += ... ( tv - v ) ....
...
}
你不能这样做,它打破了并行性。循环必须能够以任何顺序运行,或者同时使用不同的并行块运行,没有副作用。 乍一看,它看起来不像你可以并行化这种循环。
答案 1 :(得分:0)
我不太确定,自从我使用OpenMP以来已经很长时间了,但是你将循环变量设置为私有。那是你要的吗?这不是并行化变量吗?
答案 2 :(得分:0)
一种可能性是您正在使用“sum_v”变量。由于您正在执行缩减,因此运行时可能希望仅在那里累积值,并且仅在循环完成后才“正常”访问它。