c - 如何从 C 调用 CLAPACK?

标签 c lapack blas lapacke

我正在尝试从 C 调用 CLAPACK 函数。我下载了 CLAPACK-3.2.1(来自 http://www.netlib.org/clapack/clapack.tgz)并按照此处的说明进行操作(http://people.sc.fsu.edu/~%20jburkardt/c_src/clapack/clapack.html)。我的 CLAPACK 分布是这样的:

$ ls
BLAS/  COPYING  F2CLIBS/  INCLUDE/  INSTALL/  Makefile  make.inc.example  my_example.c  README.install  SRC/  TESTING/

我的文件是 my_example.c 就是:

#include <stdio.h>
#include "blaswrap.h"
#include "f2c.h"
#include "clapack.h"

int main()
{
  char ta = 'N';
  char tb = 'N';
  double a[3][3];
  a[0][0] = 1;
  a[0][1] = 2;
  a[0][2] = 3;
  a[1][0] = 4;
  a[1][1] = 5;
  a[1][2] = 6;
  a[2][0] = 7;
  a[2][1] = 8;
  a[2][2] = 9;
  double b[3][3];
  b[0][0] = 1;
  b[0][1] = 0;
  b[0][2] = 0;
  b[1][0] = 0;
  b[1][1] = 0;
  b[1][2] = 0;
  b[2][0] = 5;
  b[2][1] = 5;
  b[2][2] = 5;
  double c[3][3];
  long int m = 3;
  long int n = 3;
  long int k = 3;
  double alpha = 1.0;
  double beta = 0.0;
  long int lda = 3;
  long int ldb = 3;
  long int ldc = 3;

  f2c_dgemm(&ta, &tb, &m, &n, &k, &alpha, &a[0][0], &lda, &b[0][0], &ldb, &beta, &c[0][0], &ldc);
  printf("Resulting C[0][0]: %f\n", c[0][0]);
  return 0;
}

当我编译它时,我得到了这个:

$ gcc -I./INCLUDE -I./F2CLIBS/libf2c/ -I./BLAS/WRAP/ my_example.c BLAS/SRC/dgemm.c BLAS/SRC/xerbla.c BLAS/SRC/lsame.c -o my_example.o
How can I get this to compile and run correctly?
BLAS/SRC/xerbla.c: In function ‘xerbla_’:
BLAS/SRC/xerbla.c:69:2: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
BLAS/SRC/xerbla.c:70:3: warning: format ‘%i’ expects argument of type ‘int’, but argument 3 has type ‘integer’ [-Wformat]

这是调用 clapack 函数的正确方法吗?数组传递是否正确?

(PS 我不是要动态链接到现有的 clapack 安装)。

最佳答案

我不知道 LAPACKC 和 LAPACKE 之间的区别,因为我不知道 LAPACKC,但我希望 LAPACKE 能做到这一点... http://www.netlib.org/lapack/lapacke.html

除了 dgemm_ 是 BLAS 的一部分并且接口(interface)没有在 lapacke.h 中定义... 与LAPACKC相比,LAPACKE可能有点臃肿,但还不够大!

摆脱麻烦的一种(丑陋的?)方法是在 c 代码中声明 fortran 函数并针对 BLAS 进行链接。 http://www.netlib.org/lapack/lawnspdf/lawn270.pdf

这是一个最小的工作示例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//#include <lapacke.h>

extern void dgemm_(char *transa, char *transb, int *m, int *n, int *k, double
        *alpha, double *a, int *lda, double *b, int *ldb, double *beta, double *c,
        int *ldc );

int main()
{
    double AA[3*3]={  2.0, -1.0,  0.0,
            0,  2.0, -1.0,
            0.0,  0,  2.0};

    double B[3*3]={  2.0, -1.0,  0.0,
            0,  2.0, -1.0,
            0.0,  0,  2.0};

    double C[3*3]={  2.0, -1.0,  0.0,
            0,  2.0, -1.0,
            0.0,  0,  2.0};
    int nn=3;
    int lda=3;
    int ldb=3;
    int ldc=3;
    double alpha=2.0;
    double beta=0.0;

    dgemm_( "N", "N", &nn, &nn, &nn,&alpha, AA, &lda,
            B,&ldb, &beta, C, &ldc );

    printf("C is : %10.4f %10.4f %10.4f\n",C[0], C[1], C[2]);
    printf("       %10.4f %10.4f %10.4f\n",C[3], C[4], C[5]);
    printf("       %10.4f %10.4f %10.4f\n",C[6], C[7], C[8]);
    return 0;
}

要构建此代码:gcc main.c -o main -lblas

lapacke.h 和 LAPACKE 的其他头文件中定义了很多 LAPACK 函数的接口(interface)。例如,要使用 dgetrf_(&n, &n, A, &n,ipvs, &info); 构建代码,代码将由 gcc main.c -o main -llapack - 构建lblas -I/path/to/lapacke.h

希望这对您有所帮助,尽管我不确定是否能告诉您一些有值(value)的信息!

再见,

弗朗西斯

关于c - 如何从 C 调用 CLAPACK?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22085277/

相关文章:

python-3.4 - Keras 不使用多核

c++ - 为什么在mac中禁止使用fork without exec?

c - 怎么答案是36?

c++ - macOS Sierra 上带有 Qt 的 Dlib C++ 库

cblas_dgemm 段错误

c - 无法将 c 代码链接到 lapack/blas : undefined reference

c - 如何在C中区分 "01"和 "1"

c - 多维数组和指向具有一个 Typedef 的数组的指针

c++ - 将 armadillo/blas/lapack 与 cmake 链接(对 `dgemv_' 的 undefined reference )

fortran - gfortran 错误 : zgesvd in lapack