2014-02-28 2 views
1

Я пытаюсь вызвать функцию CLAPACK из C. Я загрузил CLAPACK-3.2.1 (от http://www.netlib.org/clapack/clapack.tgz) и следил за инструкциями здесь (http://people.sc.fsu.edu/~%20jburkardt/c_src/clapack/clapack.html). Мое распределение CLAPACK это:Как позвонить CLAPACK с C?

$ ls 
BLAS/ COPYING F2CLIBS/ INCLUDE/ INSTALL/ Makefile make.inc.example my_example.c README.install SRC/ TESTING/ 

Мой файл my_example.c просто:

#include <stdio.h> 
#include "blaswrap.h" 
#include "f2c.h" 
#include "clapack.h" 

int main() 
{ 
    char ta = 'N'; 
    char tb = 'N'; 
    double a[3][3]; 
    a[0][0] = 1; 
    a[0][1] = 2; 
    a[0][2] = 3; 
    a[1][0] = 4; 
    a[1][1] = 5; 
    a[1][2] = 6; 
    a[2][0] = 7; 
    a[2][1] = 8; 
    a[2][2] = 9; 
    double b[3][3]; 
    b[0][0] = 1; 
    b[0][1] = 0; 
    b[0][2] = 0; 
    b[1][0] = 0; 
    b[1][1] = 0; 
    b[1][2] = 0; 
    b[2][0] = 5; 
    b[2][1] = 5; 
    b[2][2] = 5; 
    double c[3][3]; 
    long int m = 3; 
    long int n = 3; 
    long int k = 3; 
    double alpha = 1.0; 
    double beta = 0.0; 
    long int lda = 3; 
    long int ldb = 3; 
    long int ldc = 3; 

    f2c_dgemm(&ta, &tb, &m, &n, &k, &alpha, &a[0][0], &lda, &b[0][0], &ldb, &beta, &c[0][0], &ldc); 
    printf("Resulting C[0][0]: %f\n", c[0][0]); 
    return 0; 
} 

Когда я скомпилировать я получаю это:

$ gcc -I./INCLUDE -I./F2CLIBS/libf2c/ -I./BLAS/WRAP/ my_example.c BLAS/SRC/dgemm.c BLAS/SRC/xerbla.c BLAS/SRC/lsame.c -o my_example.o 
How can I get this to compile and run correctly? 
BLAS/SRC/xerbla.c: In function ‘xerbla_’: 
BLAS/SRC/xerbla.c:69:2: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default] 
BLAS/SRC/xerbla.c:70:3: warning: format ‘%i’ expects argument of type ‘int’, but argument 3 has type ‘integer’ [-Wformat] 

Это правильный способ вызова функция clapack? Правильно ли передается массив?

(PS Я не пытаюсь динамически связываться с существующей установкой clapack).

+0

Ну, если вы не пытаетесь динамически связать с ним, как следует линкер найти функции? – zneak

+0

@zneak: Я хочу скомпилировать его с моим кодом, поэтому, я думаю, мне нужно знать, какие * .c файлы включать? – user248237dfsf

+0

@zneak: вы делаете хороший момент. Я пересмотрел свой вопрос, чтобы быть более ясным. – user248237dfsf

ответ

2

Я не знаю разницу между LAPACKC и LAPACKE, так как я не знал о LAPACKC, но я ожидал LAPACKE сделать трюк ... http://www.netlib.org/lapack/lapacke.html

Кроме того dgemm_ является частью BLAS и интерфейс не определено в lapacke.h ... LAPACKE может раздуваться по сравнению с LAPACKC, но он не достаточно большой!

A (уродливый?) Способ избавиться от проблемы состоит в том, чтобы объявить функцию fortran в коде c и ссылке на BLAS. http://www.netlib.org/lapack/lawnspdf/lawn270.pdf

Вот минимальный рабочий пример:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
//#include <lapacke.h> 

extern void dgemm_(char *transa, char *transb, int *m, int *n, int *k, double 
     *alpha, double *a, int *lda, double *b, int *ldb, double *beta, double *c, 
     int *ldc); 

int main() 
{ 
    double AA[3*3]={ 2.0, -1.0, 0.0, 
      0, 2.0, -1.0, 
      0.0, 0, 2.0}; 

    double B[3*3]={ 2.0, -1.0, 0.0, 
      0, 2.0, -1.0, 
      0.0, 0, 2.0}; 

    double C[3*3]={ 2.0, -1.0, 0.0, 
      0, 2.0, -1.0, 
      0.0, 0, 2.0}; 
    int nn=3; 
    int lda=3; 
    int ldb=3; 
    int ldc=3; 
    double alpha=2.0; 
    double beta=0.0; 

    dgemm_("N", "N", &nn, &nn, &nn,&alpha, AA, &lda, 
      B,&ldb, &beta, C, &ldc); 

    printf("C is : %10.4f %10.4f %10.4f\n",C[0], C[1], C[2]); 
    printf("  %10.4f %10.4f %10.4f\n",C[3], C[4], C[5]); 
    printf("  %10.4f %10.4f %10.4f\n",C[6], C[7], C[8]); 
    return 0; 
} 

Чтобы построить этот код: gcc main.c -o main -lblas.

Много интерфейсов для функций LAPACK определены в lapacke.h и других заголовках LAPACKE. Например, для построения кода с использованием dgetrf_(&n, &n, A, &n,ipvs, &info); код будет построен по gcc main.c -o main -llapack -lblas -I /path/to/lapacke.h

Надеюсь, что это поможет, хотя я не уверен, что расскажу вам что-то ценное!

Bye,

Фрэнсис

 Смежные вопросы

  • Нет связанных вопросов^_^