Come faccio a bilanciare la compatibilità inversa della CPU del programma, pur essendo in grado di utilizzare funzionalità all'avanguardia?

6

Mentre imparo di più su C e C ++ mi chiedo: come può un compilatore utilizzare le nuove funzionalità dei processori senza limitarlo solo alle persone con, ad esempio, Intel Core i7?

Pensaci: i nuovi processori escono ogni anno con molte nuove tecnologie. Tuttavia, non è possibile indirizzarli solo perché una parte significativa del mercato non eseguirà l'aggiornamento ai processori più recenti e più grandi per un lungo periodo di tempo.

Mi chiedo più o meno come questo sia gestito in generale dagli sviluppatori e dai compilatori C e C ++. I compilatori rendono il codice simile a if SSE is supported, do this using it, else do that using the slower way o gli sviluppatori devono implementare il loro algoritmo due volte o cosa?

Più o meno come si rilascia un software che sfrutta le più recenti tecnologie di processore mantenendo comunque un minimo comune denominatore?

    
posta TheLQ 23.03.2012 - 16:38
fonte

3 risposte

2

La scelta migliore come sviluppatore al giorno d'oggi è quella di scegliere strumenti abbastanza intelligenti da sfruttare set di istruzioni speciali come SSD e SIMD quando sono disponibili direttamente sul processore e, quando non lo sono, ricadono automaticamente su algoritmi software che emulano quelle caratteristiche. Il produttore del compilatore può dirti nelle loro specifiche se lo supportano o meno.

Dall'articolo di Wikipedia per il compilatore Intel C ++ :

The compiler or library can make multiple versions of a piece of code, each optimized for a certain processor and instruction set, for example SSE2, SSE3, etc. The system includes a function that detects which type of CPU it is running on and chooses the optimal code path for that CPU.

Divertente, quell'algoritmo sembra favorire i processori Intel.

GCC ha un'ottimizzazione di "marcia" per la compilazione su una particolare architettura a microprocessore. Il compromesso è che qualche indipendenza dalla piattaforma può essere sacrificata. Vedi link

LLVM non sembra avere ottimizzazioni specifiche del processore; questo ha senso, perché LLVM cerca di generare una rappresentazione del codice intermedio indipendente dalla macchina, e quindi trasforma la rappresentazione indipendente dalla macchina in codice macchina eseguibile. Pertanto, qualsiasi codice destinato a una specifica architettura del processore dovrebbe risiedere in quel secondo passaggio.

    
risposta data 24.03.2012 - 00:04
fonte
2

"se SSE è supportato, farlo usando questo, altrimenti farlo usando il modo più lento": i compilatori potrebbero farlo; per esempio. Le CPU x86 possono segnalare le loro capacità tramite CPUID. Potenzialmente, l'esecuzione del controllo potrebbe rallentare il codice, quindi un compilatore dovrebbe assicurarsi che il controllo sia almeno fattorizzato da un ciclo, e forse fare il controllo in anticipo e memorizzare il risultato in una variabile (nel caso in cui CPUID sia lento ). Un altro piccolo problema è che la parte della versione inutilizzata del codice verrà introdotta nella cache (inutile).

Ma MCVC non lo fa ; se abiliti SSE2 emetterà SSE2 ciecamente, supponendo che il processore di destinazione lo supporti.

I compilatori JIT (.NET / Java) possono facilmente supportare più architetture, poiché devono controllare l'architettura del processore solo una volta per funzione (o meno) per decidere come generare il codice. Ovviamente non è necessario generare più versioni del codice in quel caso; il codice può essere adattato per la CPU corrente.

    
risposta data 06.04.2012 - 17:46
fonte
1

Il manuale di ottimizzazione C ++ di Agner Fogg contiene una sezione estesa (pagina 124: Sezione 13: "Creare codice critico in più versioni per diversi set di istruzioni ") su come affrontare questo problema. (Quel documento è uno dei un set .)

    
risposta data 07.04.2012 - 10:55
fonte

Leggi altre domande sui tag