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.
30-10-2008
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
26-07-2005
#0 #1 Er pakken gcc-c++ installeret?
30-10-2008
#2 på mit Fedora ja
16-07-2006
hmmm... underligt. Har du prøvet med
yum install gcc-c++
?
30-10-2008
#4 Ja! jeg koder selv C og C++ hver dag :) så den er installeret
16-07-2006
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 () ?
12-01-2010
#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
16-07-2006
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 :)
16-07-2006
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!
11-01-2004
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.
22-10-2011
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