martes, 29 de abril de 2008
3.3.- COMPILADORES OPTIMIZANTES AVANZADOS
El software de SPARC-V9 puede explicitamente realizar prebusqueda de datos e instrucciones [1] reduciendo la latencia de la memoria y en consecuencia acelerando ejecución de las aplicaciones. En lo casos en que los compiladores puedan generar código para realizar prebusqueda de datos e instrucciones con la suficiente anticipación, el dato estará disponible tan pronto como el programa lo necesite, lo que reducirá considerablemente las perdidas de cache y las paradas del pipeline.
SPARC-V9 también soporta LOADs sin fallos, lo que permite a los compiladores mover instrucciones LOAD antes de estructuras de control condicionales que vigilan su uso. La semántica de estos LOADs sin fallos es la misma que la de los otros LOADs, excepto que cuando ocurre un fallo no recuperable como pueda ser un error de ``dirección fuera de rango´´. Entonces, estos fallos son ignorados, y el hardware y el software del sistema operativo cooperan para aparentar una ejecución normal, retornando el valor cero.
Esta optimización es particularmente útil cuando se optimiza para procesadores superescalares. Por ejemplo, consideremos el siguiente fragmento de un programa en C:
if(p != NULL) x= *p + y;
Con LOADs sin fallos, la carga de *p puede ser desplazada hacia arriba por el compilador antes del chequeo de p!=NULL, permitiendo ejecuciones solapadas. En contraste, un LOAD normal habría abortado el programa en el caso de haberse realizado esta optimización y p ser igual a NULL. El efecto global es equivalente a esta transformación:
temp_register= *p;
if(p != NULL) x= temp_register + y;
Supongamos un procesador superescalar que pueda ejecutar cuatro instrucciones por ciclo, pero que sólo una de ellas pueda ser un LOAD o un STORE. En un bucle de ocho instrucciones que contenga dos LOADs, puede verse que sin esta transformación no sería posible distribuir ninguno de los LOADs en el primer grupo de cuatro instrucciones. En este caso, un tercer o posiblemente cuarto ciclo de reloj podría ser necesario para cada iteración del bucle, en lugar de los dos ciclos mínimos. Mejorar las oportinidades para una mejor distribución de las instrucciones podría haber mejorado las prestaciones en un factor de dos para este ejemplo. Una buena planificación (scheduling) de las intrucciones es un factor crítico en el rendimiento de las aplicaciones.
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario