在预处理器中检测ARM-64?

8
根据微软 (这里这里) 的说法,公司将在即将推出的 Windows 10 版本中支持 ARMv8/Aarch64 (ARM-64)。此外,微软已经 提供了预览版,因此我猜测工具支持已经就位。
对于那些不知道的人,文章提供的图片 明显显示了高通骁龙 410。那是一个 A-53 核心,它是 Aarch64/ARM-64。

Microsoft为ARM-32定义了_M_ARM,我们目前使用它来检测NEON是否可用。ARMv8支持可选扩展CRC32、AES、SHA-1和SHA-2。我们已经编写了这些功能的代码供Apple和Linux使用,现在我们想要在Microsoft平台上启用它们。

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 指令

这可能与之相关:什么是WINAPI_FAMILY_ONECORE_APP?

Intrinsics是编译器实现的细节,与SDK无关。使用这样旧的编译器无法帮助你取得任何进展,VS版本15(而不是VS2015)目前正在预览中。预计会在alpha版本中遇到问题,请将错误和缺失的功能报告给connect.microsoft.com,而不是SO。或者等待它完成。 - Hans Passant
1
@HansPassant - 我不确定你在谈论什么关于报告错误???这是一个简单的问题:微软正在支持ARM64,那么我们如何检测它?这是一个完美的适合在Stack Overflow上提问的问题。 - jww
这两个链接中都没有提到ARM64,它们都只提到“ARM”和最多4GB的RAM(适用于移动设备),而在“工业”物联网版本中不支持ARM。 - Ben Voigt
@BenVoigt - ARMv8 是AArch64。它还提供了一个AArch32执行环境,类似于Linux的multiarch和Windows on Windows(WoW64)。 - jww
@jww 是的,Windows IoT 的 ARM32 版本可以在 ARM64 硬件上运行,包括 RPi3。但这与 WOW64 没有任何相似之处,更像是 x86_64 CPU 模式。WOW64 允许应用程序和操作系统之间存在不匹配,但我们现在谈论的是操作系统和 CPU 之间的不匹配。 - Ben Voigt
1个回答

12

自VS2017起,使用_M_ARM64。详情请见下文。

按相反顺序回答:

  • 目前发布的所有Visual Studio版本都不支持ARMv8/AArch64,只支持ARMv7。尽管Windows 10本身显示出对arm64的支持迹象(有一些arm64的可执行文件和库),但据我所知,迄今为止发行的编译器版本都没有包括它(至少Visual Studio 2015 Community没有包括它,最近发布的新版Visual Studio“15”预览版2也没有)。因此,显然它存在于内部,但还没有成为任何公共发布的一部分。
  • 至于要查找哪个定义;由于尚未发布arm64目标版本的编译器的公共文档,因此目前还不清楚,也无法进行经验测试。

我在你提供的链接中没有看到Microsoft有任何明确的声明说它将被支持,但至少Windows 10 SDK显示出正在开发它的明显迹象。


编辑:

尽管编译器还不可用,但Windows 10 SDK(其中包含arm64的库)头文件和Visual C++ 2015头文件(没有匹配的ARM64库)也包含对此的引用。与_M_ARM类似,还有_M_ARM64。摘自vc/include/intrin.h的代码片段:

#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编译器已经发布。在安装程序中,可以手动选中“适用于ARM64的Visual C++编译器和库”项目(默认情况下未启用)。

完成后,您可以启动“面向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上提问,并等待那些有访问权限的人回答。 - jww
不,我没有MSDN订阅,所以无法检查,但是我测试了https://www.visualstudio.com/en-us/downloads/visual-studio-next-downloads-vs.aspx,据我所知,它是在不到一周前发布的。 - mstorsjo
1
微软已经发布了一个官方请求,要求为Visual Studio添加ARM64支持,如果您愿意,可以投票支持。 - Akeo
不,那与此无关。在公共版本的Visual Studio中提供arm64支持之前,继续猜测是没有意义的。它目前尚未公开发布,并且可能具有早期访问权限(如果有的话)的人可能不被允许告诉你。 - mstorsjo
微软终于记录了define。它是“_M_ARM64”。感谢您的帮助。 - jww
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接