2010-11-01 9 views
35

Come posso comunicare a GCC di srotolare un particolare loop? Ho usato l'SDK CUDA dove i loop possono essere srotolati manualmente usando #pragma unroll. C'è una funzionalità simile per gcc? Ho cercato un po 'su google ma non ho trovato nulla.Dire a gcc di srotolare in modo specifico un loop

+6

Non posso credere che lo dirò. Se non trovi altro, c'è sempre ... il dispositivo di Duff. Ora, dove * ho * ho messo la sferza di quel penitente? So che è qui da qualche parte ... – dmckee

+0

Heh puoi farlo usando i macro? Probabilmente no, quindi è sufficiente scriverlo l'unica cosa rimasta? – Nils

+6

In tutta serietà, suggerirei di cercare una compilazione separata di quel bit con '-funroll-loops' prima di usare Duff's Device: è una cosa bellissima da studiare, ma una brutta cosa da avere nel tuo codice. – dmckee

risposta

43

GCC fornisce diversi modi per gestire questa:

  • Usa #pragma direttive, come #pragma GCC optimize ("string"...), come si è visto nello GCC docs. Si noti che il pragma rende le ottimizzazioni globali per le restanti funzioni. Se è stato utilizzato #pragma push_options e pop_options macro abilmente, probabilmente si potrebbe definire questo giro solo una funzione in questo modo:

    #pragma GCC push_options 
    #pragma GCC optimize ("unroll-loops") 
    
    //add 5 to each element of the int array. 
    void add5(int a[20]) { 
        int i = 19; 
        for(; i > 0; i--) { 
         a[i] += 5; 
        } 
    } 
    
    #pragma GCC pop_options 
    
  • Annotazione singole funzioni con sintassi dell'attributo di GCC: controllare le GCC function attribute documentazione per una dissertazione più dettagliate sulla soggetto. Un esempio:

    //add 5 to each element of the int array. 
    __attribute__((optimize("unroll-loops"))) 
    void add5(int a[20]) { 
        int i = 19; 
        for(; i > 0; i--) { 
         a[i] += 5; 
        } 
    } 
    

Nota: non sono sicuro di quanto è buono GCC è a srotolare loop reverse-iterata (l'ho fatto per arrivare Markdown di bel gioco con il mio codice). Gli esempi dovrebbero comunque essere compilati bene.

+1

Molto bello che ci sia un attributo di funzione per questo, ma è ignorato dall'ultimo GCC di Apple per iOS: "warning: 'optimization' attribute directive ignored". (So ​​che sono passati a LLVM, ma a volte utilizzo ancora GCC, poiché a volte produce codice più veloce.) Qualcuno sa perché è ignorato? Il ramo GCC di Apple è troppo vecchio? In una nota a margine, nella funzione su cui lo sto usando, i loop vengono srotolati comunque finché uso -O3. – Simplex

+0

Ho appena provato '__attribute __ ((optimize (" unroll-loops ")))' con un po 'di codice incorporato e ha migliorato la velocità solo del 3%. Srotolare manualmente 8 volte la velocità migliorata del 12% e non aumentare le dimensioni del programma. – endolith

+0

Il mio gcc dice avvertimento: ignorare #pragma ottimizzare ... È sempre disponibile? – neodelphi

3

-funroll-loops potrebbe essere utile (anche se si attiva il ciclo di srotolamento a livello globale, non per ciclo). Io non sono sicuro se c'è un #pragma a fare lo stesso ...

+0

nah Ho trovato anche questo, ma voglio solo srotolare un ciclo specifico – Nils

+0

bmei da broadcom avere un set di patch per aggiungere "#pragma srotolare" il supporto per gcc. – osgx

+1

@Jerry Coffin, Come posso usarlo? Puoi darmi un comando che usi -funroll-loop? –

Problemi correlati