【问题标题】:C code that uses blas, lapack and openmp working with gcc 4.9 but gives run time error with gcc 6使用 blas、lapack 和 openmp 的 C 代码与 gcc 4.9 一起使用,但在 gcc 6 中出现运行时错误
【发布时间】:2016-09-23 11:33:40
【问题描述】:

我用 C 写了一段代码。

你可以找到源代码here

它利用了 blas、lapack 和 openmp 库。

我按照these instrucions 编译了 blas 和 lapack 库。

我使用这些标志告诉编译器它应该链接的库:-lblas -llapack -fopenmp

我用的是gcc 4.9,程序可以正常运行。

最近我将 gcc 更新到 gcc 6,它显示了许多关于 blas 和 lapack 函数的隐式声明的警告消息:

src/PSIRWLS-train.c:152:17: warning: implicit declaration of function 'dgemm_' [-Wimplicit-function-declaration]
                 dgemm_(&trans, &trans, &(dataset.l), &ncols, &size,&factorA, KSC, &(dataset.l), miZ, &size, &factor, miKSM, &(dataset.l));

当我运行应用程序时,会出现分段错误。

我完全不知道 gcc 4.9 和 gcc 6 的区别,你知道对此有什么解释吗?

【问题讨论】:

  • 指向您的代码的链接导致错误 404...您可能对cblasLapacke 感兴趣,它们是 BLAS / LAPACK 的 C 接口。否则,您可能必须清除 extern dgemm_(...) 。请注意,以这种方式声明 fortran 函数可能会导致可移植性问题,因为 Linux 和 W-thing 之间的命名约定发生了变化……使用 Cblas 和 Lapacke 会将这个问题(以及其他一些问题)留给这些接口的开发人员。

标签: runtime-error lapack blas gcc4.9 gcc6


【解决方案1】:

问题解决了。

1 - gcc 4 和 6 中的一些默认标志不同。当您不以这种方式清除 blas 和 lapack 函数时,gcc 6 会显示警告:

extern void dgemm_(...)

2 - 它使我无法初始化一个必须初始化为 0 的变量。 我编码 int i,j = 0; 当我不得不编码 int i=0, j=0;

gcc 4 将 i 初始化为 0(程序正常运行)而 gcc 6 没有(创建分段错误,因为这些变量要索引)

【讨论】:

    【解决方案2】:

    我曾经有过一次a similar problem,您的代码中似乎很可能存在一些未定义的行为(例如双重释放),这是以编译器特定的方式处理的。也许这在 gcc 4.9 和 6.0 之间发生了变化。

    不知道你的代码很难说,但你可以自己使用一些工具来追踪这个问题,例如GDB 或特别是valgrind's memcheck(对我来说非常出色):

    valgrind --tool memcheck <your binary here>
    

    这将报告代码中与内存相关的错误和未定义行为的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      相关资源
      最近更新 更多