在以下程序中我得到不同的结果(串口vs OpenMP),原因是什么?目前我只能认为这个循环对于线程来说可能太“大”,也许我应该以其他方式编写它但我不确定,是否有任何提示?
编译:{{1}}
g++-4.2 -fopenmp main.c functions.c -o main_elec_gcc.exe
答案 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子句使这些变量变为私有。