Blas dgemv 比手动执行慢
Blas dgemv slower than manual implementation
我正在尝试在我的 c 程序中使用 BLAS 来提高 matrix/vector 产品的速度。
手动我有这个代码:
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 替换这个 double for,它看起来像 :
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 的实现比 "manual" 慢得多...
不知道是不是我没有使用最优化的函数来计算,还是我做错了什么?
好的,关键是我的 blas 实现对于大矩阵来说更快,但是 blas 的开销会减慢小矩阵的速度!
我正在尝试在我的 c 程序中使用 BLAS 来提高 matrix/vector 产品的速度。
手动我有这个代码:
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 替换这个 double for,它看起来像 :
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 的实现比 "manual" 慢得多...
不知道是不是我没有使用最优化的函数来计算,还是我做错了什么?
好的,关键是我的 blas 实现对于大矩阵来说更快,但是 blas 的开销会减慢小矩阵的速度!