使用标志 -fbounds-check 进行编译会更改结果(输出)有什么原因吗?

Is there any reason why compiling with the flag -fbounds-check changes the results (output)?

我正在尝试使用 OpenMP 并行化代码。为了测试我的结果,我编译如下:(我的文件名为hecese_OpenMP.f90

gfortran -O3 -g -fopenmp hecese_OpenMP.f90 -o hecese_OpenMP 

并执行:

./hecese_OpenMP 

在这种情况下,我得到逻辑值(温度值):

   0.0000000000000000        783.49759312323954     
   4.9999999999999996E-006   783.97754329856036     
   9.9999999999999991E-006   784.46409277472367     
   1.4999999999999999E-005   784.93610174094374     
   1.9999999999999998E-005   785.40356531164821     
   2.4999999999999998E-005   785.86244125304006     
   2.9999999999999997E-005   786.31543982367702     
   3.4999999999999997E-005   786.76028899490404     
   3.9999999999999996E-005   787.19919935749363     
   4.4999999999999996E-005   787.62967799732780     
   4.9999999999999996E-005   788.05430483965176     
   5.4999999999999995E-005   788.47014285857574     
   5.9999999999999995E-005   788.88020246536769     
   6.4999999999999994E-005   789.28114213978677     
   6.9999999999999994E-005   789.67635992390058     
   7.4999999999999993E-005   790.06216152696709     
   7.9999999999999993E-005   790.44228749976969     
   8.4999999999999993E-005   790.81272956777650     
   8.9999999999999992E-005   791.17754135728615     
   9.4999999999999992E-005   791.53241936895017     
   9.9999999999999991E-005   791.88172053640665     
   1.0499999999999999E-004   792.22084724600575     
   1.0999999999999999E-004   792.55446522757518     
   1.1499999999999999E-004   792.87767333202453     
   1.1999999999999999E-004   793.19545920221628     
   1.2500000000000000E-004   793.50260538260022     
   1.3000000000000002E-004   793.80443633151526     
   1.3500000000000003E-004   794.09540506217127     

当尝试使用标志 -fbounds-check 进行编译时,如下所示:

gfortran -O3 -g -fbounds-check -fopenmp hecese_OpenMP.f90 -o hecese_OpenMP 

像往常一样执行,我得到奇怪的温度值(不合逻辑):

   0.0000000000000000        3.3678051568814173E+080
   4.9999999999999996E-006   2.0735511943440867E+080
   9.9999999999999991E-006   1.3676510585758991E+080
   1.4999999999999999E-005   8.8222276938810882E+079
   1.9999999999999998E-005   5.7108837929115938E+079
   2.4999999999999998E-005   3.6529924583454717E+079
   2.9999999999999997E-005   2.3293108079294771E+079
   3.4999999999999997E-005   1.4700467727884548E+079
   3.9999999999999996E-005   9.2409585880233678E+078
   4.4999999999999996E-005   5.7484421298339787E+078
   4.9999999999999996E-005   3.5604809767646989E+078
   5.4999999999999995E-005   2.1807048749261957E+078
   5.9999999999999995E-005   1.3291540309955299E+078
   6.4999999999999994E-005   8.0025674937017744E+077
   6.9999999999999994E-005   4.7911693804323633E+077
   7.4999999999999993E-005   2.8296567608841817E+077
   7.9999999999999993E-005   1.6599764239864436E+077
   8.4999999999999993E-005   9.5877223899911227E+076
   8.9999999999999992E-005   5.4907601600220782E+076
   9.4999999999999992E-005   3.0867706571011204E+076
   9.9999999999999991E-005   1.7152374444148965E+076
   1.0499999999999999E-004   9.3084530138270176E+075
   1.0999999999999999E-004   4.9628366027261650E+075
   1.1499999999999999E-004   2.5578832649607984E+075
   1.1999999999999999E-004   1.2769186604807401E+075
   1.2500000000000000E-004   6.0034678612971150E+074
   1.3000000000000002E-004   2.6103218948330567E+074
   1.3500000000000003E-004   9.5395112603841788E+073
   1.4000000000000004E-004   2.1614190086226482E+073
   1.4500000000000006E-004  -8.3254384174910055E+072

我认为 -fbounds-check 是一个调试标志,每次访问数组元素时都会检查数组索引是否在数组的范围内。 它会干预我在代码中进行的计算吗?从结果中可以看出,从 2 次编译中获得的值之间存在巨大差异。 我只加了flag。

如果您更改编译选项,编译器将在后台执行不同的优化和操作。

最有可能的情况是您对代码中某处的内存进行了不安全访问,可能是溢出