Win32 上的 LAPACK

Posted

技术标签:

【中文标题】Win32 上的 LAPACK【英文标题】:LAPACK on Win32 【发布时间】:2011-12-27 01:17:39 【问题描述】:

我一直在探索需要对矩阵进行一些处理的算法,并且我已经获得了一些在我的 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 来确定错误的位置,但我怀疑有更好、更清洁、更便携的方法来完成此操作。

我为使其编译所做的工作是为 mingw (mingw-get install fortran) 安装 fortran,并从之前的链接链接到 32 位 BLAS 和 LAPACK dll。

我不确定我在这里错过了多少......当使用 gcc for win32 进行编码时,其他人是如何获得他们的 LAPACK 的?

我正在寻找一个易于使用的 C 接口。我不想到处都是包装类。

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

【问题讨论】:

【参考方案1】:

我解决了这个问题。这与我调用例程的方式无关,在将值累加到缓冲区之前,我未能将缓冲区 memset 归零。

调用 fortran 例程基本上与在 Linux 中调用一样简单。

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

【讨论】:

以上是关于Win32 上的 LAPACK的主要内容,如果未能解决你的问题,请参考以下文章

win32 C++上的按钮样式

如何更改 win32 窗口上的文本?

Win32 上的 LAPACK

Win32:匿名管道上的事务

Python 2.6 Win32 (xp) 上的 Python 多处理

Win32 上的互锁操作与 XXX::atomic