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

时间:2017-01-22 00:05:11

标签: 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对于特定的哈希算法来说速度较慢,因为它在很大程度上依赖于shift,rotate和xors。 A57 Optimization guide告诉我们轮班和轮换费用更高。在ASIMD协处理器中需要4或5个循环进行换档,只有F1管道可以执行操作(按照3.14节)。

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

2 个答案:

答案 0 :(得分:3)

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

如果您的实施速度更快,您可以认为它是A53(如果速度慢,您可以认为它是A57)。请注意,这会导致既不是A53也不是A57的CPU(包括未来的CPU)出现问题/混淆。然而;我希望您能够意识到,如果它是A53或A57(或其他东西),您实际上并不关心,并且只关心您的实施是否更快/更慢。<\ n / p>

答案 1 :(得分:1)

一般情况下,正如您和其他人所指出的那样,用户模式代码无法获得真正类似cpuid的指令。在实践中,相关信息以特定于平台的方式处理。

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

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

编辑: 我查看的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

然而,正如布兰登指出的那样,试图匹配这些是非常徒劳的,因为不同的个别核心的数量不断增长。

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