我正在用ARMv8机器对一个库进行基准测试。我有四个Cortex-A53开发板,我们的霓虹灯本质实现比C/C++实现高出大约30%。这是意料之中的。
GCC编译农场提供一个软驱1000。它是一个Cortex-A57服务器板,C/C++代码的性能比本质实现高出50%。这太令人惊讶了。
我们想使用我们的霓虹灯实现的A-53,但使用C/C++实现的A57。我们有可以选择运行时特性的代码,如HasNEON()、HasCRC()、HasAES()和HasSHA()。我们没有任何关于体系结构的东西,比如A53和A57。
我的问题是,如何在运行时检测A53和A57?
对于x86处理器,我们有类似的代码路径。P4有一些缓慢的word操作。我们通过检查CPUID位来检测P4,但是ARM系统是不同的。ARM系统类似CPUID的指令正在读取MSR,它通常需要更高的权限级别(EL1或更高级别)。
如果感兴趣,对于特定的散列算法,Cortex-A57速度较慢,因为它严重依赖于移位、旋转和xors。A57优化指南告诉我们轮班和旋转更贵。在ASIMD协处理器中,移位需要4或5个周期,只有F1管道才能执行操作(每节3.14)。
它也可能是Cortex-A53有相同的惩罚,它的整数单位是慢的,所以非霓虹灯代码不超过霓虹灯代码。
发布于 2017-01-23 14:52:28
通常,正如您和其他人所指出的,真正的类似cpuid的指令无法从用户模式代码中获得。在实践中,相关信息是以特定平台的方式处理的。
在linux上,如果可用/可读的话,可以尝试解析/proc/cpuinfo。CPU实现者/体系结构/变体/部件号应该很好地识别不同的CPU。这个文件在Android上也应该是可读的。
对于其他OSes来说,操作系统需要在某个地方提供必要的信息,而且并不是所有的操作系统都能做到。
编辑:我看过的一个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。例如,Snap巨龙810有4个Cortex-A53核和4个Cortex-A57核.您的线程将在内核调度器认为合适的情况下被调度和移动到这些核心上。在这种情况下,您在启动时获得的基准数可能与代码稍后计划的核心不匹配。
发布于 2017-01-23 02:07:52
拥有一个在进程初始化期间调用的tune()函数,该函数对您的实现和GCC的实现进行基准测试,并缓存结果(例如,在一个bool isMyImplementationFaster全局变量中)。
如果您的实现更快,您可以假设它是一个A53 (如果它比较慢,您可以假设它是一个A57)。请注意,这会对既不是A53也不是A57的CPU(包括未来的CPU)造成问题/混淆。但是,我希望您会意识到,您实际上并不关心它是A53还是A57 (或其他什么东西),并且只关心您的实现是否更快/更慢。
https://stackoverflow.com/questions/41785933
复制相似问题