繁体   English   中英

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

[英]Detect ARMv8 A53 vs A57 architecture at runtime?

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

GCC编译场提供了Softiron Overdrive1000。其Cortex-A57服务器主板和C / C ++代码比内部实现的性能高出50%。 这真令人惊讶。

我们想将NEON实现用于A-53,但将C / C ++实现用于A57。 我们有可以选择运行时功能的代码,例如HasNEON()HasCRC()HasAES()HasSHA() 我们没有用于架构的任何东西,例如A53 vs A57。

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


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


如果感兴趣,Cortex-A57对于特定的哈希算法会比较慢,因为它严重依赖于移位,旋转和异或。 A57优化指南》告诉我们,轮换和旋转比较昂贵。 在ASIMD协处理器中,移位需要4或5个周期,并且只有F1管道可以执行操作(请参见第3.14节)。

也可能是Cortex-A53具有相同的代价,并且其整数单位较慢,因此非NEON代码不会胜过NEON代码。

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

如果您的执行速度更快,则可以假定它是A53(如果执行速度较慢,则可以假定它是A57)。 请注意,这会导致既不是A53也不是A57的CPU(包括将来的CPU)出现问题/混乱。 然而; 我希望您会意识到,您实际上并不关心它是A53还是A57(或其他东西),而您只关心实现速度是快还是慢。

通常,正如您和其他人所指出的那样,用户模式代码中没有真正的类似于cpuid的指令。 实际上,相关信息是以平台特定的方式处理的。

在Linux上,您可以尝试解析/ proc / cpuinfo(如果可用/可读)。 CPU实现者/体系结构/变体/部件号应该很好地标识不同的CPU。 此文件应该在Android上也可以读取IIRC。

对于其他操作系统,该操作系统将需要在某处提供必要的信息,而并不是所有的操作系​​统都可以提供。

编辑:我看过的Cortex-A53在/proc/cpuinfo得到以下信息:

CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03

尽管Cortex-A57具有以下优点:

CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x1
CPU part        : 0xd07

但是,正如Brendan指出的那样,随着不同核心的数量不断增长,尝试匹配这些目标是徒劳的。

此外,某些SoC具有一组异构内核,请参阅big.LITTLE 例如,Snapdragon 810有4个Cortex-A53内核和4个Cortex-A57内核。 当内核的调度程序认为合适时,将对线程进行调度并在这些内核之间移动。 在这种情况下,您在启动时获得的基准编号可能与代码最终安排在以后的内核不匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM