2012-03-26 8 views
12

Nella nostra architettura incorporata abbiamo un IAB a 64 bit (Istruzione Allineamento Buffer). Per ottimizzare la sequenza di recupero, è necessario che il corpo di un loop venga allineato a un limite di 8 byte.Come allineare il corpo per il ciclo C con GCC?

È facile ottenere questo risultato in assembly utilizzando la direttiva .balign, ma non riesco a trovare una sintassi che suggerisca al compilatore C di allineare il codice.

Il tentativo di precedere il ciclo for con il montaggio in linea con la direttiva .balign non funziona in quanto allinea il prolog per il ciclo (setup) e non il corpo del loop stesso.

Facendo lo stesso quando la linea asm() si trova all'interno del ciclo, aggiunge nop -s al corpo del ciclo che è costato cicli preziosi.

EDIT 1: assumere il codice:

__asm__ volatile("nop"); 
    __asm__ volatile("nop"); 

    for (j0=0; j0<N; j0+=4) 
    { 
     c[j0+ 0] = a[j0+ 0] + b[j0+ 0]; 
     c[j0+ 1] = a[j0+ 1] + b[j0+ 1]; 
     c[j0+ 2] = a[j0+ 2] + b[j0+ 2]; 
     c[j0+ 3] = a[j0+ 3] + b[j0+ 3]; 
    } 

voglio il primo c=a+b da allineare a un indirizzo di 8 byte. Posso aggiungere il nop -s come sopra dopo una compilazione preliminare, ma questa è una soluzione ad-hoc che si interromperà con la prima modifica del codice.

MODIFICA 2: Grazie a @R .., la soluzione è utilizzare l'opzione del compilatore -falign-loops=8.

+0

Quindi, in sostanza, vuoi 'nop'-s che farà sì che il loop * body * sia allineato, ma vuoi che' nop'-s vada prima del ciclo * prolog *? – ruakh

+0

@ruakh - sì, anche se non mi interessa se i 'nop'-s sono generati nel prologo stesso, a patto che l'istruzione branch alla fine del loop punti verso una posizione di memoria allineata. – ysap

+0

Capito. Questa è una bella domanda! – ruakh

risposta

3

Umm, non è questo l'opzione di GCC -falign-loops?

+0

Sì, ma che cosa succede se si desidera modificare solo un ciclo. GCC ha qualche soluzione? –

+1

Per una singola funzione, è possibile utilizzare '#pragma GCC optimize' o gli attributi equivalenti. Non so se riuscirai a farlo a livello di loop singolo. Se non c'è altro modo, potresti ottenere questo risultato con un attacco orribile mettendo il ciclo in una funzione annidata e inserendo l'attributo nella funzione annidata ...? –

+0

L'ottimizzazione mirata delle singole funzioni è ancora migliore dell'opzione a livello di progetto, poiché può essere utile in alcune circostanze (cicli caldi) e cattiva in altre (cicli rari). Sfortunatamente, né '#pragma GCC optimize" align-loops = xx "' né '__attribute __ ((optimize (" align-loops = xx ")))' sembra produrre alcun effetto nei miei test (stesso 'md5sum' su binari generati). – Cyan

Problemi correlati