Domanda

Mentre uso i moderni compilatori C ++ (inclusi MSVC, GCC, ICC), come posso dire se ha:

  1. parallelizza il codice
  2. vettorializzava i loop (o utilizzava altre istruzioni specifiche del processore)
  3. srotolato i loop
  4. ricorsione della coda rilevata
  5. eseguito RVO (ottimizzazione del valore di ritorno)
  6. o ottimizzato in qualche altro modo

senza immergersi nel codice assembler prodotto dal compilatore?

È stato utile?

Soluzione

L'unico modo in cui puoi davvero è se esamini l'output dell'assemblatore (che sembra avere scontato). Oltre a ciò, puoi leggere il documento per vedere quali tipi di ottimizzazione fornisce ogni livello del tuo compilatore.

Ma, in tutta onestà, se non ti fidi che i livelli di ottimizzazione del tuo compilatore stiano facendo il lavoro, probabilmente non ti fiderai del doco :-)

Guarderei io stesso l'assemblatore, è l'unico modo in cui potresti essere veramente sicuro.

Altri suggerimenti

Il compilatore Intel ha una funzione di reporting decente. Cerca -vec-report e -par-report nella documentazione di riferimento o nella pagina man.

g ++ ha anche report vettoriali, cerca nella pagina man "vector", non credo che g ++ abbia una generazione automatica parallela di codice.

Per quanto riguarda le ultime tre cose, non credo che i compilatori lo segnalino, quindi probabilmente dovrai andare in assemblea per ottenere tali informazioni

Per RVO o altre cose di copia-elisione, basta mettere un po 'di registrazione (printf) in copy-ctor e dtor della tua classe. Dovresti vedere un minor numero di oggetti copiati se le ottimizzazioni funzionano.

Sono abbastanza sicuro che se usi l'ottimizzazione più approfondita nel tuo compilatore, il codice sarà parallelizzato e i loop saranno vettorizzati e funzioneranno anche molte altre tecniche di vettorializzazione.

Per usare quella profondità, usa il comando -O3 quando esegui il tuo codice.

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