2010-11-01 6 views
35

¿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

+6

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

+0

¿Puede hacerlo usando macros? Probablemente no, así que solo escribirlo es lo único que queda? – Nils

+6

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

Respuesta

43

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 y pop_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.

+1

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

+0

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

+0

Mi gcc dice advertencia: ignorando #pragma optimizar ... ¿Está siempre disponible? – neodelphi

3

-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 ...

+0

nah Lo encontré también, pero quiero simplemente desenrollar un bucle específico – Nils

+0

bmei de broadcom tiene un conjunto de parches para agregar soporte "#pragma unroll" a gcc. – osgx

+1

@Jerry Coffin, ¿cómo puedo usarlo? ¿Me puede dar un comando que utiliza -funroll-loop? –

Cuestiones relacionadas