Installazione Lapack

Configurazione e uso di IDE, editor, compilatori, in fase di programmazione.
Avatar utente
Alice_Kora
Prode Principiante
Messaggi: 8
Iscrizione: giovedì 26 giugno 2014, 9:52
Località: Bordeaux-France

Installazione Lapack

Messaggio da Alice_Kora »

Buongiorno a tutti,

dopo mesi di abbandono sto avendo problemi a installare Lapack, non è che qualcuno abbia chiarezza su come farlo? Lavoro in C quindi non mi servono i make fortran :o

Grazie in anticipo
Alice R
INRIA~IMB
Bordeaux-Talence
Bat.A 33 Bureau 168
Avatar utente
Vincenzo1968
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 450
Iscrizione: lunedì 14 gennaio 2013, 14:21
Desktop: Unity
Distribuzione: Ubuntu 18.04.3 LTS x86_64
Località: Villabate(PA)
Contatti:

Re: Installazione Lapack

Messaggio da Vincenzo1968 »

Il modo facile è con apt-get:

Codice: Seleziona tutto

sudo apt-get install libblas-dev liblapack-dev liblapacke-dev
Se invece vuoi installare da sorgenti fai così:

- scarica blas.tgz e cblas.tgz da qui: http://www.netlib.org/blas/
- scarica lapack-3.5.0.tgz da qui: http://www.netlib.org/lapack/

Installa blas e cblas seguendo questa procedura:

1) unpack:

Codice: Seleziona tutto

    tar xvf blas.tgz

2) spostarsi all'interno della directory:

Codice: Seleziona tutto

    cd BLAS

3) aprire il file make.inc e commentare la seguente linea di codice:

Codice: Seleziona tutto

    # PLAT = _LINUX

4) sempre nel file make.inc modificare la linea

Codice: Seleziona tutto

    BLASLIB      = blas$(PLAT).a
    
   in
   
    BLASLIB      = libblas$(PLAT).a

3) compilare:

Codice: Seleziona tutto

    make

4) copiare la libreria:

Codice: Seleziona tutto

    sudo cp libblas.a /usr/local/lib

5) spostarsi nella directory principale:

Codice: Seleziona tutto

    cd ..

6) unpack cblas:

Codice: Seleziona tutto

    tar xvf cblas.tgz
7) spostarsi nella directory CBLAS:

Codice: Seleziona tutto

    cd CBLAS

8) aprire il file Makefile.in e commentare la seguente riga:

Codice: Seleziona tutto

    #PLAT = LINUX

9) sempre nel file Makefile.in modificare la seguente riga:

Codice: Seleziona tutto

    BLLIB = /Users/julie/Documents/Boulot/lapack-dev/lapack/trunk/blas_LINUX.a
    
   in
   
    BLLIB = /usr/local/lib/libblas.a

10) sempre nel file Makefile.in modificare la seguente riga:

Codice: Seleziona tutto

    CBLIB = ../lib/cblas_$(PLAT).a
    
   in
   
    CBLIB = ../lib/libcblas$(PLAT).a

8) compilare:

Codice: Seleziona tutto

    make

9) copiare la libreria:

Codice: Seleziona tutto

    sudo cp lib/libcblas.a /usr/local/lib

10) copiare gli header:

