Bucle desenrollado

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 13 de diciembre de 2019; la verificación requiere 1 edición .

En programación, el desenrollado de bucles ( eng.  loop unwinding ) o desenrollado de bucles ( eng.  loop unrolling ) es una técnica para optimizar programas informáticos , que consiste en aumentar artificialmente el número de instrucciones ejecutadas durante una iteración del bucle . Como resultado de la aplicación de esta optimización, aumenta el número de instrucciones que potencialmente se pueden ejecutar en paralelo y se hace posible un uso más intensivo de registros , caché de datos y unidades de ejecución.

Ejemplo

ent i ; para ( yo = 1 ; yo < norte ; yo ++ ) { a [ yo ] = ( yo % b [ yo ]); }

convertido a este código:

ent i ; para ( yo = 1 ; yo < n - 3 ; yo += 4 ) { a [ yo ] = ( yo % b [ yo ]); un [ yo + 1 ] = (( yo + 1 ) % segundo [ yo + 1 ]); un [ yo + 2 ] = (( yo + 2 ) % segundo [ yo + 2 ]); un [ yo + 3 ] = (( yo + 3 ) % segundo [ yo + 3 ]); }

Este tipo de optimización se considera en detalle, por ejemplo, en Generalized Loop-Unrolling [1] . Esto (junto con la división del cuerpo del ciclo ) bajo ciertas condiciones (la ausencia de dependencias de datos entre las instrucciones en el nuevo ciclo) le permite ejecutar el ciclo en varios procesadores .

También hay una forma inusual de desenredar un bucle, llamada " dispositivo Duff ", - de esta manera, se utilizan características poco conocidas y no obvias de la sintaxis del lenguaje C.

Desventajas

Una de las desventajas de este método de optimización, cuando se usa junto con la división del cuerpo del ciclo para una mayor paralelización, es que la obtención de datos de la memoria comienza a realizarse fuera del orden de los datos, lo que puede afectar negativamente la eficiencia de la memoria caché. Otro tipo de optimización más apropiado que hace un mejor uso de las memorias caché del procesador es la paralelización de bucles .

Además, durante el desenrollado del bucle, aumenta el número de comandos ejecutados en cada iteración. Si este número excede la capacidad de la memoria caché de instrucciones, entonces, en lugar del aumento esperado en la eficiencia de la ejecución del ciclo, es posible su disminución significativa.

Notas

  1. ↑ JC Huang , T. Leng, Despliegue de bucle generalizado: un método para acelerar el programa, 1998 

Enlaces

  1. https://web.archive.org/web/20070422143153/http://www.insidepro.com/kk/036r.shtml
  2. https://web.archive.org/web/20090301182759/http://www.intel.com/cd/software/products/asmo-na/eng/compilers/277618.htm#hlo