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:
Filen kan kompileres med følgende kommando:
Jeg vil mene at følgende er tilstrækkeligt for YUM
Husk at installerede pakker kan fjernes igen hvis man ikke ønsker dem længere med
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.
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
#include
#include
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.
Kommentarer11
Når jeg prøver at
og en komipleringsfejl:
gcc: error trying exec 'cclplus': execvp: No such file or directory
#0 #1 Er pakken gcc-c++
#2 på mit Fedora ja
gcc-c++
yum install gcc-c++
?
#4 Ja! jeg koder selv C og
Atlas skulle gerne være
Hjælper det hvis du omdøber stuff() funktionen til main () ?
Er der en med Fedora der
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
Mr Brown
int stuff ( ) {
til
int main() {
Jeg sætter stor pris på Jeres indsats :)
Hov
undefined reference to `cblas_dgemv(CBLAS_ORDER, CBLAS_TRANSPOSE, int, int, double, double const*, int, double const*, int, double, double*, int)'
Verdammt!
Det ser ud til at linkeren
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
i kildekoden i stedet.
Openblas
Openblas