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 ...
- 1. clang: Force loop srotolare per loop specifico
- 2. C'è un modo per srotolare i loop in un kernel OpenCL di AMD con il compilatore?
- 3. Come dire a distutils di usare gcc?
- 4. Come chiedere a GCC di srotolare completamente questo ciclo (ad esempio, sbucciare questo ciclo)?
- 5. In che modo GCC può srotolare un ciclo se il suo numero di iterazioni è sconosciuto al momento della compilazione?
- 6. GCC: come dire a GCC di inserire la funzione 'main' all'inizio della sezione .text?
- 7. gcc arithmetics simple loop performance
- 8. loop fino a quando un utente specifico ingresso
- 9. Come dire a Bootstrap Carousel di andare a un indice specifico?
- 10. ArrayList Srotolare
- 11. srotolare/argomenti splat in Common Lisp
- 12. Segue srotolare per UINavigationController
- 13. Aggiunta di un passaggio a gcc?
- 14. C'è un modo per dire a Dropbox di non caricare un determinato file? (Relativo a Eclipse)
- 15. Come dire a oracle di ordinare secondo uno specifico ordine di ordinamento passato da java?
- 16. Come dire a GCC che un argomento del puntatore è sempre allineato con due parole?
- 17. Perché GCC non auto-vectorize questo loop?
- 18. Puntatore a un indirizzo fisso specifico
- 19. Si aggiunge a una lista vuota usando un loop in loop a riga singola
- 20. C'è un modo per dire a Mercurial di mettere i file .orig in una directory separata?
- 21. C'è un modo per dire esplicitamente a PyCharm di quale classe un attributo è un'istanza?
- 22. C'è un modo per dire se un font supporta un determinato personaggio in Imagick?
- 23. C'è un modo per dire a NServiceBus di non riprovare un messaggio?
- 24. Come dire a Python di convertire numeri interi in parole
- 25. Come fermare un loop infinito in modo sicuro in Python?
- 26. C'è un modo per disabilitare ReSharper per un file specifico?
- 27. C'è un modo più semplice per dire a HTTPBuilder di ignorare un certificato non valido?
- 28. Il modo migliore per dire a swaggerui dove l'host è
- 29. C'è un modo per evitare i loop quando si aggiunge a un elenco?
- 30. Continua un'iterazione in C++ fino a un numero di iterazione specifico in gdb
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