2017-10-25 15 views
1

私はBLASをC言語のプログラムで使用して、行列/ベクトル積の速度を向上させようとしています。blas dgemvが手動実装より遅い

は手動で私はこのコードを持っていた:

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; 
    } 
} 

だから私は、BLAS関数cblas_dgemvによって、この二重を交換しようとしましたが、それはそれのように見える:

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); 
    } 

出力値をいいます。

問題は、私は、この計算のために最も最適化された機能を使用するか、やっていないので、それはだ場合、私は知らない

... BLASと私の実装では、「手動」よりも道も遅いということです私は何か間違っている?

+0

作業用コードに関する質問は、おそらくコードレビューに適しています。 –

+0

コードレビューとは? –

+0

https://codereview.stackexchange.com/ –

答えて

1

[OK]をポイントすると、私のblasの実装は大きな行列の方が高速ですが、blasのオーバーヘッドは小さな行列のものを減速させます。

関連する問題