![]() |
1
22
是的,有更快的方法可以做到这一点。 简单循环的大部分时间用于缓存未命中。这是因为在一个紧密的循环中,您在非常不同的位置接触了大量数据。更糟糕的是:你的记忆位置正好是两个相距的幂。这是缓存性能最差的大小。 如果改进内存访问的局部性,则可以改进此旋转算法。
例如,类似这样的内容(未检查,很抱歉C代码。我的Delphi技能不是最新的):
还有其他方法。您可以按希尔伯特顺序或莫顿顺序处理数据。从理论上讲,这会快一点,但代码会复杂得多。 顺便说一句,既然你提到SSE是你的选择。请注意,您可以在SSE寄存器内旋转8x8字节块。让它工作起来有点棘手,但看看SSE矩阵转置代码应该可以让您开始,因为这是同一件事。
块大小为8x8像素,代码在我的机器上运行速度快约5倍。块大小为16x16时,运行速度快10倍。 用不同的块大小进行实验似乎是个好主意。
|
![]() |
2
3
如果你可以使用C++,那么你可能想看看 Eigen . SSE(2及更高版本)和AltiVec指令集,可优雅地回退到非矢量化代码 .
|
![]() |
3
0
你 可以 |
![]() |
4
0
如果图像不是正方形,则无法在适当的位置执行操作。即使在方形图像中工作,变换也不利于在位工作。 如果你想把事情做得快一点,你可以试着利用行的步幅来让它工作,但我认为最好的办法是从源代码一次读取4个字节,然后在dest中写入四个连续的行。这应该会减少你的一些开销,但我不会期望超过5%的改善。 |
![]() |
Danish Bansal · 如何编辑已注释的图像(矩形边框)? 3 年前 |
![]() |
pete2213 · 从一个图像到另一个图像的梯度转移以增强边缘 3 年前 |
![]() |
Kirito · 如何将焦点设置为图像或标签?[Java Swing] 3 年前 |
![]() |
Claudio Russo · 如何输入detectron2内置模型? 3 年前 |
![]() |
Uzay Ayden · 在做这个项目时,我应该遵循哪些步骤? 3 年前 |