Ich versuche, BLAS in meinem c-Programm zu verwenden, um die Geschwindigkeit eines Matrix-/Vektorprodukts zu verbessern.Blas dgemv langsamer als manuelle Implementierung
manuell hatte ich diesen Code:
for (j = 0; j < ann->hidden; ++j) {
double delta = 0;
//h is known before
for (k = 0; k < (h == ann->hidden_layers-1 ? ann->outputs : ann->hidden); ++k) {
const double forward_delta = dd[k];
const int windex = k * (ann->hidden + 1) + (j + 1);
const double forward_weight = ww[windex];
delta += forward_delta * forward_weight;
}
*d = *o * (1.0-*o) * delta;
++d; ++o;
}
}
Also habe ich versucht, durch die blas Funktion cblas_dgemv diese doppelte zu ersetzen und es, wie es aussieht:
int n = h == ann->hidden_layers-1 ? ann->outputs : ann->hidden ;
int m = ann->hidden ;
double *delta = calloc(m,sizeof(double));
cblas_dgemv(CblasColMajor,CblasNoTrans,m,n,1,&ww[1],m,dd,1,0.0,delta,1);
for(j=0 ; j < ann->hidden; ++j) {
*d = *o * (1.0-*o)*delta[j];
++d; ++o;
}
free(delta);
}
Der Wert Ausgang gut ist.
Das Problem ist, dass meine Implementierung mit BLAS ist viel langsamer als die „manuelle“ ein ...
Ich weiß nicht, ob es ist, weil ich die am besten optimierte Funktion für diese Berechnung verwenden nicht oder haben Ich mache etwas falsch ?
Fragen zum Arbeitscode passen wahrscheinlich besser zur Code Review. –
Was ist Code-Review? –
https://codereview.stackexchange.com/ –