寻找 LAPACK/BLAS 错误代码列表

4

我正在使用Intel MKL中的LAPACK的zheev。我得到了int INFO=99。我在互联网上搜索这个代码对应的含义,但是我找不到列出所有整数错误代码及其含义的文档。

是否有人有LAPACK/BLAS错误代码完整列表的链接?或者如果您有离线副本,请将其复制粘贴作为答案?

1个回答

3
根据 LAPACK 的文档,输出的 INFO 报告了两种错误。一方面,如果 INFO<0,则参数-INFO 的值非法。参数编号为 1、2、3 等:没有 0(Fortran)。例如,矩阵的大小是负数。另一方面,INFO>0 报告了计算失败 失败的实际原因在引发错误的程序的注释中描述。 例如,对于 zheev(),它写道:

0:如果 INFO=i,则算法无法收敛。i 个中间三对角形式的非对角线元素未收敛为零。

查看 zheev() 的源代码,矩阵首先被缩放并降为三角形式,然后根据需要计算特征向量。如果不需要计算特征向量,则调用 dsterf();如果需要计算特征向量,则从反射系数开始调用 zungtr() 形成一个酉矩阵 Q,并调用 zsteqr() 计算三对角矩阵的特征值和特征向量。因此,输出的 INFO 取决于 dsterf()zsteqr() 的结果。
关于 zsteqr(),当最大迭代次数后仍存在非空错误时,在第536行会增加INFO的值。一些可能导致QR迭代失败的情况在Daniel Kressner的《常规和结构化特征值问题的数值方法》第1.3.6节中报告。尽管如此,错误通常是由编程错误引起的,列举如下
  • 数组类型错误。例如,zheev() 函数期望的是双精度复数数组,即在 Fortran 中的 DOUBLE COMPLEX 或者 COMPLEX*16。如果使用了 COMPLEX*8,可能会导致未定义的行为,并且可能会返回正 INFO。

  • 在运行 LAPACK 程序之前,数组(矩阵和向量)可能已经被损坏。对于 zheev(),这可能是由数组中的 INF 或 NaN 引起的。

  • 调用程序时发生了编程错误。例如,参数 LDA 是数组 A 的主维度。它会检查 LDA >= max(1,N),如果不满足这个条件,则返回 INFO=-5。然而,程序员仍然可以分配大小为 n*n 的数组 A 并指定 LDA=2*n,这将导致未定义的行为,因为将使用超出数组索引的值。同样,可能的行为是返回 INFO=99

最后,LAPACK的C/C++语言的LAPACKE包装器自动处理工作数组的分配。因此,它还定义了错误代码,例如在lapacke.h中返回到infoLAPACK_WORK_MEMORY_ERRORLAPACK_TRANSPOSE_MEMORY_ERROR:
#define LAPACK_WORK_MEMORY_ERROR       -1010
#define LAPACK_TRANSPOSE_MEMORY_ERROR  -1011

不要犹豫在StackOverflow上提出问题,报告错误和重要的代码片段,以及不希望出现的行为的描述。理想情况下,代码片段应该是能够复现错误的示例代码。但是,展示数组分配和输入值的代码片段也可以足够证明问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接