将低级别的x86优化代码移植到ARM Cortex-A8架构

9

将C++ x86代码移植到ARM处理器的主要注意事项是什么?

我所知道/听说的一些问题(但我不确定它们是否真的是问题,或者甚至是真实的 - 请验证):

  • SSE->NEON
  • 64位整数变为32位
  • 小端 -> 大端

程序员应该注意哪些其他差异和陷阱?


1
嗨,Cortex-A8架构实际上支持小端和大端,因此取决于您将处理器运行在哪种模式下,将会对x86有所不同。 - LocoDelAssembly
1
ARM架构本身是小端模式,应该以此方式运行。如果代码编写不当,64位到32位的转换可能会成为问题。否则,C++就是C++。但是,如果混合了汇编语言,那么就需要进行移植。 - old_timer
2
ARM EABI是现代ARM编译器使用最普遍的ABI,它采用小端序。ARM CPU可以处理大端序或小端序。 - doron
1个回答

16
任何一个好的编译器都支持在ARM上进行64位数学计算,因此减小变量范围可能是不必要的。但是,ARM本身是32位的,因此如果您不需要完整的范围,则使用32位变量将更快。此外,32位变量比8位和16位变量更快,因此如果您有任何char或short循环计数器,更新为int(或更好的unsigned int)可能值得一试。
字节序通常不是问题-大多数ARM芯片都在little-endian模式下运行,或者可以在big-endian和little-endian之间切换。对齐是一个问题。x86访问未对齐数据时非常宽容。在ARM上,这会产生异常或(在后来的架构上)使代码运行变慢。通常由编译器处理此问题,但如果使用汇编或紧密结构,请注意。
另一个可能会出错的地方是有符号/无符号变量。直到最近,ARM没有快速指令来加载/存储有符号字符,因此传统上,在ARM上char是无符号的。如果您的代码依赖于char的符号性,则可能会遇到一些问题。快速解决方法是使用有符号字符的编译器开关,但在使用库函数时要小心。另外,在旧芯片上,signed char会变慢。

编辑:我刚在 Debian Wiki 上发现了一个很棒的页面。它主要涉及从旧的 ARM ABI 到 EABI 的移植,但提到的许多内容仍适用于 x86->ARM。它还链接到一个关于结构对齐的常见问题解答(虽然对于 ARMv6/v7 不完全正确)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接