在Win32上进行LAPACK

时间:2011-12-27 01:17:39

标签: c++ windows mingw lapack

我一直在探索需要对矩阵进行一些工作的算法,而且我已经在我的Linux机器上运行了一些简单的代码。这是一段摘录:

extern "C" {
    // link w/ LAPACK
    extern void dpptrf_(const char *uplo, const int *n, double *ap, int *info);
    extern void dpptri_(const char *uplo, const int *n, double *ap, int *info);
    // BLAS todo: get sse2 up in here (ATLAS?)
    extern void dgemm_(const char *transa, const char *transb, const int *m,
            const int *n, const int *k, const double *alpha, const double *a,
            const int *lda, const double *b, const int *ldb, const double *beta,
            double *c, const int *ldc);
}

// in-place: be sure that (N*(N+1)/2) doubles have been initialized
inline void invert_mat_sym_packed(double *vd, int n) {
    int out = 0;
    dpptrf_("U",&n,vd,&out);
    ASSERT(!out);
    dpptri_("U",&n,vd,&out);
    ASSERT(!out);
}

// use with col-major ordering!!!
inline void mult_cm(double *a, double *b, double alpha, int m, int k, int n, double *c) {
    int lda = m, ldb = k, ldc = m; double beta = 1.0;
    dgemm_("N","N",&m,&n,&k,&alpha,a,&lda,b,&ldb,&beta,c,&ldc);
}

我所要做的就是sudo apt-get install liblapack,并链接到图书馆。

我现在正试图使用​​来自here的32位dll从MinGW获取此代码,但我看到了段错误和无效输出。我将继续使用gdb来确定错误的位置,但我怀疑有更好,更清洁,更便携的方法来完成这项工作。

我为编译而做的是安装fortran for mingw(mingw-get install fortran)并链接到早期链接的32位BLAS和LAPACK dll。

我不确定我在这里失踪了多少...当使用gcc为win32编码时,其他人如何获得他们的LAPACK?

我正在寻找的是一个易于使用的C界面。我不希望到处都是包装类。

我试图找到英特尔MKL的下载...甚至不是免费软件!?

1 个答案:

答案 0 :(得分:3)

我解决了这个问题。它与我调用例程的方式无关,在将值累积到它们之前,我没有memset我的缓冲区为零。

调用fortran例程基本上和Linux一样简单。

但是,出现了另一个相当严重的问题:一旦我使用lapack例程,我的程序就不再处理异常了。见here