c语言的卷积函数,C语言中的快速二维卷积

我正在尝试用Python实现一个卷积神经网络。最初,我用的是化学信号的卷积2d函数来完成卷积,但是它有很多开销,而且如果只在C语言中实现自己的算法并从python调用它会更快,因为我知道我的输入是什么样子的。在

我实现了两个功能:具有不可分核矩阵的卷积

用可分离的内核对矩阵进行卷积(现在我假设python在将其传递给C之前进行秩检查和拆分)

这两个函数都没有填充,因为我需要降维。在

不可分离二维卷积// a - 2D matrix (as a 1D array), w - kernel

double* conv2(double* a, double* w, double* result)

{

register double acc;

register int i;

register int j;

register int k1, k2;

register int l1, l2;

register int t1, t2;

for(i = 0; i < RESULT_DIM; i++)

{

t1 = i * RESULT_DIM; // loop invariants

for(j = 0; j < RESULT_DIM; j++)

{

acc = 0.0;

for(k1 = FILTER_DIM - 1, k2 = 0; k1 >= 0; k1--, k2++)

{

t2 = k1 * FILTER_DIM; // loop invariants

for(l1 = FILTER_DIM - 1, l2 = 0; l1 >= 0; l1--, l2++)

{

acc += w[t2 + l1] * a[(i + k2) * IMG_DIM + (j + l2)];

}

}

result[t1 + j] = acc;

}

}

return result;

}

可分离二维卷积

^{pr2}$

使用gcc的-O3标志编译并在2.7GHz Intel i7上测试,使用4000x4000矩阵和5x5内核,我分别得到(平均值为5):271.21900 ms

127.32000 ms

这比化学信号的卷积2d,对于相同的操作大约需要2秒,但是我需要更高的速度,因为我将调用这个函数上千次。将数据类型更改为float目前不是一个选项,尽管这会导致相当大的加速。在

有没有办法可以进一步优化这些算法?我可以应用任何缓存技巧或例程来加速它吗?在

如有任何建议,我们将不胜感激。在

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值