Codice: Seleziona tutto

    sudo cp include/*.h /usr/local/include
------------------------------------------------------------------------------

Installa lapack e lapacke seguendo questa procedura:

1) unpack:

Codice: Seleziona tutto

    tar xvf lapack-3.5.0.tgz

2) spostarsi all'interno della directory:

Codice: Seleziona tutto

    cd lapack-3.5.0

3) copiare il file:

Codice: Seleziona tutto

    cp make.inc.example make.inc

4) aprire il file make.inc e cambiare la seguente riga:

Codice: Seleziona tutto

    BLASLIB      = ../../librefblas.a
    
   in
   
    BLASLIB      = /usr/local/lib/libblas.a
 

5) compilare:

Codice: Seleziona tutto

    make

6) spostarsi nella directory lapacke:

Codice: Seleziona tutto

    cd lapacke   
7) compilare:

Codice: Seleziona tutto

    make

8) spostarsi nella cartella principale:

Codice: Seleziona tutto

    cd ..

9) copiare le librerie:

Codice: Seleziona tutto

    sudo cp *.a /usr/local/lib

10) copiare gli header:

Codice: Seleziona tutto

   sudo cp lapacke/include/*.h /usr/local/include
--------------------------------------------------------------------------------

A questo punto possiamo provare con i file d'esempio del sito http://www.netlib.org/lapack/lapacke.html :

prova1.c

Codice: Seleziona tutto

/* Calling DGELS using row-major order */

#include <stdio.h>
#include <lapacke.h>

/*
gcc -Wall -W -pedantic -O2 -std=c99 prova1.c -o prova1 -llapacke -llapack -ltmglib -lblas -lm -lgfortran
*/

int main (int argc, const char * argv[])
{
   double a[5][3] = {1,1,1,2,3,4,3,5,2,4,2,5,5,4,3};
   double b[5][2] = {-10,-3,12,14,14,12,16,16,18,16};
   lapack_int info,m,n,lda,ldb,nrhs;
   int i,j;

   m = 5;
   n = 3;
   nrhs = 2;
   lda = 3;
   ldb = 2;

   info = LAPACKE_dgels(LAPACK_ROW_MAJOR,'N',m,n,nrhs,*a,lda,*b,ldb);

   for(i=0;i<n;i++)
   {
      for(j=0;j<nrhs;j++)
      {
         printf("%lf ",b[i][j]);
      }
      printf("\n");
   }
   return(info);
}
prova2.c

Codice: Seleziona tutto

/* Calling DGELS using column-major order */

#include <stdio.h>
#include <lapacke.h>

/*
gcc -Wall -W -pedantic -O2 -std=c99 prova2.c -o prova2 -llapacke -llapack -ltmglib -lblas -lm -lgfortran
*/

int main (int argc, const char * argv[])
{
   double a[5*3] = {1,2,3,4,5,1,3,5,2,4,1,4,2,5,3};
   double b[5*2] = {-10,12,14,16,18,-3,14,12,16,16};
   lapack_int info,m,n,lda,ldb,nrhs;
   int i,j;

   m = 5;
   n = 3;
   nrhs = 2;
   lda = 5;
   ldb = 5;

   info = LAPACKE_dgels(LAPACK_COL_MAJOR,'N',m,n,nrhs,a,lda,b,ldb);

   for(i=0;i<n;i++)
   {
      for(j=0;j<nrhs;j++)
      {
         printf("%lf ",b[i+ldb*j]);
      }
      printf("\n");
   }
   return(info);
}
prova3.c

Codice: Seleziona tutto

/* Calling CGEQRF and CUNGQR to compute Q without workspace querying */

#include <stdio.h>
#include <stdlib.h>
#include <lapacke.h>
#include <cblas.h>

#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))

/*
gcc -Wall -W -pedantic -O2 -std=c99 prova3.c -o prova3 -llapacke -llapack -ltmglib -lblas -lcblas -lm -lgfortran
*/

