c - Blas dgemv 比手动执行慢

标签 c blas openblas cblas

我正在尝试在我的 C 程序中使用 BLAS 来提高矩阵/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 的实现比“手动”的慢得多......

我不知道是不是因为我没有为这个计算使用最优化的函数,还是我做错了什么?

最佳答案

好吧,关键是我的 blas 实现对于大矩阵来说更快,但是 blas 的开销会减慢小矩阵的速度!

关于c - Blas dgemv 比手动执行慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46928891/

相关文章:

c - C中列表的所有元素的总和

c - 需要帮助理解 while ((status = SOME_STATUS == FunctionName(params)))

fortran - 是否有用于计算 Cholesky 因子更新的 BLAS/LAPACK 函数?

python - 将 ATLAS/MKL 链接到已安装的 Numpy

c++ - OpenBlas 和 g++

c - 如何判断字符串是否为 Lapindrome?

c - 在 C 中标记字符串

python - 使用 atlas 和 openblas 对 numpy 进行基准测试时出现奇怪的结果

ios - GAS 宏内的标签

python - Caffe编译报错: ld: can't map file, errno=22