Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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
Macos 使用ifort编译的遗留代码的不稳定行为_Macos_Fortran_Intel Fortran_Intel Mkl_Non Deterministic - Fatal编程技术网

Macos 使用ifort编译的遗留代码的不稳定行为

Macos 使用ifort编译的遗留代码的不稳定行为,macos,fortran,intel-fortran,intel-mkl,non-deterministic,Macos,Fortran,Intel Fortran,Intel Mkl,Non Deterministic,我多么希望我有一个最低限度的工作示例 我正在用计算机做一系列线性代数。我已经打开了我能想到的所有调试标志 在我的工作站上,“确定性”代码的最终结果很少起作用。大多数情况下,它会抱怨索引错误: 在我的工作站(Mac OS 10.7.5和iPort 12)上: 在我的笔记本电脑(Mac OS 10.10.5和iPort 16)上: (您可能会注意到,这实际上是两个不同的错误,尽管我没有更改它们之间的一行代码。) 我的代码在笔记本电脑上使用较新版本的ifort成功运行约70%,但在工作站上使用较旧版本

我多么希望我有一个最低限度的工作示例

我正在用计算机做一系列线性代数。我已经打开了我能想到的所有调试标志

在我的工作站上,“确定性”代码的最终结果很少起作用。大多数情况下,它会抱怨索引错误:

在我的工作站(Mac OS 10.7.5和iPort 12)上: 在我的笔记本电脑(Mac OS 10.10.5和iPort 16)上: (您可能会注意到,这实际上是两个不同的错误,尽管我没有更改它们之间的一行代码。)

我的代码在笔记本电脑上使用较新版本的
ifort
成功运行约70%,但在工作站上使用较旧版本的
ifort
成功运行约20%。奇怪的是,它工作的时间通常是在一次新的编译之后,并且在工作一次之后,每次都会出现错误。一次有效,第二次无效,第三次有效。(有时在我的笔记本电脑上,它在前2-3次运行时工作,但在第四次运行时抛出错误。)

我自己的代码完全是确定性的:它设置了求解线性代数的例程。它还调用HSL例程,这些例程显然调用MKL。我假设HSL和MKL都是确定性的——也就是说,相同的输入产生相同的输出。(他们不调用RAND()或进行文件I/O…)但我不确定

更新: 我查阅了ma48d.f的第1461行:

     CALL MA50BD(NR,NC,NZB,JOB5,A(K+1),IRN(K+1),KEEP(IPTRD+J1),
 +               CNTL5,ICNTL5,IW(J1),IQB,NP,LA-NEWNE-KK,
 +               A(NEWNE+KK+1),IRN(NEWNE+KK+1),KEEP(IPTRL+J1),
 +               KEEP(IPTRU+J1),W,IW(M+1),INFO5,RINFO5)
在我的笔记本电脑上,它在抱怨,因为
k
有一个值
-1
(导致错误),而它通常有一个值
0
(导致成功)。奇怪的是,我给这些例程提供了完全相同的输入,而代码似乎是确定性的,所以它们应该执行完全相同的行…但它们没有

我的问题: 是什么导致了这种不稳定的行为?

到目前为止,我想到了以下可能性:

  • 内部编译器错误(支持证据:较新版本的ifort似乎产生了更好的结果,但甚至只是不同的结果。)
  • 与堆栈/堆相关的内容(支持证据:它第一次起作用,但之后不起作用。)
  • MKL(BLAS)是不确定的(不太可能)(支持证据:回溯指向libintlc.dylib,这是一个英特尔库……可能与MKL有关?)
  • HSL是非确定性的(可能是??)(支持证据:代码似乎是确定性的,尽管此代码中至少有一个错误。)
  • 关于我安装ifort或配置Mac OS X的一些信息?(支持证据:这是一台旧机器,可能在什么地方出了问题?)

以我的经验,编译器远比程序员可靠。也就是说,除非能够证明生成了错误代码,否则我会怀疑程序有编程错误

这种错误肯定是由于使用了未初始化的值。查找在使用前未专门设置为某个值的变量

program x
integer :: i, arr(10)

do while (i < 10)
   arr (i) = 0
   i = i + 1
enddo

print *, arr
end

没有编译器警告会因为未能重新初始化sum而出现,尽管这种错误是可重复的和确定的。

根据我的经验,编译器比程序员更可靠。也就是说,除非能够证明生成了错误代码,否则我会怀疑程序有编程错误

这种错误肯定是由于使用了未初始化的值。查找在使用前未专门设置为某个值的变量

program x
integer :: i, arr(10)

do while (i < 10)
   arr (i) = 0
   i = i + 1
enddo

print *, arr
end

如果未能重新初始化
sum
,则不会显示编译器警告,尽管此类错误是可重复的和确定的。

我无法添加注释-因此答案是肯定的


您还可以尝试-ftrapuv(将堆栈变量初始化为异常值)。如果您使用的是英特尔15或更高版本,则可以设置-init=snan。这将初始化“save”变量以发出NaN信号。

我无法添加注释-因此答案是这样的


您还可以尝试-ftrapuv(将堆栈变量初始化为异常值)。如果您使用的是英特尔15或更高版本,则可以设置-init=snan。这将初始化“save”变量以发出NaN信号。

听起来像是一个单位化的值。您是否尝试过在代码上运行
valgrind
或类似的内存泄漏检查程序?MKL可能(经常)使用并行执行。线程调度的变化可能会改变观察到的相同输入的行为。对我来说,听起来像是一个统一的值。您是否尝试过在代码上运行
valgrind
或类似的内存泄漏检查程序?MKL可能(经常)使用并行执行。线程调度的变化可能会改变相同输入的观察行为。谢谢!好主意。我正在使用
-warn all-check all-check uninit
等工具进行编译。这些标志不应该捕捉这些错误吗?如果没有,我可以传递什么标志来在编译时警告我这些错误?另外:我更改了代码,这样它就可以编译了…我认为这些差异应该纯粹是装饰性的。如果您认为这会产生与您所说的相同的错误,请告诉我。我还运行了包含和不包含我在上述注释中提到的检查的代码段。通过检查,它每次都失败,并出现运行时错误。没有检查,每次我运行它时,它都会输出十个零,连续十几次。@jvriesem:我写fortran77太久了,很难记住较新的方言。谢谢你的编辑。事实上,修改后的代码应该表现出相同的随机行为。@jvriesem:虽然这些警告是一个良好的开端,但逻辑中仍然可能存在未初始化的错误。我再加一个例子,谢谢!好主意。我正在使用
-warn all-check all-check uninit
等工具进行编译。这些标志不应该捕捉这些错误吗?如果不是,我可以通过什么标志
program x
integer :: i, arr(10)

do while (i < 10)
   arr (i) = 0
   i = i + 1
enddo

print *, arr
end
program y
integer :: sum, i, arrA(10), arrB(10)
real :: ave(2)

do i = 1, 10
    arrA(i) = i * 343
    arrB(i) = i * 121
enddo

sum = 0
do i = 1, 10
    sum = sum + arrA(i)
enddo
ave(0) = sum / 10.0

do i = 1, 10
    sum = sum + arrB(i)
enddo
ave(1) = sum / 10.0

print *, 'Averages are', ave
end