Fortran代码中OpenMP循环内使用associate语句出现异常的解决咨询
Fortran代码中OpenMP循环内使用associate语句出现异常的解决咨询
我最近在写Fortran代码时遇到了一个棘手的问题:在OpenMP并行循环里使用associate语句时,结果不符合预期,想请教各位大佬怎么解决。
先给大家看我的最小可复现示例(MWE):
program main implicit none integer i,ints(5) ints(:)=0 call omp_set_num_threads(5) !$omp parallel do default(shared) private(ints,i) do i=1,5 associate(ii=>ints(i)) write(*,*) ii end associate end do !$omp end parallel do end
我原本预期这段代码会输出五个0,但用ifort 2021.7.1版本编译运行后,却打印出了随机数。我猜测这是OpenMP和associate之间的冲突导致的,于是尝试了两种修改方案,可惜都没能解决问题:
第一种是给associate外层套了block结构:
program main implicit none integer i,ints(5) ints(:)=0 call omp_set_num_threads(5) !$omp parallel do default(shared) private(ints,i) do i=1,5 block associate(ii=>ints(i)) write(*,*) ii end associate end block end do !$omp end parallel do end
第二种是把关联变量ii声明为指针,并在OpenMP指令里设为私有:
program main implicit none integer i,ints(5) integer,pointer :: ii call omp_set_num_threads(5) ints(:)=0 !$omp parallel do default(shared) private(ints,i,ii) do i=1,5 associate(ii=>ints(i)) write(*,*) ii end associate end do !$omp end parallel do end
试过这两种方法后,运行结果还是随机数,完全没达到预期。有没有人能帮我分析下问题出在哪,以及正确的解决方式是什么?
备注:内容来源于stack exchange,提问作者user5759106
相关产品推荐
相关产品推荐

