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
risposta
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
epop_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.
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
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
Il mio gcc dice avvertimento: ignorare #pragma ottimizzare ... È sempre disponibile? – neodelphi
-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 ...
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
Heh puoi farlo usando i macro? Probabilmente no, quindi è sufficiente scriverlo l'unica cosa rimasta? – Nils
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