使用标志 -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。
如果您更改编译选项,编译器将在后台执行不同的优化和操作。
最有可能的情况是您对代码中某处的内存进行了不安全访问,可能是溢出
我正在尝试使用 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。
如果您更改编译选项,编译器将在后台执行不同的优化和操作。
最有可能的情况是您对代码中某处的内存进行了不安全访问,可能是溢出