/arch(最小 CPU 结构)
更新:2007 年 11 月
使用流式处理 SIMD 扩展 (SSE) 和流式处理 SIMD 扩展 2 (SSE2) 指令指定生成代码的结构。
/arch:[SSE|SSE2]
备注
说明: |
---|
/arch 仅在为 x86 平台编译时可用。为 x64 或 Itanium 进行编译时,此编译器选项不可用。 |
SSE 指令在各种 Pentium 和 AMD Athlon 处理器中均存在。SSE2 指令仅存在于 Pentium 4 处理器中。
/arch:SSE 允许编译器使用 SSE 指令,而 /arch:SSE2 允许编译器使用 SSE2 指令。
_M_IX86_FP 指示使用哪个 /arch 编译器选项(如果有);有关更多信息,请参见 Predefined Macros。
在指定 /arch 时,优化程序将选择何时以及如何使用 SSE 和 SSE2 指令。当确定使用 SSE/SSE2 指令和寄存器肯定要比使用 x87 浮点寄存器堆栈更快时,SSE 和 SSE2 指令将用于某些标量浮点计算。因此,您的代码实际上将混合使用 x87 和 SSE/SSE2 来进行浮点计算。此外,通过 /arch:SSE2,可将 SSE2 指令用于某些 64 位整数运算。
除了使用 SSE 和 SSE2 指令之外,编译器还将使用在支持 SSE 和 SSE2 的处理器修订版上提供的其他指令。例如,在 Intel 处理器的 Pentium Pro 修订版中首次出现的 CMOV 指令。
在使用 /clr(公共语言运行库编译) 进行编译时,/arch 对托管函数的代码生成没有任何影响。/arch 只影响本机函数的代码生成。
/arch 和 /QIfist(取消 _ftol) 不能在同一 compiland 上使用。
特别是,如果用户没有使用 _controlfp 修改 FP 控制字,则运行库启动代码会将 x87 FPU 控制字精度控制字段设置为 53 位,这样,表达式内的所有浮点运算和双精度运算都以 53 位有效数和 15 位指数进行。但是,所有 SSE 单精度运算都将使用 24 位有效数/8 位指数,而 SSE2 双精度运算将使用 53 位有效数/11 位指数。有关更多信息,请参见 _control87, _controlfp, __control87_2。
例如,在单个表达式树中可能会出现这些差异,而在每一子表达式后存在用户赋值的情况下则不会:
r = f1 * f2 + d; // Different results are possible on SSE/SSE2.
相对于:
t = f1 * f2; // Do f1 * f2, round to the type of t.
r = t + d; // This should produce the same overall result
// regardless whether x87 stack or SSE/SSE2 is used.
controlfp 不更改 MXCSR 控制位,因此,对于 /arch:SSE2,任何依赖于使用 controlfp 的功能都将被破坏。
在 Visual Studio 开发环境中设置此编译器选项
打开该项目的“属性页”对话框。有关详细信息,请参见如何:打开项目属性页。
单击“C/C++”文件夹。
单击“代码生成”属性页。
修改“启用增强指令集”属性。