【问题标题】:Detect ARM-64 in preprocessor?在预处理器中检测 ARM-64?
【发布时间】:2016-09-11 16:03:58
【问题描述】:

根据微软(herehere)的说法,该公司将在即将推出的 Windows 10 版本中支持 ARMv8/Aarch64(ARM-64)。此外,微软有already supplied previews,所以我猜工具支持是到位。

对于那些不知道的人,images provided with the article 清楚地显示了 Qualcomm Snapdragon 410。那是 A-53 内核及其 Aarch64/ARM-64。

Microsoft 为 ARM-32 定义了_M_ARM,我们目前使用它来检测 NEON 的可用性。 ARMv8 支持可选扩展 CRC32、AES、SHA-1 和 SHA-2。我们已经为 Apple 和 Linux 编写了代码,我们希望在 Microsoft 平台上启用它。

微软也有__M_ARM_FP,但不清楚用它来检测ARM64。我也不清楚 x86 的相关性:

扩展为一个整数文字值,指示哪个 /arch 编译器 使用了选项:

  • 如果未指定 /arch ARM 选项,则在 30-39 范围内,表示使用了 ARM 的默认架构 (VFPv3)。
  • 如果使用 /arch:VFPv4,则在 40-49 范围内。
  • 有关详细信息,请参阅 /arch (x86)。

我对可用的 Microsoft 编译器进行了一些快速测试(所有这些编译器都可以追溯到 VC++ 5.0)。他们未能使用 ARMv8 内在函数,这并不奇怪。我猜我需要 MSDN 订阅才能使用最新工具进行测试,但我不再订阅了。

我的问题是:

  • 我们如何在预处理器中检测 ARMv8/Aarch64 (_M_ARM64?)
  • 什么版本的编译器 (_MSC_VER) 支持 ARMv8 指令

这可能是相关的:What is WINAPI_FAMILY_ONECORE_APP?

【问题讨论】:

  • Intrinsics 是编译器实现细节,与 SDK 无关。使用这样的旧编译器无法让您获得任何好处,VS 版本 15(不是 VS2015)现在也处于预览状态。预计 alpha 版本会出现问题,向 connect.microsoft.com 报告错误和缺少的功能,而不是 SO。或者只是等到它完成。
  • @HansPassant - 我不确定你在说什么关于报告错误???这是一个简单的问题:微软正在支持 ARM64,那么我们如何检测它呢?对于 Stack Overflow 来说,这是一个完美的问题。
  • 这些链接中都没有提到 ARM64,都说“ARM”和最大 4GB RAM(用于移动设备),“工业”物联网版本不支持 ARM。
  • @BenVoigt - ARMv8 是 AArch64。它还提供了一个 AArch32 执行环境,这很像 Linux 多架构和 Windows on Windows (WoW64)。
  • @jww 是的,ARM32 版本的 Windows IoT 在 ARM64 硬件(包括 RPi3)上运行良好。但这一点不像WOW64,它更像x86_64 CPU模式。 WOW64 允许应用程序和操作系统之间的不匹配,但我们正在谈论的是操作系统和 CPU 之间的不匹配。

标签: visual-studio macros arm 64-bit c-preprocessor


【解决方案1】:

VS从VS2017开始使用_M_ARM64,详情见下文。

答案,以相反的顺序:

  • 当前发布的 Visual Studio 版本均不支持 ARMv8/AArch64,它们仅支持 ARMv7。尽管 Windows 10 本身显示出支持 arm64 的迹象(有一些针对 arm64 的可执行文件和库),但据我所知,迄今为止发布的编译器版本都没有真正包含它。 (Visual Studio 2015 Community 至少不包含它,几天前发布的新的 Visual Studio “15” Preview 2 也不包含它。)很明显它存在于内部,但它还没有成为任何组件的一部分尚未公开发布。

  • 至于要查找什么定义;这是目前未知的,因为尚未发布编译器的 arm64 目标版本,因此没有公开文档,也无法进行经验测试。

我在您的任何一个链接中都没有看到 Microsoft 有任何明确声明说它将受到支持,但至少 Windows 10 SDK 确实显示出它正在开发的明确迹象。


编辑:

即使编译器不可用,Windows 10 SDK(它本身包含 ARM64 的库)头文件和 Visual C++ 2015 头文件(没有匹配的 ARM64 库)也包含对此的引用。与_M_ARM 类似,还有_M_ARM64。来自vc/include/intrin.h的sn-p:

#if defined (_M_ARM)
    #include <armintr.h>
    #include <arm_neon.h>
#endif

#if defined (_M_ARM64)
    #include <arm64intr.h>
    #include <arm64_neon.h>
#endif

编辑2:

虽然目前还没有针对 arm64 的 Visual C++ 编译器的公共版本,但 clang 正在获得对 Windows/arm64 的第一部分支持,并且他们还使用 _M_ARM64

https://github.com/llvm-project/clang/commit/5b7d7d2b2d0bd7054f51b9d108cdd5299a0ec33e#diff-ed544af3ae6807a8513b1cabb3233941R6576


编辑3:

随着 Visual Studio 2017 的最新更新,版本 15.4 发布了 ARM64 编译器。在安装程序中,可以手动检查“Visual C++ compilers and libraries for ARM64”项(默认不启用)。

完成此操作后,您可以启动“VS 2017 的开发人员命令提示符”,并在该 shell 中运行“vsdevcmd -arch=arm64 -host_arch=amd64”,然后您就可以在路径中找到编译器了:

**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.4.0
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community>vsdevcmd -arch=arm64 -host_arch=amd64
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.4.0
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community>cl
Microsoft (R) C/C++ Optimizing Compiler Version 19.11.25547 for ARM64
Copyright (C) Microsoft Corporation.  All rights reserved.

usage: cl [ option... ] filename... [ /link linkoption... ]

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community>

并且这个编译器预定义了_M_ARM64,它可以让你识别它,从而回答这个问题。

【讨论】:

  • 谢谢@mstorsjo。你有 MSDN 订阅吗?拥有它的人可以使用最新的工具,他们可能会知道答案。我不再有 MSDN 订阅,所以我必须在 Stack Overflow 上提问并等待有访问权限的人回答。
  • 不,我没有 MSDN 订阅,所以我无法检查,但我测试了不到一周前发布的 visualstudio.com/en-us/downloads/…,afaik。
  • 有一个微软的官方请求到add ARM64 support to Visual Studio,如果你愿意,你可以投票。
  • 这可能是相关的:What is WINAPI_FAMILY_ONECORE_APP?
  • 不,这不相关。在 Visual Studio 的公共版本中提供 arm64 支持之前,继续猜测是毫无意义的。它还没有公开发布,那些可能有早期访问权限的人(如果有的话)可能不被允许告诉你。
猜你喜欢
  • 2016-08-31
  • 2016-11-14
  • 2015-10-17
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多