2011-12-27 3 views
1

나는 행렬에 대한 작업이 필요한 알고리즘을 탐색 해 왔으며 Linux 컴퓨터에서 작동하는 간단한 코드를 얻었습니다. 여기에서 발췌 한 것입니다 :LAPACK on Win32

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에서 작동하기 위해 here의 32 비트 DLL을 사용하려고 노력하고 있지만 segfaults와 잘못된 출력을보고 있습니다. 나는 오류의 위치를 ​​결정하기 위해 gdb를 진행할 것이다. 그러나 이것을 수행하는 더 나은, 더 깔끔하고, 더 이식 가능한 방법이 있다고 의심된다.

내가 컴파일하려면 mingw (mingw-get install fortran)의 fortran을 설치하고 이전 링크의 32 비트 BLAS 및 LAPACK dll에 연결하십시오.

내가 여기에 얼마나 빠졌는지 잘 모르겠다 ... gcc로 Win32 용으로 코딩 할 때 다른 사람들이 어떻게 LAPACK을 할 수 있을까?

내가 찾고있는 것은 사용하기 쉬운 C 인터페이스입니다. 나는 래퍼 클래스를 온통 원하지 않는다.

인텔 MKL 용 다운로드를 찾으려고했습니다 ... 무료 소프트웨어도 아닌가요?

답변

3

나는이 문제를 해결했다. 그것은 내가 루틴을 호출하는 방식과 아무 관련이 없습니다. memset 내 버퍼를 0으로 채우기 전에 값을 누적하지 않았습니다.

Fortran 루틴 호출은 기본적으로 리눅스에서하는 것처럼 간단합니다.

그러나 또 다른 심각한 문제가 나타났습니다. 일단 lapack 루틴을 사용하면 프로그램에서 더 이상 예외를 처리하지 않습니다. here을 참조하십시오.