Gcc 禁用-msse

Gcc 禁用-msse,gcc,compiler-construction,compiler-optimization,Gcc,Compiler Construction,Compiler Optimization,我正在尝试使用CPU2006运行各种基准测试,以了解各种优化在gcc上的速度。我熟悉-O1、-O2和-O3,但听说-msse是一个不错的优化。到底什么是msse?我还看到-msse在64位体系结构上是默认的,那么如何禁用它来比较使用它和不使用它之间的区别呢? SSE(http://it.wikipedia.org/wiki/Streaming_SIMD_Extensions)顾名思义,自奔腾3以来,处理器中出现了SSE指令。对于某种向量和浮点计算,它们速度很快。它们在所有64位处理器中都可用,那

我正在尝试使用CPU2006运行各种基准测试,以了解各种优化在gcc上的速度。我熟悉-O1、-O2和-O3,但听说-msse是一个不错的优化。到底什么是msse?我还看到-msse在64位体系结构上是默认的,那么如何禁用它来比较使用它和不使用它之间的区别呢?

SSE(http://it.wikipedia.org/wiki/Streaming_SIMD_Extensions)顾名思义,自奔腾3以来,处理器中出现了SSE指令。对于某种向量和浮点计算,它们速度很快。它们在所有64位处理器中都可用,那么我们为什么要禁用它们呢

您可以在-msse和-msse2之间进行选择。SSE2是在SSE之上构建的另一个指令集,它添加了其他功能强大且速度非常快的矢量指令

奔腾3确实有SSE,是一个32位处理器。
SSE2更为现代,奔腾4仍然是一个32位处理器,具有SSE2。

-msse
激活SSE指令的生成。所有64位处理器(x86-64)都有这些指令,但一些较旧的32位处理器(IA-32)没有这些指令。这就是GCC默认设置的原因

SSE
指令与向量运算和浮点运算有关。考虑到在通用代码中自动矢量化的机会很少,您可能观察到的唯一区别是使用浮点


在64位上,要禁用SSE指令,请使用
-mno SSE

奔腾3确实有它,但它是一个32位处理器。SSE2更为现代,并非所有32位处理器都有,但其中一些处理器有。奔腾4是32位处理器,但有SSE2。@Salvatore我不知道你的意思。从386到奔腾II的所有Intel IA32处理器都是不带SSE的32位处理器。我将澄清我的答案,但我的意思是所有x86-64处理器都有SSE,但并非所有IA32处理器都有SSE。SSE2作为SSE的扩展,当然只受支持SSE的处理器子集的支持。我们正在尝试各种基准组合,包括在32位和64位编译之间切换,所以我们只是想看看禁用-msse会做什么。您可以在
-msse
-msse2
之间进行选择,
-msse3
-msse4.1
-msse4.2
。虽然对于“真正的”使用,可能最好只针对CPU生成,而不是特定的扩展。SSE指令仅在某些优化版本的memset和memcpy中使用,或者当编译器能够理解时,它可以是更好的优化,但SSE和sse2有很多要求,例如内存对齐,它们很少被使用。如果您的程序在使用-msse或-mno编译时没有任何差别,我不会感到惊讶。msseI必须承认我从未使用过-msse3、-msse4.1和-msse4.2:)很高兴知道,谢谢。