【发布时间】:2017-08-15 18:34:57
【问题描述】:
我看到 ARMv8 只是 ARMv7 架构的扩展,所有在 ARMv7 上编译的代码都应该在 ARMv8 上运行。我对 ARMv8 到 ARMv7 的向后兼容性感兴趣。在 ARMv8 上编译的代码会在 ARMv7 上运行吗?
我有一个特别感兴趣的案例:我想在Nvidia Jetson TK1(NVIDIA Cortex-A15 CPU)上运行为OnePlus 3 smartphone(Qualcomm MSM8996 Snapdragon 820 CPU)编译的comma.ai's Openpilot visiond binary。有远见的人会在 Jetson 上运行吗?
编辑:可能存在比 CPU 兼容性更多的问题,因为 Visiond 可能在该手机上大量使用 GPU。可能取决于他们是使用一些标准的并行化方式(OpenCL、NEON 等)还是有一些针对 Snapdragons GPU 的自定义代码。即使使用 OpenCL,在不同硬件上兼容的机会也可能很低。
【问题讨论】:
-
如果您的二进制文件是为 ARMv8 编译的,它将无法在 ARMv7 上运行。寄存器模型和指令集发生了变化。 ARMv8 处理器可以运行 ARMv7 代码,但需要专门在 ARMv7 模式下运行。您不能混合使用这两种类型的代码。
-
@BitBank ARMv8 不代表 AArch64。 ARMv8 AArch32 确实添加了新指令,但没有添加新的应用程序级状态,甚至没有添加新的 ABI。针对 AArch64 的程序(仅在 ARMv8 中可用)不会在 ARMv7 实现上本地运行;使用新的 ARMv8 AArch32 指令的程序也不会在 ARMv7 实现上本地运行。也可能有一个不支持 AArch32 的 ARMv8 AArch64 实现,这样的 ARMv8 实现将无法原生运行 AArch32 代码。
-
ARMv8 和 ARMv7 是完全不兼容的指令集。许多/大多数 ARMv8 内核具有 ARMv7 兼容模式(如文档所述,有些没有但不知道我是否见过其中的任何一个)。因此,您声明在 armv7 上编译的所有代码都可以在 aarch32 模式下很好地在 armv8 上运行,但那是 armv7 模式而不是 armv8 模式。 armv8 aarch64 不会在 armv7 上运行,不会。至于在两个不同处理器之间运行的 armv7 代码,请查看 raspberry pi 以获得答案。是的...
-
您可以构建一个 armv7 项目并在 armv7 处理器和 armv8 上以 aarch32(armv7 兼容)模式运行它。
-
99% 的可移植性问题与指令集无关,但指令集是否匹配并不重要。正如您的编辑所示,您可能开始理解了。
标签: arm cpu-architecture backwards-compatibility binary-compatibility armv8