我已经写了几个复制函数,以在PowerPC上寻找良好的存储策略。将Altivec或fp寄存器与缓存提示(dcb *)配合使用,可在大数据的简单字节复制循环中将性能提高一倍。最初对此感到满意,我定期进行了一次memcpy比赛,看看它的性能如何……比我最好的快10倍!我无意重写memcpy,但我确实希望从中学习并加速几个简单的图像滤镜,这些滤镜会花费大部分时间将像素移入和移出内存。

Shark分析显示,它们的内部循环使用dcbt进行预取,先读取4个向量,然后再写入4个向量。在调整了我的最佳功能以使每次迭代也可以拖出64个字节之后,memcpy的性能优势仍然令人尴尬。我正在使用dcbz释放带宽,Apple没有使用任何东西,但是两种代码在商店上都犹豫不决。

预取
DCBT未来
DCBT遥远的未来
装东西
lvx图像
lvx图片+ 16
lvx图片+ 32
lvx图片+ 48
图片+ = 64
准备存放
dcbz过滤
dcbz过滤+ 32
存放东西
stvxl过滤
stvxl过滤+ 16
stvxl过滤+ 32
stvxl过滤+ 48
已过滤+ = 64
重复


有谁对为什么非常相似的代码会有如此巨大的性能差距有任何想法?我很乐意在memcpy使用的任何秘密调味酱中腌制真实的图像过滤器!

附加信息:所有数据都是矢量对齐的。我正在制作图像的过滤副本,而不是替换原始副本。该代码在PowerPC G4,G5和Cell PPU上运行。 Cell SPU版本已经非常快了。

最佳答案

Shark分析显示,它们的内部循环使用dcbt进行预取,先读取4个向量,然后再写入4个向量。调整完我的最佳功能后,每次迭代也要拖出64个字节


我可能要说的很明显,但是既然您在问题中根本没有提及以下内容,那么可能值得指出:

我敢打赌,Apple选择4个向量读取,然后选择4个向量写入,与G5's pipeline and its management of out-of-order instruction execution in "dispatch groups"的作用和它神奇的64字节完美行大小的影响一样大。您是否注意到Nick Bastin链接的bcopy.s中的行跳过了?这意味着开发人员考虑了G5如何使用指令流。如果要再现相同的性能,一次读取64个字节的数据是不够的,则必须确保指令组已满(基本上,我记得指令最多可以分为五个独立的组,前四个是非跳转指令,第五个只允许跳转(详细信息更为复杂)。

编辑:您可能也对同一页面上的以下段落感兴趣:


dcbz指令仍按照G4和G3将对齐的32个字节的内存段清零。但是,由于这不是G5上的完整缓存行,因此不会具有您可能希望获得的性能优势。 G5新引入了dcbzl指令,该指令将整个128字节的高速缓存行置零。

关于optimization - 是什么让Apple的PowerPC速度如此之快?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1990343/

10-12 01:28