EMB_81

SOFTWARE | COMPILER EMBEDDED SETTEMBRE 62 anche perché molte CPU moderne hanno introdotto istruzioni SIMD (Single Instruction Multiple Data) che consentono la vettorizzazione, come ad esempio le istruzioni Power Architecture AltiVec, ARM Neon o Intel SSE. La vettorizzazione manuale può portare a ottimi miglioramenti nelle prestazioni, ma richiede che lo sviluppatore decida da sé cosa possa essere paral- lelizzato e come e cosa si debba fare a tal scopo. Deve quindi imparare e utilizzare nuovi tipi di dati ed ele- menti interni del compilatore (detti intrinsics ) e pensa- re all’allineamento e all’aliasing. La vettorizzazione automatica ha lo stesso obiettivo di quella manuale e a prima vista promette di alleggerire il lavoro dello sviluppatore, ma in genere non è così semplice da usare come questi vorrebbe. Il problema è che occorre eseguire un’analisi accurata degli alias e ) À che analizza il codice scritto in linguaggio C e C ++. Per rendere possibile la vettorizzazione automatica, lo sviluppatore deve quindi utilizzare direttive (pragma) o altre parole chiave per indicare al compilatore dove è sicuro applicare la vettorizzazione. Un’altra area di ottimizzazione, ad esempio, consiste nell’allocazione dei registri o, nel caso del codice C ++, nella cancellazione di funzioni virtuali inutilizzate o nella gestione delle eccezioni in C ++. A tal scopo, sem- pre più istruzioni speciali della CPU sono supportate direttamente dal compilatore o con l’aiuto di elementi intrinseci (intrinsics). L’ottimizzazione intermodulare ha un grande potenziale, ma richiede che il compilato- À 0 la struttura del modulo viene riconosciuta e annotata, e in seconda analisi ogni modulo viene effettivamen- te tradotto e ottimizzato con l’aiuto delle informazioni strutturali di tutti gli altri moduli. In alcune applicazioni la velocità di esecuzione risul- ta l’aspetto più importante a discapito dell’aumento della dimensione del codice. In pochi altri casi, ridurre la dimensione del codice è l’obiettivo più importante, non importa quanto ciò rallenti l’esecuzione del codice stesso. Tuttavia, gran parte delle volte, in un progetto À sia un compromesso tra velocità e dimensioni. Appli- care questo compromesso di ottimizzazione a tutto il codice non è necessariamente la scelta migliore, poi- ché la maggior parte delle volte il programma sfrutta quasi tutto il tempo di CPU per eseguire una piccola quantità di codice e l’altra gran parte del codice viene ! "# $

RkJQdWJsaXNoZXIy Mzg4NjYz