int main (int argc, const char * argv[])
{
   lapack_complex_float *a,*tau,*r,one,zero;
   lapack_int info,m,n,lda;
   int i,j;
   float err=0.0;
   m = 10;   n = 5;   lda = m;
   one = lapack_make_complex_float(1.0,0.0);
   zero= lapack_make_complex_float(0.0,0.0);
   a = calloc(m*n,sizeof(lapack_complex_float));
   r = calloc(n*n,sizeof(lapack_complex_float));
   tau = calloc(m,sizeof(lapack_complex_float));
   for(j=0;j<n;j++)
      for(i=0;i<m;i++)
         a[i+j*m] = lapack_make_complex_float(i+1,j+1);
   info = LAPACKE_cgeqrf(LAPACK_COL_MAJOR,m,n,a,lda,tau);
   info = LAPACKE_cungqr(LAPACK_COL_MAJOR,m,n,n,a,lda,tau);
   for(j=0;j<n;j++)
      for(i=0;i<n;i++)
         r[i+j*n]=(i==j)?-one:zero;
   cblas_cgemm(CblasColMajor,CblasConjTrans,CblasNoTrans,
               n,n,m,&one,a,lda,a,lda,&one,r,n );
   for(i=0;i<n;i++)
      for(j=0;j<n;j++)
         err=MAX(err,cabs(r[i+j*n]));
   printf("error=%e\n",err);
   free(tau);
   free(r);
   free(a);
   return(info);
}
prova4.c

Codice: Seleziona tutto

/*  Calling CGEQRF and CUNGQR to compute Q with workspace querying */

#include <stdio.h>
#include <stdlib.h>
#include <lapacke.h>
#include <cblas.h>

#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))

/*
gcc -Wall -W -pedantic -O2 -std=c99 prova4.c -o prova4 -llapacke -llapack -ltmglib -lblas -lcblas -lm -lgfortran
*/


int main (int argc, const char * argv[])
{
   lapack_complex_float *a,*tau,*r,*work,one,zero,query;
   lapack_int info,m,n,lda,lwork;
   int i,j;
   float err;
   m = 10;   n = 5;   lda = m;
   one = lapack_make_complex_float(1.0,0.0);
   zero= lapack_make_complex_float(0.0,0.0);
   a = calloc(m*n,sizeof(lapack_complex_float));
   r = calloc(n*n,sizeof(lapack_complex_float));
   tau = calloc(m,sizeof(lapack_complex_float));
   for(j=0;j<n;j++)
      for(i=0;i<m;i++)
         a[i+j*m] = lapack_make_complex_float(i+1,j+1);
   info = LAPACKE_cgeqrf_work(LAPACK_COL_MAJOR,m,n,a,lda,tau,&query,-1);
   lwork = (lapack_int)query;
   info = LAPACKE_cungqr_work(LAPACK_COL_MAJOR,m,n,n,a,lda,tau,&query,-1);
   lwork = MAX(lwork,(lapack_int)query);
   work = calloc(lwork,sizeof(lapack_complex_float));
   info = LAPACKE_cgeqrf_work(LAPACK_COL_MAJOR,m,n,a,lda,tau,work,lwork);
   info = LAPACKE_cungqr_work(LAPACK_COL_MAJOR,m,n,n,a,lda,tau,work,lwork);
   for(j=0;j<n;j++)
      for(i=0;i<n;i++)
         r[i+j*n]=(i==j)?-one:zero;
   cblas_cgemm(CblasColMajor,CblasConjTrans,CblasNoTrans,
               n,n,m,&one,a,lda,a,lda,&one,r,n);
   err=0.0;
   for(i=0;i<n;i++)
      for(j=0;j<n;j++)
         err=MAX(err,cabs(r[i+j*n]));
   printf("error=%e\n",err);
   free(work);
   free(tau);
   free(r);
   free(a);
   return(info);
}
È ormai difficile incontrare un cretino che non sia intelligente e un intelligente che non sia un cretino. [...] Oh i bei cretini di una volta! Genuini, integrali. Come il pane di casa. Come l'olio e il vino dei contadini. (da "Nero su nero" di Leonardo Sciascia)
Avatar utente
Alice_Kora
Prode Principiante
Messaggi: 8
Iscrizione: giovedì 26 giugno 2014, 9:52
Località: Bordeaux-France

Re: Installazione Lapack

Messaggio da Alice_Kora »

Grazie davvero pensavo di aver risposto ma evidentemente la mia connessione mi aveva abbandonato :S
Alice R
INRIA~IMB
Bordeaux-Talence
Bat.A 33 Bureau 168
Scrivi risposta

Ritorna a “Strumenti per la programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 5 ospiti