1

私は、行列に何らかの作業を必要とするアルゴリズムを調査しており、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、ライブラリにリンクすることだけでした。

ここから 32 ビット dll を使用して MinGW からこのコードを動作させようとしていますが、セグメンテーション違反と無効な出力が表示されます。エラーの場所を特定するために gdb を使用しますが、これを行うには、より適切で、クリーンで、移植性の高い方法があると思います。

コンパイルするために私がしたことは、mingw( mingw-get install fortran) 用の fortran をインストールし、以前のリンクから 32 ビット BLAS および LAPACK dll にリンクすることでした。

ここでどれだけ欠けているかわかりません... gcc for win32でコーディングするとき、他の人はどのようにLAPACKを動かしていますか?

私が探しているのは、使いやすい C インターフェイスです。あちこちにラッパー クラスは必要ありません。

インテル® MKL のダウンロードを探してみました... フリー・ソフトウェアでさえありません!?

4

1 に答える 1

3

問題を解決しました。ルーチンを呼び出す方法とは何の関係もありませんでしたmemset。バッファに値を蓄積する前に、バッファをゼロにすることに失敗しました。

fortran ルーチンの呼び出しは、基本的に Linux から行うのと同じくらい簡単です。

しかし、別の深刻な問題が発生しました。lapack ルーチンを使用すると、プログラムが例外を処理しなくなります。ここを参照してください。

于 2011-12-27T01:48:42.447 に答える