Как включить встроенные функции SSSE3, но отключить их использование в оптимизации компилятора

У меня есть код, который использует встроенные команды SSSE3 (обратите внимание на тройку S) и проверку времени выполнения, следует ли его использовать, поэтому я предположил, что приложение должно выполняться на процессорах без поддержки SSSE3. Однако при использовании -mssse3 с оптимизацией -O1 компилятор также вставляет инструкции SSSE3, которые я не вызывал явно, поэтому программа вылетает.

Есть ли способ включить код SSSE3, когда я ЯВНО вызываю соответствующие встроенные функции, но не дать компилятору добавить свой собственный код SSSE3?

Обратите внимание, что я не могу отключить оптимизацию -O1.


person Mark S    schedule 16.07.2013    source источник
comment
Связанный вопрос: stackoverflow.com/questions/15584983/   -  person yohjp    schedule 16.07.2013
comment
составлять разные TU с разными настройками.   -  person PlasmaHH    schedule 16.07.2013
comment
Скомпилируйте разные файлы с разными параметрами или разные функции с разными параметрами (прагма, атрибут) или используйте gcc-4.9.   -  person Marc Glisse    schedule 16.07.2013
comment
@MarcGlisse - как мне поможет gcc 4.9?   -  person Mark S    schedule 16.07.2013
comment
Ах да, упоминание здесь довольно короткое: gcc.gnu.org/gcc-4.9 /changes.html . gcc-4.9 позволяет вам использовать встроенные функции, даже если текущий режим компиляции говорит, что они недоступны.   -  person Marc Glisse    schedule 16.07.2013


Ответы (2)


Решение этой проблемы состоит в том, чтобы НЕ компилировать ВЕСЬ программный код с параметром -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.

person Mats Petersson    schedule 16.07.2013

Если вы используете gcc, вы можете просто скомпилировать код без использования переключателя -mssse3 и использовать встроенные функции SSSE3 с помощью

#define __SSSE3__ 1
#include <tmmintrin.h>

где они вам нужны.

person Gunther Piez    schedule 16.07.2013
comment
Обратите внимание, что это не сработает, поскольку __builtin_some_intrinsic не будет присутствовать, когда компилятор расширит встроенную функцию, объявленную встроенной функциональностью, и, следовательно, не будет правильно компилироваться. Компилятор определяет, какие встроенные функции объявляются параметрами -msse. - person Mats Petersson; 28.01.2014