2013-07-16 9 views
5

Ho un codice che utilizza comandi intrinseci SSSE3 (si noti la tripla S) e un runtime verifica se utilizzarlo, quindi ho assunto che l'applicazione debba essere eseguita su CPU senza Supporto SSSE3. Tuttavia, quando si utilizza -mssse3 con ottimizzazione -O1 il compilatore inserisce anche istruzioni SSSE3 che non ho chiamato esplicitamente, quindi il programma si blocca.Come abilitare le intrinseche SSSE3 ma disabilitarne l'utilizzo nell'ottimizzazione del compilatore

C'è un modo per abilitare il codice SSSE3 quando richiamo ESPLICITAMENTE le relative funzioni intrinseche, ma per impedire al compilatore di aggiungere il proprio codice SSSE3?

Nota che non è possibile disabilitare l'ottimizzazione -O1.

+0

Domanda correlata: http://stackoverflow.com/questions/15584983/whats-the-proper-way-to-use-different-versions-of-sse-intrinsics-in-gcc – yohjp

+0

compila diverse TU con impostazioni diverse . – PlasmaHH

+1

Compilare file diversi con opzioni diverse o diverse funzioni con diverse opzioni (pragma, attributo) o utilizzare gcc-4.9. –

risposta

10

La soluzione a questo problema è NON compilare TUTTO il codice del programma con l'opzione -mssse3 e compilare solo la parte che effettivamente utilizza queste funzionalità con tale opzione. In altre parole:

// 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 ... 
} 

Solo "ssse3.cpp" deve essere compilato con il flag -mssse3.

+0

Vedere anche [GCC Issue 57202 - Si prega di rendere utilizzabili le intestazioni intrinseche come immintrin.h senza i flag del compilatore] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57202). – jww

0

Se si utilizza gcc, si può semplicemente compilare il codice senza utilizzare l'interruttore -mssse3, e tirare nei intrinseci SSSE3 con

#define __SSSE3__ 1 
#include <tmmintrin.h> 

in cui ne avete bisogno.

+3

Si noti che ciò non funzionerà, dal momento che __builtin_some_intrinsic non sarà presente quando il compilatore espande la funzione inline dichiarata dalla funzionalità intrinseca e quindi non verrà compilata correttamente. Il compilatore controlla quali funzioni integrate sono dichiarate dalle opzioni -msse. –

Problemi correlati