c语言 - 将LAPACKE_zgetrs与LAPACK_ROW_MAJOR一起使用会导致非法内存访问



我正在尝试使用以下代码求解线性系统:

#include <stdio.h>
#include <lapacke.h>
int main () {
lapack_complex_double mat[4];
lapack_complex_double vec[2];
lapack_int p[2];
mat[0] = lapack_make_complex_double(1,0);
mat[1] = lapack_make_complex_double(1,0);
mat[2] = lapack_make_complex_double(1,0);
mat[3] = lapack_make_complex_double(-1,0);
vec[0] = lapack_make_complex_double(1,0);
vec[1] = lapack_make_complex_double(1,0);
LAPACKE_zgetrf(LAPACK_ROW_MAJOR, 2, 2, mat, 2, p);
LAPACKE_zgetrs(LAPACK_ROW_MAJOR, 'N', 2, 1, mat, 2, p, vec, 2);
printf("%g %gn", lapack_complex_double_real(vec[0]),
lapack_complex_double_imag(vec[0]));
return 0;
}

由于某些原因,这会导致LAPACKE_zgetrs中的非法内存访问(正如valgrind检测到的那样,由于"glibc检测到损坏或双重释放">,我的大程序在zgetrs中崩溃)。为了简洁起见,我没有将其包含在我的 SSCCE 中,但所有返回LAPACKE例程都返回 0。

具有LAPACK_COL_MAJOR的相同代码完美地运行和运行

。我的 lapacke、lapack 等都是为 Ubuntu 12.04 自建的。我在 lapack CMake 文件中使用了以下设置:

BUILD_COMPLEX       ON
BUILD_COMPLEX16     ON
BUILD_DOUBLE        ON
BUILD_SHARED_LIBS   ON
BUILD_SINGLE        ON
BUILD_STATIC_LIBS   ON
BUILD_TESTING       ON
CMAKE_BUILD_TYPE    Release
LAPACKE             ON
LAPACKE_WITH_TMG    ON

其余的(优化的 BLAS/LAPACK 和 XBLA)关闭。生成过程中没有错误,所有测试都成功。

我哪里搞砸了?

编辑:我刚刚用Fedora21和打包的lapacke尝试过这个。它没有重现错误。

编辑2:虽然它没有重现内存故障,但它产生了错误的解决方案,即(1 + 0I, 1 + 0I)上述输入(应(1,0))

经过更多的研究和过度思考,我找到了罪魁祸首:

使用LAPACK_ROW_MAJOR可切换ld*前导尺寸参数的含义。虽然普通 Fortran 数组的前导维度是数,但切换到ROW_MAJOR会将其含义切换到数。因此,正确的调用(给出正确的结果)将是:

LAPACKE_zgetrs(LAPACK_ROW_MAJOR, 'N', 2, 1, mat, 2, p, vec, 1);

其中第二个2mat数(不是行!),最后一个参数必须等于右边nrhs数(不是变量数!我隔离了这个调用,因为我项目中的所有其他调用都处理方形矩阵,因此"错误"调用不会因对称性而产生任何负面影响。

像往常一样,如果要跳过末尾的列,则前导维度会相应地变大,就像在正常设置中跳过行一样。

显然,Fortran文档中没有提到这一点。不幸的是,我在Lapacke文档中确实没有看到这样的评论,这将节省我几个小时的生命。:)

相关内容

  • 没有找到相关文章

最新更新