使用Fortran还原OpenMP时的可变位置

时间:2018-07-10 20:07:55

标签: fortran openmp

这是我的Fortran代码的一部分。

public class MyValidator extends AbstractValidator {
    @Override
    public ValidationResult validate(ValidationEvent event, ValidationState state, IProgressMonitor monitor) {
        // Validation logic
    }
}

我可以在没有任何警告的情况下运行代码。但是,结果很奇怪,并且与不使用OpenMP的结果不同。代码有什么问题?谢谢。

1 个答案:

答案 0 :(得分:4)

使用OMP DO REDUCTION(+:iabc)时,每个线程都会创建自己的私有变量iabc并在循环中使用该私有变量,只有在处理了并行区域之后,才会进行加法运算。

即访问权限

        H%ka(iabcd) = ia
        H%kb(iabcd) = ib
        H%kc(iabcd) = ic
        H%kd(iabcd) = id
        H%ME2BM(iabcd) = 0.d0

仅使用iabc的本地私有版本,这与代码的串行版本中的行为不同。

您可以做的是使用OMP CRITICAL来更新iabc,因为您希望所有线程都使用相同版本的iabc(当然,还可以使{ {1}}分享了)。然后,您还必须在关键区域内创建iabc的私有副本,以便使用正确的iabc来进行H的更新。但是,除非iabc几乎始终为真,否则这将降低并行化的效率。