Domanda

Ogni nuova generazione di CPU introduce alcune nuove istruzioni, cioèMMX, 3DNOW!, SSE e così via.

Ho un paio di domande generali su di loro:

  1. Se qualche programma usi per esempio di istruzioni SSE può essere eseguito su CPU che non supporta le SSE?
  2. Se sì, significa che quelle istruzioni potranno essere cambiato in numero maggiore di semplici istruzioni?
  3. Se non lo è, significa che il rendimento reale impatto di queste nuove istruzioni sarà dopo pochi anni, quando la maggior parte della CPU supportano tale tecnologia (così non ci saranno problemi di incompatibilità)?
  4. Quando compilo un programma in C++ con le ottimizzazioni significa che potrai usare alcune di queste nuove istruzioni?(So che dipende da molti fattori, soprattutto il codice, ma vorrei qualche risposta generale).O sono riservate soprattutto per i programmi scritti in asm?
È stato utile?

Soluzione

1) Sì e no:La CPU li considerano valido, ma se il programma controlla se la CPU supporta le istruzioni, quindi può fallback per una versione che non fa uso di tali istruzioni, che permette al programma di essere eseguito comunque.

2) Il programma dovrà fornire un'implementazione alternativa, utilizzando le più "di base" istruzioni per l'uso, e sapere quando utilizzare uno.

3) Dal momento che il programma può controllare la CPU, i benefici possono essere disponibili in questo momento, ma, naturalmente, se gli utenti utilizzano Cpu che non supportano tali istruzioni, non vedo nessun vantaggio.

4) Questo dipenderà interamente il compilatore e l'ottimizzatore.Alcuni dei set di istruzioni può essere considerato abbastanza che il compilatore li uso sempre a meno che non si dica di non, mentre per altri sarà il contrario:devi dire al compilatore di usare loro.Se non si crea automaticamente fallbacks così è anche andando dipende dal compilatore.

Altri suggerimenti

Per approfondire Michael Madsen la risposta per la domanda 4, GCC di default per la generazione di codice per un processore i386.Esso fornisce una bandiera chiamata -march (noto anche come -mcpu), che determina quali tipi di istruzioni il compilatore emette.Microsoft cl.exe fornisce /arch: e /Gx bandiere per lo stesso scopo.

La bandiera colpisce anche come le istruzioni sono ordinati, perché diverse Cpu può essere relativamente più lento o più veloce l'esecuzione di un determinato pezzo di codice, a seconda dell'ordine in cui le istruzioni visualizzate.

Io non sono a conoscenza di qualsiasi compilatore statico che creerà automaticamente set di funzionalità di codice di fallback.Di solito che deve essere fatto esplicitamente dal programmatore.Ma la buona notizia è che il programmatore non ha bisogno di essere voi;per esempio, il liboil biblioteca (ottimizzazione dei Cicli Interni), a runtime, selezionare la migliore esecuzione di codice a seconda della macchina è in fase di esecuzione.

Un file eseguibile che contiene nuove istruzioni possono essere eseguite solo su CPU che supportano queste nuove istruzioni.È possibile configurare il compilatore per compilare una specifica CPU.

MMX ha stato intorno dal 1996, SSE uscito nel 1999, e SSE2 debuttato con il Pentium 4 nel 2001.Penso che sia lecito ritenere che qualsiasi CPU userete ha MMX e SSE, e, probabilmente, SSE2.3DNOW credo sia AMD solo, quindi non aspettatevi le istruzioni per essere disponibile.

  1. Se qualche programma usi per esempio di istruzioni SSE può essere eseguito su CPU che non supporta le SSE?

No.Ma in generale questo spesso genera una trap o eccezione, e il trap/interrupt handler in grado di elaborare, se necessario.

Per esempio tempo fa software spesso contengono il codice per 87 x.Se l'87 x coprocessore esiste, l'istruzione verrà eseguito normalmente in hardware, ma se il computer non dispone di un 87 x coprocessore poi genererà una trappola, dopo che l'istruzione saranno trattati nel software e ritorno risultato normale.Vedere Qual è il protocollo per 87 x emulazione di virgola mobile in MS-DOS?

Le prime versioni di Hackintosh anche usare questo per emulare SSE2 sulla Cpu che non supportano questo set di istruzioni.Naturalmente, la performance è terribile, ma verrà eseguito.

  1. Se non lo è, significa che il rendimento reale impatto di queste nuove istruzioni sarà dopo pochi anni, quando la maggior parte della CPU supportano tale tecnologia (così non ci saranno problemi di incompatibilità)?

Sì.Ma dopo un paio di anni, forse softwares bisogno di aggiornamenti, giusto?Per una critica delle prestazioni del software, che è una riscrittura di sfruttare il nuovo set di istruzioni può essere necessaria.Per altri, l'aumento delle prestazioni potrebbe non essere evidente

  1. Quando compilo un programma in C++ con le ottimizzazioni significa che potrai usare alcune di queste nuove istruzioni?(So che dipende da molti fattori, soprattutto il codice, ma vorrei qualche risposta generale) O sono riservate soprattutto per i programmi scritti in asm?

Dipende dal compilatore e le opzioni di passaggio a tempo di compilazione.

I compilatori moderni supporto così rileva comuni modi di dire e ottimizzare.Hai solo bisogno di ricompilare per sfruttare il nuovo set di istruzioni.Ma per i casi più complessi, è ancora necessario a mano ottimizzare utilizzando SIMD intrinseci

Se si utilizza un libreria esterna, automaticamente avrai un miglioramento della velocità quando la biblioteca è aggiornato per supportare il nuovo set di istruzioni, anche se non si fa nulla con il tuo programma

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top