c - 在运行时检测 ARMv8 A53 与 A57 架构?

标签 c cpu-architecture arm64

我正在针对 ARMv8 机器对库进行基准测试。我有四个 Cortex-A53 开发板,我们的 NEON 内在函数实现比 C/C++ 实现性能高出约 30%。这是预期的结果。

GCC 编译场提供 Softiron Overdrive 1000。它是 Cortex-A57 服务器主板,C/C++ 代码的性能比内在函数实现高出 50%。这太令人惊讶了。

我们希望对 A-53 使用 NEON 实现,但对 A57 使用 C/C++ 实现。我们有可以进行运行时功能选择的代码,例如 HasNEON()HasCRC()HasAES()HasSHA() 。我们没有任何关于架构的信息,例如 A53 与 A57。

我的问题是,我们如何在运行时检测 A53 与 A57?


我们为 P4 处理器的 x86 代码路径提供了类似的代码。 P4 的字操作有些慢。我们通过检查CPUID位来检测P4,但ARM系统不同。 ARM系统中类似CPUID的指令是读取MSR,它通常需要更高的权限级别(EL1或以上)。


如果有兴趣,Cortex-A57 对于特定的哈希算法来说速度较慢,因为它严重依赖于移位、旋转和异或。 A57 Optimization guide告诉我们轮类和轮换的成本更高。 ASIMD 协处理器需要 4 或 5 个周期才能进行移位,并且只有 F1 管道可以执行该操作(参见第 3.14 节)。

Cortex-A53 也可能具有相同的惩罚,并且其整数单元速度较慢,因此非 NEON 代码的性能不会优于 NEON 代码。

最佳答案

有一个在进程初始化期间调用的 tune() 函数,用于对您的实现和 GCC 的实现进行基准测试并缓存结果(例如,在 bool isMyImplementationFaster 全局变量中)。

如果您的实现速度更快,您可以假设它是 A53(如果它较慢,您可以假设它是 A57)。请注意,这会导致既不是 A53 也不是 A57 的 CPU(包括 future 的 CPU)出现问题/困惑。然而;我希望您会意识到您实际上并不关心它是 A53 还是 A57(或其他),而您只关心您的实现是否更快/更慢。

关于c - 在运行时检测 ARMv8 A53 与 A57 架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41785933/

相关文章:

有人能解释一下这个简单的 C 字符比较函数是如何工作的吗?

c++ - 快速信息集或 .net 二进制压缩开源库

c++ - 我如何使用 LDA 对信号进行分类

performance - 在 Ivy Bridge 上存储 32 字节对象?

performance - FP 和整数除法是否在 x86 CPU 上竞争相同的吞吐量资源?

linux - 如何编译 baremetal hello_world.c 并在 qemu-system-aarch64 上运行?

ios - Clang + iOS + 汇编器跳转 : error "unsupported relocation on symbol"

c - 递归/链表

c - malloc 可以分配的最大内存

assembly - 在ARM64汇编代码中,何时将31 XZR与SP相对?