相当于 msvc 的 -march=native

问题描述 投票:0回答:1

据我所知,MSVC告诉编译器使用特殊可用指令的编译选项是/arch。在 clang/linux 上,我们可以使用 -march=native 来自动检测架构和“最佳”指令集。

有没有办法用 /arch 实现同样的效果,即在当前硬件上找到此选项的最佳可用参数?

我在 MSVC 文档中找不到合适的选项。如果不存在,是否有其他解决方案(例如通过 CMake)?

c++ visual-c++ compilation cpu-architecture hardware-acceleration
1个回答
0
投票

对于 x86,MSVC 的默认值是

/arch:SSE2
,对于 x64 来说是隐式默认值。所有版本的 Windows 8.1 32 位或更高版本都要求安装支持 SSE2,并且所有版本的 Windows x64 都必须将 SSE2 支持作为 x64 平台定义的一部分。

对于 MSVC,您对 x86/x64 使用

/arch:
的唯一时间是选择
/arch:AVX
/arch:AVX2

从技术上讲,在 MSVC x86 上,您可以使用

/arch:IA86
尝试强制使用旧版 x87 指令而不是 SSE/SSE2,但这不是推荐的解决方案或方案。这也意味着代码永远不会匹配始终使用 SSE/SSE2 的 x64 的行为。

对于面向 ARM64 平台上的 Windows 的 MSVC,使用

/arch:arm8.0
/arch:arm8.1
确定编译器是否使用
InterlockedIncrement
的 CPU 指令。在适用于 ARM64 的 Windows 11 上,整个操作系统是使用
/arch:arm8.1
构建的。如果针对 ARM64 的 Windows 10,您应该使用默认值(即
/arch:arm8.0
)。

MSVC 使用的另一个开关是

/favor
,用于 Intel 与 AMD 优化选择。默认值为
/favor:BLEND
,旨在成为两者之间的良好折衷方案。

对于 Clang/Linux,我的理解是,它从主机 CPU 获取信息来确定要使用哪些设置,如果您正在构建仅打算在本地计算机上运行的代码,那么这是有意义的。这通常不是 Windows 的方法。

    

© www.soinside.com 2019 - 2024. All rights reserved.