Loop unswitching es una optimización del compilador . Mueve un condicional dentro de un bucle fuera de él duplicando el cuerpo del bucle y colocando una versión del mismo dentro de cada una de las cláusulas if y else del condicional. [1] Esto puede mejorar la paralelización del bucle. Dado que los procesadores modernos pueden operar rápidamente en vectores, esta mejora aumenta la velocidad del programa.
He aquí un ejemplo sencillo. Supongamos que queremos añadir las dos matrices X e Y , y también hacemos algo en función de la variable w . Tenemos el siguiente código C :
int i , w , x [ 1000 ], y [ 1000 ]; para ( i = 0 ; i < 1000 ; i ++ ) { x [ i ] + = y [ i ]; si ( w ) y [ i ] = 0 ; }
El condicional dentro de este bucle dificulta la paralelización segura de este bucle. Cuando desactivamos el bucle, esto se convierte en:
int i , w , x [ 1000 ], y [ 1000 ]; si ( w ) { para ( i = 0 ; i < 1000 ; i ++ ) { x [ i ] + = y [ i ]; y [ i ] = 0 ; } } más { para ( i = 0 ; i < 1000 ; i ++ ) { x [ i ] + = y [ i ]; } }
Si bien la desconexión del bucle puede duplicar la cantidad de código escrito, cada uno de estos nuevos bucles ahora se puede optimizar por separado.
La desactivación de bucles se introdujo en gcc en la versión 3.4. [2]