gpt4 book ai didi

optimization - 是什么让 Apple 的 PowerPC memcpy 如此之快?

转载 作者:行者123 更新时间:2023-12-03 14:19:28 29 4
gpt4 key购买 nike

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

Shark 分析表明,它们的内部循环使用 dcbt 进行预取,先读取 4 次向量,然后写入 4 次向量。在将我最好的函数调整为每次迭代也可以传输 64 个字节之后,memcpy 的性能优势仍然令人尴尬。我正在使用 dcbz 来释放带宽,Apple 什么都不使用,但是这两种代码在商店中往往会犹豫不决。

预取
future
dcbt 遥远的 future
加载东西
lvx 图片
lvx 图片 + 16
lvx 图片 + 32
lvx 图片 + 48
图片 += 64
准备储存
dcbz 过滤
dcbz 过滤 + 32
存储东西
stvxl 过滤
stvxl 过滤 + 16
stvxl 过滤 + 32
stvxl 过滤 + 48
过滤 += 64
重复

有没有人对为什么非常相似的代码有如此巨大的性能差距有一些想法?我很想在 memcpy 使用的任何 secret 酱汁中腌制真实的图像过滤器!

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

最佳答案

Shark analysis reveals that their inner loop uses dcbt to prefetch, with 4 vector reads, then 4 vector writes. After tweaking my best function to also haul 64 bytes per iteration



我可能会说显而易见的,但是由于您在问题中根本没有提到以下内容,因此可能值得指出:

我敢打赌,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 个字节的数据是不够的,你必须确保你的指令组被很好地填充(基本上,我记得指令最多可以由五个独立的分组,与前四个是非跳转指令,第五个只允许跳转,细节比较复杂)。

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

The dcbz instruction still zeros aligned 32 byte segments of memory as per the G4 and G3. However, since that is not a full cacheline on a G5 it will not have the performance benefits that you were likely hoping for. There is a dcbzl instruction newly introduced for the G5 that zeros a full 128-byte cacheline.

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com