2013-07-16 3 views
5

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

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

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

+0

Связанный вопрос: http://stackoverflow.com/questions/15584983/whats-the-proper-way-to-use-different-versions-of-sse-intrinsics-in-gcc – yohjp

+0

скомпилировать различные ТУ с различными настройками , – PlasmaHH

+1

Скомпилируйте различные файлы с различными параметрами или различными функциями с различными параметрами (прагма, атрибут) или используйте gcc-4.9. –

ответ

10

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

+0

Также см. [GCC Issue 57202 - Пожалуйста, создайте заголовки intrinsics, такие как immintrin.h, можно использовать без флагов компилятора] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57202). – jww

0

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

#define __SSSE3__ 1 
#include <tmmintrin.h> 

, где вы нуждаетесь в них.

+3

Обратите внимание, что это не будет работать, поскольку __builtin_some_intrinsic не будет присутствовать, когда компилятор расширяет встроенную функцию, объявленную внутренней функциональностью, и, следовательно, не будет компилироваться правильно. Компилятор контролирует, какие встроенные функции объявлены параметрами -msse. –

Смежные вопросы