2017-10-25 17 views
1

매트릭스/벡터 제품의 속도를 향상시키기 위해 BLAS를 사용하려고합니다. 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

좋아, 요점은 내 blas 구현이 큰 행렬에 대해서는 빠르지 만 blas의 오버 헤드로 인해 작은 행렬에 대한 속도가 느려진다는 점입니다!