2012-03-26 10 views
12

En nuestra arquitectura incorporada tenemos un IAB de 64 bits (Buffer de alineación de instrucciones). Para optimizar la secuencia de búsqueda, se requiere que el cuerpo de un bucle comience alineado a un límite de 8 bytes.Cómo alinear el cuerpo C for-loop w/GCC?

Es fácil lograr esto en el ensamblaje utilizando la directiva .balign, pero no puedo encontrar una sintaxis que sugiera que el compilador de C alinee el código.

Intentar preceder al bucle for con el montaje en línea con la directiva .balign no funciona, ya que alinea el prólogo de bucle for (configuración) y no el cuerpo del bucle en sí.

Haciendo lo mismo donde la línea asm() está dentro del lazo, agrega nop -s al cuerpo del lazo que cuesta ciclos preciosos.

EDIT 1: asume el código:

__asm__ volatile("nop"); 
    __asm__ volatile("nop"); 

    for (j0=0; j0<N; j0+=4) 
    { 
     c[j0+ 0] = a[j0+ 0] + b[j0+ 0]; 
     c[j0+ 1] = a[j0+ 1] + b[j0+ 1]; 
     c[j0+ 2] = a[j0+ 2] + b[j0+ 2]; 
     c[j0+ 3] = a[j0+ 3] + b[j0+ 3]; 
    } 

Quiero que la primera c=a+b a alinearse a una dirección de 8 bytes. Puedo agregar el nop -s como arriba después de una compilación preliminar, pero esta es una solución ad-hoc que se romperá con el primer cambio de código.

EDIT 2: Gracias a @R .., la solución es usar la opción del compilador -falign-loops=8.

+0

Entonces, en esencia, quiere 'nop'-s que haga que el bucle * body * esté alineado, pero quiere que esos' nop'-s vayan antes del bucle * prolog *? – ruakh

+0

@ruakh - sí, aunque no me importa si los 'nop'-s se generan en el propio prólogo, siempre que la instrucción de bifurcación al final del bucle apunte a una ubicación de memoria alineada. – ysap

+0

Entendido. ¡Esta es una gran pregunta! – ruakh

Respuesta

3

Umm, ¿no es esto lo que la opción -falign-loops de GCC es para?

+0

Sí, pero ¿y si quieres afectar un solo bucle solamente? ¿GCC tiene alguna solución? –

+1

Para una sola función, puede usar '#pragma GCC optimize' o los atributos equivalentes. Sin embargo, no sé si puedes hacerlo en el nivel de bucle único. Si no hay otra manera, podrías lograr esto con un truco horrible al poner el bucle en una función anidada y poner el atributo en la función anidada ...? –

+0

La optimización dirigida de una sola función es aún mucho mejor que la opción de todo el proyecto, ya que puede ser buena en algunas circunstancias (bucles calientes) y mala en otras (bucles raros). Desafortunadamente, ni '#pragma GCC optimize" align-loops = xx "' ni '__attribute __ ((optimize (" align-loops = xx ")))' parecen producir algún efecto en mis pruebas (el mismo 'md5sum' en binarios generados). – Cyan

Cuestiones relacionadas