【发布时间】:2014-11-20 04:19:17
【问题描述】:
我正在了解如何使用内核可分离性来改进卷积所需的时间。下面是一段代码展示了这一点:
test = randn(3000);
kx = [1 2 3 4 5 6 7 8 9];
ky = kx';
kernel = ky*kx;
tic; b = conv2(test,kernel,'same'); toc;
tic; bx=conv2(test,kx, 'same'); by=conv2(bx,ky, 'same'); toc;
运行上述代码会产生以下结果:
经过的时间是 0.564579 秒。 经过的时间是 0.333260 秒。
可以看出,这不是我期望的理论加速比,应该是 81/18 = 4.5。
谁能解释一下原因?
【问题讨论】:
-
可能是各种各样的东西。这也可能是由于您两次调用该函数的函数开销。请记住,这些是理论上的加速。实际上是另一个故事。此外,该代码是在函数中还是在命令提示符中运行?如果您在命令提示符下运行它,则会有额外的时间开销。
-
还要注意,对于如此少量的处理,这些时间非常长,因此这些时间可能被卷积本身以外的操作所淹没。尝试将内核应用于大小合适的 2D 数据集,例如1024x1024。
-
比较一下,当我运行这两行代码时,我分别得到了
0.072947和0.067429秒。我可能进行了 10 次不同的测试,而我的时间则徘徊在这些时间之间。我把它放到一个函数脚本中并运行它......所以我没有看到任何明显的区别。也许conv2在提供 2D 内核时会考虑可分离性,并在可能的情况下将其拆分为 2 个 1D 内核。 -
也试试
tic; by=conv2(kx, ky, test, 'same'); toc -
@user1816546 - 将您的代码放在函数脚本中并运行它。直接在命令提示符下执行此操作会产生额外的开销。
标签: performance matlab convolution