OpenMP嵌套循环中的奇怪行为

时间:2011-01-25 16:53:29

标签: nested openmp

在以下程序中我得到不同的结果(串口vs OpenMP),原因是什么?目前我只能认为这个循环对于线程来说可能太“大”,也许我应该以其他方式编写它但我不确定,是否有任何提示?

编译:{{1​​}}

g++-4.2 -fopenmp main.c functions.c -o main_elec_gcc.exe

2 个答案:

答案 0 :(得分:0)

我认为您应该使用reduction代替共享变量并删除#pragma omp atomic,例如:

#pragma omp parallel for reduction(+:S2)

它应该更快,因为不需要原子操作,这在性能和线程同步方面非常痛苦。

<强>更新

由于操作顺序,您也可能在结果上有所不同:

\sum_1^100(x[i]) != \sum_1^50(x[i]) + \sum_51^100(x[i])

答案 1 :(得分:0)

您在并行区域中使用的大多数临时变量上都有数据竞争 - difx,dify,difz,mod2x,mod2y,mod2z,temp_sqrt和temp_div都应该是私有的。您应该通过在parallel for指令上使用private子句使这些变量变为私有。