Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency 为什么DO并发语句会给出奇怪的结果?_Concurrency_Fortran_Intel Fortran_Fortran2008 - Fatal编程技术网

Concurrency 为什么DO并发语句会给出奇怪的结果?

Concurrency 为什么DO并发语句会给出奇怪的结果?,concurrency,fortran,intel-fortran,fortran2008,Concurrency,Fortran,Intel Fortran,Fortran2008,让我们编译以下Fortran程序: program main implicit none integer::j complex::y(2) real::x(2) x(1)=1.0 x(2)=2.0 do j=1,2 y(j)=FF(x(j)) enddo write(6,*) write(6,*) y,"by DO" forall (integer::i=1:2)

让我们编译以下Fortran程序:

program main
    implicit none
    integer::j
    complex::y(2)
    real::x(2)

    x(1)=1.0
    x(2)=2.0

    do j=1,2
        y(j)=FF(x(j))
    enddo

    write(6,*)
    write(6,*) y,"by DO"

    forall (integer::i=1:2)
        y(i)=FF(x(i))
    end forall

    write(6,*)
    write(6,*) y,"by FORALL"

    do concurrent (integer::i=1:2)
        y(i)=FF(x(i))
    enddo

    write(6,*)
    write(6,*) y,"by DO CONCURRENT"
    write(6,*)

    contains
    complex pure function FF(xx)
        real,intent(in)::xx
        FF=cmplx(xx)
    end function
end program
由ifort(版本19.0.4.243)提供,无选项。 然后,我们得到结果:

$ ./a.out

 (1.000000,0.0000000E+00) (2.000000,0.0000000E+00) by DO

 (1.000000,0.0000000E+00) (2.000000,0.0000000E+00) by FORALL

 (2.000000,0.0000000E+00) (2.000000,0.0000000E+00) by DO CONCURRENT

第一个和第二个结果与预期一致。
为什么不使用CONCURRENT提供相同的结果?

您可以向英特尔报告英特尔编译器中的错误(使用您的支持联系人或论坛)。我使用gfortran 7.5进行了测试,您的代码工作正常。我将尝试在编译期间使用选项-O0禁用优化,以查看这是否是一个优化问题。在使用
/Qopenmp
/Qparallel
编译时,它似乎可以工作。我刚刚试用过它,我可以确认在英特尔编译器
ifort(ifort)19.1.2.254 20200623
ifort中存在此行为(IFORT)19.0.4.243 20190416
(我没有测试过任何其他版本)。正如@Jean-ClaudeArbaut所说,它似乎没有给出
-parallel
选项。但是,只有
-qopenmp
似乎仍然存在缺陷。@chw21这很奇怪。对于
ifort 19.1.2.254 build 20200623
for
Windows
,它可以与任何选项一起使用。如果y不是复杂的,而是真实的,它也可以工作。有def首先是一个bug,它取决于微妙的因素。顺便说一句,我查阅了英特尔论坛,发现有几个问题与最新版本中的
do concurrent
问题有关。