¿Cómo puedo decirle a GCC que desenrolle un ciclo en particular? He utilizado CUDA SDK donde los lazos se pueden desenrollar manualmente usando #pragma unroll
. ¿Hay alguna característica similar para gcc? Busqué en Google un poco pero no pude encontrar nada.Indica a gcc que desenrolle específicamente un ciclo
Respuesta
GCC le da algunas maneras diferentes de tratar esto:
Uso directivas #pragma, como
#pragma GCC optimize ("string"...)
, como se ha visto en el GCC docs. Tenga en cuenta que pragma realiza las optimizaciones global para las funciones restantes. Si utilizó#pragma push_options
ypop_options
macros inteligentemente, que probablemente se podría definir esta en torno a sólo una de las funciones de este 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
Anotar funciones individuales con sintaxis de atributo de GCC: comprobar los GCC function attribute documentos para una disertación más detallada sobre la tema. Un ejemplo:
//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: no estoy seguro de lo bueno GCC está en desenrollar bucles iterados-atrás (lo hice para llegar de rebajas para jugar agradable con mi código). Los ejemplos deberían compilar bien, sin embargo.
Es genial que haya un atributo de función para esto, sin embargo, es ignorado por el último GCC de Apple para iOS: "warning: 'optimize' attribute directive ignored". (Sé que pasaron a LLVM, pero sigo usando GCC algunas veces, ya que a veces produce código más rápido). ¿Alguien sabe por qué se ignora? ¿La rama de GCC de Apple es demasiado antigua? En una nota al margen, en la función en la que he estado usándolo, los bucles se desenrollan de todos modos siempre que use -O3. – Simplex
Acabo de probar '__attribute __ ((optimize (" unroll-loops ")))' con un código incrustado y mejoró la velocidad solo un 3%. Desenrollando manualmente 8 veces mejoró la velocidad en un 12% y no aumentó tanto el tamaño del programa. – endolith
Mi gcc dice advertencia: ignorando #pragma optimizar ... ¿Está siempre disponible? – neodelphi
-funroll-loops
puede ser útil (aunque activa el despliegue de bucle globalmente, no por bucle). No estoy seguro de si hay un #pragma
a hacer lo mismo ...
- 1. ¿Es posible llevar a GCC a un ciclo infinito?
- 2. ¿gcc optimiza mi ciclo con la condición?
- 3. Desenrolle/argumentos splat en Common Lisp
- 4. ¿Cómo optimiza GCC una variable no utilizada que se incrementa dentro de un ciclo?
- 5. ¿Cómo funciona un bucle for, específicamente para (;;)?
- 6. ¿Cómo comprobar que un ResultSet contiene un campo específicamente nombrado?
- 7. ¿Por qué GCC no auto-vectorizará este ciclo?
- 8. ¿Qué causa específicamente que se genere EPrivilege?
- 9. Indica a un proceso de AJAX que el trabajo retrasado ha completado
- 10. En Perl, ¿es un ciclo while generalmente más rápido que un ciclo for?
- 11. Agregar un módulo (Específicamente pymorph) a Spyder (Python IDE)
- 12. elementos largos ListBox indica
- 13. Macro que indica las clavijas de E/S utilizadas
- 14. salida de la consola longitud de bits que indica desbordamiento
- 15. Invocando a GCC como "cc" frente a "gcc"
- 16. Debo usar la última versión de GCC (en general, y específicamente hoy)
- 17. ¿Es posible revertir una lista vinculada que contiene un ciclo?
- 18. ¿Cómo optimizar un ciclo?
- 19. Node.js y Redis; Esperando que termine un ciclo
- 20. ¿Cómo le indica a NUnit que cargue el archivo dll.config de un ensamblaje desde un directorio específico?
- 21. IPython OS X: flecha hacia arriba indica "^ [[A"
- 22. Haga que Eclipse importe automáticamente clases en archivos jsp específicamente
- 23. Python, próxima iteración del ciclo sobre un ciclo
- 24. ¿Cómo puedo formatear como se indica a continuación?
- 25. git indica que una rama no se fusionó después de volver a basar, ¿por qué?
- 26. ¿Hay un ciclo de "inicio"?
- 27. ¿Qué indica que una celda Office Open XML contiene un valor de fecha/hora?
- 28. ¿Por qué Get-Date parece devolver objetos DateTime, pero el BinarySerializer indica que devuelve un PSObject?
- 29. ¿El retorno detiene un ciclo?
- 30. Necesito un ciclo que itera a través del intervalo de fechas
No puedo creer que voy a decir esto. Si no encuentras nada más, siempre hay ... Dispositivo de Duff. Ahora, ¿dónde * lo * puse el látigo de ese penitente? Sé que está por aquí en alguna parte ... – dmckee
¿Puede hacerlo usando macros? Probablemente no, así que solo escribirlo es lo único que queda? – Nils
Con toda seriedad, sugiero buscar una compilación separada de ese bit con '-funroll-loops' antes de usar el dispositivo de Duff: es algo hermoso de estudiar, pero algo feo de tener en tu código. – dmckee