Gcc cflgs sse选项-msse、-msse2、-MSSE3、-msse4 rtc..之间有什么区别。。?如何确定?

Gcc cflgs sse选项-msse、-msse2、-MSSE3、-msse4 rtc..之间有什么区别。。?如何确定?,gcc,g++,gnu,sse,compiler-flags,Gcc,G++,Gnu,Sse,Compiler Flags,对于GCC CFLAGS选项:-msse、-msse2、-MSSE3、-msse4、-msse4.1、-msse4.2。它们是专用的还是可以一起使用 我的理解是,设置哪一个取决于程序将在其上运行的目标arch是否支持它——这是正确的吗 如果是这样,我怎么知道我的目标拱门支撑什么?在Linux中,我使用cat/proc/cpuinfo,但是如果Mac或Windows呢 谢谢 可以并行使用-m交换机,而且其中一些是由体系结构或其他交换机暗示的。例如,如果为x86_64生成代码,则始终启用-msse-

对于GCC CFLAGS选项:-msse、-msse2、-MSSE3、-msse4、-msse4.1、-msse4.2。它们是专用的还是可以一起使用

我的理解是,设置哪一个取决于程序将在其上运行的目标arch是否支持它——这是正确的吗

如果是这样,我怎么知道我的目标拱门支撑什么?在Linux中,我使用cat/proc/cpuinfo,但是如果Mac或Windows呢

谢谢

可以并行使用-m交换机,而且其中一些是由体系结构或其他交换机暗示的。例如,如果为x86_64生成代码,则始终启用-msse-msse2

对于要在系统上运行的代码,您应该选择-march=native,这将选择处理器上可用的代码。例如,如果您有一个沙桥,这将启用-msse-msse2-msse3-msse4-msse4.1-msse4.2-mavx


如果要详细指定要使用的指令集,应仅使用可用的指令集,而不应始终使用最新的指令集。目前最新的一个是-mavx2,我不推荐它:第一个支持它的处理器将在2013年上市。

SSE指令在不同代CPU上得到了增强/修改。为4.2目标编译会阻止在旧版本上使用生成的代码。感谢您的第一次回复。那么我应该选择什么呢?只有最新的一个是-msse4.2吗?除非您有特定的SIMD要求,否则只需编译最低公分母,即省略-msse开关。@PaulR我同意-msse选项,即使是具有特殊支持的代码也只能看到很小的好处。但是对于密切相关的-mavx,这可能是不同的:即使是非常普通的非矢量化浮点密集型代码也可能受益于AVX中的三操作数syntex?据我所知,它与msse4.2相同。也许它会创建一个宏?看起来这只是引起了混乱。@Zboson我不知道这是什么意思。你应该问,在gcc邮件列表上,确实没有任何区别?。您可以使用gcc-dM-E-msse4.2-1之类的工具来检查这一点;gcc-dM-E-msse4-2;diff 1 2如果您有关于-msse-msse2在x86_64?@steffen中隐含在x86-32编译器中的语句的来源,则必须使用-march=cpu类型、-msse或-msse2开关来启用SSE扩展并使此选项生效。对于x86-64编译器,默认情况下会启用这些扩展。