我已经编写了几个复制函数来寻找 PowerPC 上的良好内存策略。将 Altivec 或 fp 寄存器与高速缓存提示 (dcb*) 结合使用,可将大数据的简单字节复制循环的性能提高一倍。最初对此感到满意,我扔了一个普通的 memcpy 来看看它的比较……比我最好的快 10 倍!我无意重写 memcpy,但我确实希望从中学习并加速几个简单的图像过滤器,这些过滤器大部分时间都在将像素移入和移出内存。
Shark 分析表明,它们的内部循环使用 dcbt 进行预取,先读取 4 次向量,然后写入 4 次向量。在将我最好的函数调整为每次迭代也可以传输 64 个字节之后,memcpy 的性能优势仍然令人尴尬。我正在使用 dcbz 来释放带宽,Apple 什么都不使用,但是这两种代码在商店中往往会犹豫不决。
预取 未来 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 版本已经非常快了。