我为了寻找一种好的PowerPC内存策略,编写了几个复制函数。使用Altivec或带有缓存提示(dcb*)的fp寄存器,对于大数据,与简单的字节复制循环相比,性能提高了一倍。最初对此感到满意,于是我加入了一个常规的memcpy来进行比较……它比我最好的快了10倍!我没有重写memcpy的意图,但我希望从中学习,并加速一些简单的图像滤镜,这些滤镜大部分时间都在将像素从内存中移动进出。
Shark分析显示,它们的内部循环使用dcbt预取,每次有4个矢量读取和4个矢量写入。在将我的最佳函数调整为每次传输64字节后,memcpy的性能优势仍然令人尴尬。我正在使用dcbz来释放带宽,而Apple则什么也不用,但两个代码都倾向于在存储上犹豫。
预取 dcbt future dcbt distant future 加载东西 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版本已经快得惊人了。