【问题标题】:How to enable SSSE3 intrinsics but disable their use in compiler optimization如何启用 SSSE3 内在函数但禁用它们在编译器优化中的使用
【发布时间】:2013-07-14 07:17:23
【问题描述】:

我有一个使用 SSSE3 内部命令(注意三个 S)的代码和一个运行时检查是否使用它,因此我假设应用程序应该在没有 SSSE3 支持的 CPU 上执行。 但是,当使用 -mssse3 和 -O1 优化时,编译器还会插入我没有显式调用的 SSSE3 指令,因此程序会崩溃。

有没有办法在我显式调用相关的内部函数时启用 SSSE3 代码,但阻止编译器添加自己的 SSSE3 代码?

请注意,我无法禁用 -O1 优化。

【问题讨论】:

  • 用不同的设置编译不同的TU。
  • 用不同的选项编译不同的文件,或者用不同的选项(pragma,attribute)编译不同的函数,或者使用gcc-4.9。
  • @MarcGlisse - gcc 4.9 将如何帮助我?
  • 啊,对,这里提到的很短:gcc.gnu.org/gcc-4.9/changes.html。 gcc-4.9 允许您使用内在函数,即使当前编译模式表明它们不可用。

标签: c++ optimization gcc sse sse3


【解决方案1】:

解决此问题的方法是不要使用 -mssse3 选项编译所有程序代码,而仅使用该选项编译实际使用这些功能的部分。换句话说:

 // main.cpp
 ... 

     if (use_ssse3()) 
         do_something_ssse3();
     else
         do_something_traditional();

 // traditional.cpp:
 void do_something_traditional()
 {
     ... 
     code goes here ... 
 }

 // ssse3.cpp:
 void do_something_ssse3()
 {
     ... 
     code goes here ... 
 }

只有“ssse3.cpp”应该使用-mssse3 标志编译。

【解决方案2】:

如果你使用 gcc,你可以不使用 -mssse3 开关直接编译代码,然后使用 SSSE3 内部函数来引入

#define __SSSE3__ 1
#include <tmmintrin.h>

您需要它们的地方。

【讨论】:

  • 请注意,这不起作用,因为当编译器扩展由内在功能声明的内联函数时,__builtin_some_intrinsic 将不存在,因此无法正确编译。编译器控制哪些内置函数由 -msse 选项声明。
猜你喜欢
  • 2011-08-11
  • 2010-11-15
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
相关资源
最近更新 更多