- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的目标是开发代码,在 SIMD 指令可用时使用 SIMD 指令进行编译,而在它们不可用时不使用。更具体地说,在我的 C 代码中,我进行了明确的 SIMD 调用,并根据我提取的处理器信息检查这些调用是否有效。
我有很多问题,但在输入足够多之后,SO 指出了我: Detecting SIMD instruction sets to be used with C++ Macros in Visual Studio 2015
唯一剩下的问题是 /arch
标志如何影响显式 SIMD 代码?即使您的拱门未设置,这仍然有效吗?例如,我可以在没有/arch:AVX2 的情况下编写 AVX2 调用吗?
最佳答案
这里有几个答案。
首先,经典的 Intel 32 位 x86 代码使用 x87 指令集进行浮点运算,编译器将使用 float
和 double
类型为 x87 生成代码.长期以来,这是 Visual C++ 编译器在构建 32 位时的默认行为。您可以通过 /arch:IA32
强制它与 32 位代码一起使用——此开关对 64 位无效。
对于 AMD64 64 位代码(英特尔也将其用于 64 位代码,通常称为 x64),x87 指令集与 3DNow 一起被弃用!和在 64 位模式下运行时的 Intel MMX 指令。所有 float
和 double
类型的代码都是使用 SSE/SSE2 生成的,尽管不一定使用 XMM
的完整 4 个 float 或 2 个 double 元素宽度> 注册。相反,编译器通常会生成仅使用 XML
的 SSE/SSE2 指令的标量版本——实际上是 __fastcall
64 位调用约定和 .NET 编码规则结果只处理 XML
。这是为 64 位构建时 Visual C++ 编译器的默认行为。您还可以通过 /arch:SSE
或 /arch:SSE2
开关将相同的 codegen 用于 32 位——这些开关对 x64 无效,因为它们具有已经到了。
Starting with Visual C++ 2015,
/arch:SSE2
is the default for 32-bit code gen and is implicitly required for all 64-bit code gen.
这将我们带到 /arch::AVX
。对于 32 位和 64 位代码生成器,这让编译器使用 VEX 前缀来编码 SSE/SSE2 指令(由我上面提到的数学编译器生成,或者通过显式使用编译器内部函数生成)。此编码使用 3 操作数 (dest, src1, src2)
而不是英特尔代码的传统 2 操作数 (dest/src1, src2)
。这样做的最终结果是所有 SSE/SSE2 代码生成都可以更有效地使用可用寄存器。这实际上是使用 /arch:AVX
为您带来的大部分内容。
编译器的其他方面也使用 /arch
开关设置,例如优化的 memcpy
和可供自动使用的指令集-/O2
和 /Ox
构建等中的矢量化器。编译器还假设如果您使用 /arch:AVX
它是免费使用的SSE3、SSSE3、SSE4.1、SSE4.2 或 AVX 指令以及 SSE/SSE2。
使用 /arch:AVX2
,您可以使用 VEX 前缀和指令集获得相同的行为,而且编译器可以选择优化代码以使用融合乘加 (FMA3) 指令AVX2 需要。自动矢量化器也可以在激活此开关的情况下使用 AVX2 指令。
TL;DR:如果您使用编译器内在函数,您就有责任确保它们不会在运行时因无效指令异常而崩溃。 /arch
开关只是让您告诉编译器在任何地方都使用高级指令集和编码。
有关详细信息,请参阅此博客系列:DirectXMath: SSE, SSE2, and ARM-NEON ; SSE3 and SSSE3 ; SSE4.1 and SSE 4.2 ; AVX ; F16C and FMA ; AVX2 ;和 ARM64 .
关于visual-c++ - visual studio编译代码时arch参数如何使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50827769/
我在使用的教程中遇到了这个不寻常的代码。 #if !(arch(x86_64) || arch(arm64)) func sqrt(a: CGFloat) -> CGFloat { return CG
我的应用程序需要 double 计算。根据我在谷歌上找到的内容,我应该添加一个标志“-arch sm_13”或“-arch sm_20”。 Q1:“-arch sm_13”和“-arch sm_20”
在从不同的规范文件构建一些 RPM 时,我收到了上述警告 Binaries arch (1) not matching the package arch (2). 代码和一切都给了我,我对 RPM 很
似乎 Microsoft Visual C++ 提供了可在两种名称格式下重新分发的 VC++ 运行时的等效副本。 VS2017: @ /cygdrive/c/Program Files (x86)/M
在 Kotlin 文件中,我有一个“未解析的引用:arch”。 import android.arch.lifecycle.Lifecycle import android.arch.lifecycl
目前,我们正在项目中使用LiveData、ViewModel 和Room。 我们正在使用 Java 8。 我们在build.gradle中使用以下内容 // ViewModel and LiveDat
我在 Macbook Pro 上的 VirtualBox 上运行 Ubuntu 14.04 64 位 MAC。我在 hello_kernel.c 中有以下内容,我想运行它。 #include #in
我创建了一个 github 操作来在推送时部署代码。 安装软件包时会导致此错误。 Run npm i --no-optional && cd client && npm i --no-optional
当我尝试在 Ubuntu 机器中启用 PPP 时,在 menuconfig 之后发生以下错误并尝试制作内核: $ sudo make make[1]: *** No rule to make targ
测试二进制 二进制没问题 npm WARN rollback 回滚 node-pre-gyp@0.12.0 失败(这可能是无害的): EPERM: operation not permitted, l
当我尝试在 Ubuntu 机器中启用 PPP 时,在 menuconfig 和尝试制作内核之后发生了以下错误: $ sudo make make[1]: *** No rule to make tar
我正在尝试安装Webpack但它不断地给我同样的警告,而且 webpack 仍然没有安装在我的项目中。这是我正在处理的一个现有项目。我尝试了很多命令,例如 npm install --no-optio
我在我的raspberry pi上安装python密码软件包时遇到了一些问题,特别是python版本3.9.8(与pyenv一起安装)。密码包是使用pacman(python-cryptography
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章Arch Linux安装后的一些初始设置简介由作者收集整理,如果你对这篇
我尝试在 ubuntu 12.04(64 位)上构建 gcc 4.8 主干。 当我使用配置时 ../gcc-trunk/configure -v --with-pkgversion='ubuntu12
slock 与 xfce 一起安装。 当我点击右上角的“锁定屏幕”时,屏幕变黑。按任意键,屏幕会变红,但如何取消呢? slock中没有解锁的UI? 最佳答案 我发现它只是在等待密码。输入正确的密码,屏
我正在尝试在 Cygwin 中为 Android NDK 配置工具链。我用这个tutorial .当我运行以下命令时: ./make-standalone-toolchain.sh --platfor
我安装了 Arch Arm到 Rpi3 上,然后将 sysroot rsync 到安装在 Lenovo thinkpad 上的 x86_64 Arch Linux。 然后我安装了 arm-linux-
我正在研究 Linux 内核模块。它需要有一种方法可以将所有进程显示为分层树。我已经编写了一个递归方法来显示进程及其子进程。我还尝试通过检查每个进程与 init_task 的距离来将其格式化为树。但是
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我是一名优秀的程序员,十分优秀!