这是我的Fortran代码的一部分。
public class MyValidator extends AbstractValidator {
@Override
public ValidationResult validate(ValidationEvent event, ValidationState state, IProgressMonitor monitor) {
// Validation logic
}
}
我可以在没有任何警告的情况下运行代码。但是,结果很奇怪,并且与不使用OpenMP的结果不同。代码有什么问题?谢谢。
答案 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
几乎始终为真,否则这将降低并行化的效率。