2012-05-21 4 views
16

Per le opzioni GCC CFLAGS: -msse, -msse2, -mssse3, -msse4, -msse4.1, -msse4.2. Sono esclusivi nel loro uso o possono essere usati insieme?Qual è la differrence tra cflgs SSE opzioni di -msse, -msse2, -mssse3, -msse4 RTC ..? e come determinare?

La mia comprensione è che la scelta di quale impostare dipende dal fatto che l'arco di destinazione, che il programma verrà eseguito su, supporta o no, è corretto?

Se sì, come potrei sapere che cosa sse miei plantari target? In Linux, ho cat/proc/cpuinfo, ma cosa succede se mac o Windows?

Grazie!

+0

Le istruzioni SSE sono state migliorate/modificate su varie generazioni di CPU. la compilazione per un target 4.2 preclude l'utilizzo del codice generato su generazioni precedenti. –

+0

grazie per la 1a risposta. quindi cosa dovrei scegliere? solo l'ultimo (è -msse4.2)? – yaya

+0

A meno che non si disponga di un requisito SIMD specifico, compilare semplicemente il minimo comune denominatore, ad esempio omettere le opzioni -msse. –

risposta

27

Lo switch -m può essere utilizzato in parallelo, inoltre alcuni di essi sono impliciti dall'architettura o da altri interruttori. Ad esempio, se si crea codice per x86_64, -msse -msse2 è sempre abilitato.

Per il codice destinato a funzionare sul vostro sistema si dovrebbe scegliere -march=native, che selezionerà cosa è disponibile sul processore. Ad esempio, se si dispone di un Sandy Bridge, questo abiliterà -msse -msse2 -msse3 -mssse3 -msse4 -msse4.1 -msse4.2 -mavx.

Se si desidera specificare in dettaglio quale set di istruzioni utilizzare, è necessario utilizzare solo ciò che è disponibile, non sempre il "più recente". Il "più recente" è attualmente -mavx2, che non consiglio: il primo processore che lo supporterà sarà disponibile nel 2013.

+0

Qual è il punto di 'msse4'? Per quanto posso dire è lo stesso di 'msse4.2'. Forse crea una macro '__SSE4__'? Sembra che causi solo confusione. –

+0

@Zboson Non so quale sia il punto. Dovresti chiederlo alla mailing list gcc, non c'è davvero alcuna differenza (ancora?). Puoi verificarlo con qualcosa come 'gcc -dM -E -msse4.2 - 1; gcc -dM -E -msse4 - 2; diff 1 2' – hirschhornsalz

Problemi correlati