Fedora og BLAS

trafikselskabet
Antal: 137
Tilmeldt:
16-07-2006
User is offline
Fedora og BLAS

Hej Alle

Jeg roder med noget C++ kode hvor jeg skal anvende BLAS biblioteket for at lave nogle matrix/vector operationer effektivt. Det virker overhovedet ikke på Fedora, men fint på alt andet (Ubuntu, Mac, Windows). Er der en med Fedora der kan prøve at compilere følgende program:

#include <stdio.h>
#include <stdlib.h>
#include <cblas.h> 
int stuff ( ) {
   enum CBLAS_ORDER order;
   enum CBLAS_TRANSPOSE transa;

   double *a, *x, *y;
   double alpha, beta;
   int m, n, lda, incx, incy, i;

   order = CblasColMajor;
   transa = CblasNoTrans;

   m = 4; /* Size of Column ( the number of rows ) */
   n = 4; /* Size of Row ( the number of columns ) */
   lda = 4; /* Leading dimension of 5 * 4 matrix is 5 */
   incx = 1;
   incy = 1;
   alpha = 1;
   beta = 0;

   a = (double *)malloc(sizeof(double)*m*n);
   x = (double *)malloc(sizeof(double)*n);
   y = (double *)malloc(sizeof(double)*n);
   /* The elements of the first column */
   a[0] = 1;
   a[1] = 2;
   a[2] = 3;
   a[3] = 4;
   /* The elements of the second column */
   a[m] = 1;
   a[m+1] = 1;
   a[m+2] = 1;
   a[m+3] = 1;
   /* The elements of the third column */
   a[m*2] = 3;
   a[m*2+1] = 4; 
   a[m*2+2] = 5;
   a[m*2+3] = 6;
   /* The elements of the fourth column */
   a[m*3] = 5;
   a[m*3+1] = 6;
   a[m*3+2] = 7;
   a[m*3+3] = 8;
   /* The elemetns of x and y */
   x[0] = 1;
   x[1] = 2;
   x[2] = 1;
   x[3] = 1;
   y[0] = 0;
   y[1] = 0;
   y[2] = 0;
   y[3] = 0;
  
   // Denne er den eneste der betyder noget. Alt andet end "undefined refence to" fejl
   // er meget interesante!
   cblas_dgemv( order, transa, m, n, alpha, a, lda, x, incx, beta, y, incy );
   /* Print y */
   for( i = 0; i < n; i++ )
      printf(" y%d = %f\n", i, y[i]);
   free(a);
   free(x);
   free(y);
   return 1;
}

Filen kan kompileres med følgende kommando:

gcc filnavn.cpp -L/usr/lib64 -L/usr/lib64/atlas -lstdc++ -lm -lcblas -lblas -latlas -o output

Jeg vil mene at følgende er tilstrækkeligt for YUM

sudo yum install gcc blas blas-devel atlas atlas-devel

Husk at installerede pakker kan fjernes igen hvis man ikke ønsker dem længere med

sudo yum history
sudo yum history undo NR_SOM_OVERSTÅENDE_KOMMANDO_GAV

Det underlige ved fejlen er at bliver inkluderet og at compileren kender syntaxen for kommandoen - det er som om det er implementationen af funktionerne der ikke kan findes, men de skulle da gerne følge med blas-devel osv.
Jeg har sakset overstående kode fra en pålidelig kilde, så det er ikke syntax fejl og lignende. Min compiler kan ikke finde implementationen af cblas_dgemv funktionen.

Er der nogen der har mod på at tage et kig? Eventuelt folk med openSUSE, jeg ved ikke om det måske er rpm pakkerne der giver problemer.


Looop
Looop's picture
Antal: 1063
Tilmeldt:
30-10-2008
User is offline
Når jeg prøver at

Når jeg prøver at kompilere på Fedora, får jeg for det først af vide at der ikk er en udbyder af atlas
og en komipleringsfejl:
gcc: error trying exec 'cclplus': execvp: No such file or directory


frugtoase
Antal: 114
Tilmeldt:
26-07-2005
User is offline
#0 #1 Er pakken gcc-c++

#0 #1 Er pakken gcc-c++ installeret?


Looop
Looop's picture
Antal: 1063
Tilmeldt:
30-10-2008
User is offline
#2 på mit Fedora ja

#2 på mit Fedora ja


trafikselskabet
trafikselskabet's picture
Antal: 137
Tilmeldt:
16-07-2006
User is offline
gcc-c++

hmmm... underligt. Har du prøvet med
yum install gcc-c++
?


Looop
Looop's picture
Antal: 1063
Tilmeldt:
30-10-2008
User is offline
#4 Ja! jeg koder selv C og

#4 Ja! jeg koder selv C og C++ hver dag :) så den er installeret


trafikselskabet
trafikselskabet's picture
Antal: 137
Tilmeldt:
16-07-2006
User is offline
Atlas skulle gerne være

Atlas skulle gerne være tilgængeligt fra YUM fra update repo. Din kompilerings fejl er jeg fuldstændig blank over :/

Hjælper det hvis du omdøber stuff() funktionen til main () ?


mrbrown79
Antal: 470
Tilmeldt:
12-01-2010
User is offline
Er der en med Fedora der

#0: Er der en med Fedora der kan prøve at compilere følgende program

På Fedora 18...

$ gcc filnavn.cpp -L/usr/lib64 -L/usr/lib64/atlas -lstdc++ -lm -lcblas -lblas -latlas -o output
/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
/tmp/cc4ZHApM.o: In function `stuff()':
filnavn.cpp:(.text+0x390): undefined reference to `cblas_dgemv(CBLAS_ORDER, CBLAS_TRANSPOSE, int, int, double, double const*, int, double const*, int, double, double*, int)'
collect2: error: ld returned 1 exit status


trafikselskabet
trafikselskabet's picture
Antal: 137
Tilmeldt:
16-07-2006
User is offline
Mr Brown

Det er min fejl. Omdøb stuff() funktionen til main(). Dvs. skift linje 4 fra

int stuff ( ) {

til

int main() {

Jeg sætter stor pris på Jeres indsats :)


trafikselskabet
trafikselskabet's picture
Antal: 137
Tilmeldt:
16-07-2006
User is offline
Hov

Hov, undskyld. Det var bare en af fejlene. Du får helt samme fejl som jeg.

undefined reference to `cblas_dgemv(CBLAS_ORDER, CBLAS_TRANSPOSE, int, int, double, double const*, int, double const*, int, double, double*, int)'

Verdammt!


zity
zity's picture
Antal: 89
Tilmeldt:
11-01-2004
User is offline
Det ser ud til at linkeren

Det ser ud til at linkeren ikke kan få fat i det rigtige bibliotek. Prøv evt. at bruge -lsatlas i stedet for -latlas

Noget helt andet er, at hvis du vil have en god ydelse så SKAL du selv kompilere atlas, så biblioteket bliver optimeret til den computer det kører på.

EDIT: Alternativt kan du prøve at linke den op mod GSL ved at bruge -lgslcblas. Du skal muligvis også bruge

#include <gsl/gsl_cblas.h>

i kildekoden i stedet.


pawsen
Antal: 71
Tilmeldt:
22-10-2011
User is offline
Openblas

I stedet for at kompilere Atlas selv, anbefaler jeg du skifter til Openblas. Openblas er hurtigere, meget nemmere at kompilere og understøtter mpi "out of the box".

Openblas