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
#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.
- Log in to post comments
Kommentarer11
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
#0 #1 Er pakken gcc-c++
#0 #1 Er pakken gcc-c++ installeret?
#2 på mit Fedora ja
#2 på mit Fedora ja
gcc-c++
hmmm... underligt. Har du prøvet med
yum install gcc-c++
?
#4 Ja! jeg koder selv C og
#4 Ja! jeg koder selv C og C++ hver dag :) så den er installeret
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 () ?
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
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 :)
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!
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
i kildekoden i stedet.
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