gpt4 book ai didi

c - 检测 objective-c PU 上的对齐内存要求

转载 作者:太空狗 更新时间:2023-10-29 15:53:06 24 4
gpt4 key购买 nike

我目前正在尝试构建一个应该可以在各种机器上运行的代码,从手持式口袋和传感器到数据中心的大型服务器。

这些架构之间的(许多)差异之一是对齐内存访问的要求。

“标准”x86 CPU 不需要对齐内存访问,但许多其他 CPU 需要它并在不遵守规则时产生异常。

到目前为止,我一直在通过使用 packed 属性(或 pragma)强制编译器对已知有风险的特定数据访问保持谨慎来处理它。而且效果很好。

问题是,编译器非常谨慎,以至于在此过程中损失了很多性能。

由于性能很重要,我们最好重写部分代码以专门在严格对齐的 cpu 上工作。另一方面,这样的代码在支持未对齐内存访问的 cpus 上会更慢(例如 x86),因此我们希望在需要严格对齐内存访问的 cpus 上使用它。 p>

现在的问题是:如何在编译时检测到目标架构需要严格对齐的内存访问? (或者反过来)

最佳答案

据我所知,没有任何 C 实现提供任何预处理器宏来帮助您解决这个问题。由于您的代码据说可以在各种机器上运行,因此我假设您可以访问各种机器进行测试,因此您可以通过测试程序找出答案。然后你可以编写自己的宏,如下所示:

#if defined(__sparc__)
/* Unaligned access will crash your app on a SPARC */
#define ALIGN_ACCESS 1
#elif defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC)
/* Unaligned access is too slow on a PowerPC (maybe?) */
#define ALIGN_ACCESS 1
#elif defined(__i386__) || defined(__x86_64__) || \
defined(_M_IX86) || defined(_M_X64)
/* x86 / x64 are fairly forgiving */
#define ALIGN_ACCESS 0
#else
#warning "Unsupported architecture"
#define ALIGN_ACCESS 1
#endif

请注意,未对齐访问的速度将取决于它跨越的边界。例如,如果访问跨越 4k 页面边界,它会慢得多,并且可能有其他边界导致它更慢。即使在 x86 上,一些未对齐的访问也不由处理器处理,而是由操作系统内核处理。那是难以置信的慢。

也不能保证 future (或当前)的实现不会突然改变未对齐访问的性能特征。这在过去发生过,将来也可能发生; PowerPC 601 非常容忍未对齐的访问,但 PowerPC 603e 则不然。

使事情更加复杂的是,您为进行未对齐访问而编写的代码在跨平台实现方面会有所不同。例如,在 PowerPC 上它被 x << 32 简化了。和 x >> 32如果 x 始终为 0是 32 位,但在 x86 上你就没有这样的运气了。

关于c - 检测 objective-c PU 上的对齐内存要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9336764/

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