LAPACK на Win32 - PullRequest
       51

LAPACK на Win32

1 голос
/ 27 декабря 2011

Я изучал алгоритмы, которые требуют некоторой работы над матрицами, и я получил некоторый простой код, работающий на моей машине с 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 и ссылка на библиотеку.

Я сейчас пытаюсь заставить этот код работать из MinGW, используя 32-битные DLL из здесь , но я вижу segfaults и неверный вывод. Я перейду к gdb, чтобы определить местонахождение ошибки, но я подозреваю, что есть лучший, более чистый и более портативный способ сделать это.

Для компиляции я установил fortran для mingw (mingw-get install fortran) и ссылку на 32-битные библиотеки BLAS и LAPACK из предыдущей ссылки.

Я не уверен, сколько мне здесь не хватает ... Как все остальные запускают свой LAPACK при кодировании с помощью gcc для win32?

Что мне нужно, так это простой в использовании C-интерфейс. Я не хочу, чтобы уроки обертки были повсюду.

Я пытался найти загрузку для Intel MKL ... Даже бесплатное программное обеспечение!?

1 Ответ

3 голосов
/ 27 декабря 2011

Я решил проблему. Это не имело никакого отношения к тому, как я вызывал подпрограммы, я не смог memset свои буферы обнулить до накопления значений на них.

Вызов процедур на фортране в основном так же прост, как и в Linux.

Однако появилась еще одна довольно серьезная проблема: после того, как я использую процедуры lapack, моя программа больше не обрабатывает исключения. Смотрите здесь .

...