2017-10-25 2 views
1

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 ?

+0

Fragen zum Arbeitscode passen wahrscheinlich besser zur Code Review. –

+0

Was ist Code-Review? –

+0

https://codereview.stackexchange.com/ –

Antwort

1

Ok der Punkt ist, dass meine Blas Implementierung schneller ist für große Matrix, aber der Overhead von Blas verlangsamen die Dinge für kleine Matrix!

Verwandte Themen