Los microprocesos para procesadores de varios núcleos y muchos núcleos es un mecanismo para ocultar la latencia de la memoria similar a las arquitecturas de múltiples subprocesos. Sin embargo, se realiza en software para procesadores de varios núcleos, como Cell Broadband Engine, para ocultar de forma dinámica las latencias que se producen debido a la latencia de la memoria o las operaciones de E / S.
Introducción
Micro-threading es un marco de trabajo de subprocesos basado en software que crea pequeños subprocesos dentro de procesadores de varios núcleos o muchos núcleos. Cada núcleo puede tener dos o más subprocesos diminutos que utilizan su tiempo de inactividad. Es como el hiperprocesamiento inventado por Intel o la arquitectura general de subprocesos múltiples en los microprocesadores modernos. Permite la existencia de más de un subproceso que se ejecuta en el mismo núcleo sin realizar un costoso cambio de contexto a la memoria principal del sistema, incluso si este núcleo no tiene lógica de hardware de subprocesos múltiples . Los microprocesos ocultan principalmente la latencia de la memoria dentro de cada núcleo superponiendo los cálculos con las solicitudes de memoria. La principal diferencia entre los micro-subprocesos y los modelos de subprocesos actuales es que la sobrecarga de cambio de contexto de los micro-subprocesos es muy pequeña. Por ejemplo, la implementación de microprocesos generales en Cell Broadband Engine es de 160 nano segundos; mientras tanto, la sobrecarga de cambio de contexto del hilo de todo el núcleo (SPE) es de alrededor de 2000 microsegundos. Esta baja sobrecarga se debe a tres factores principales. Primero, los microhilos son muy pequeños. Cada micro-hilo ejecuta una o dos funciones simples pero críticas. En segundo lugar, el contexto de los microhilos incluye solo el archivo de registro del núcleo en el que se está ejecutando actualmente el microhilo. En tercer lugar, los microprocesos se cambian de contexto a la memoria caché dedicada del núcleo, lo que hace que este proceso sea muy rápido y eficiente.
Fondo
A medida que los microprocesadores se vuelven más rápidos, principalmente debido a que los núcleos se agregan cada pocos meses, la brecha de latencia de la memoria se hace más amplia. La latencia de la memoria era de pocos ciclos en 1980 y actualmente alcanza casi los 1000 ciclos. Si el microprocesador tiene suficientes núcleos y, con suerte, no están enviando solicitudes a la memoria principal al mismo tiempo, habrá una ocultación agregada parcial de la latencia de la memoria. Es posible que algunos núcleos se estén ejecutando mientras que otros esperan la respuesta de la memoria. Esta no es la mejor situación para los procesadores de varios núcleos. Los expertos en informática de alto rendimiento se esfuerzan por mantener todos los núcleos ocupados todo el tiempo. Entonces, si cada núcleo se mantiene ocupado todo el tiempo, es posible una utilización completa de todo el microprocesador. La creación de subprocesos basados en software no resolverá el problema por una razón obvia. La conmutación de subprocesos de contexto a la memoria principal es una operación mucho más cara en comparación con la latencia de la memoria. Por ejemplo, en el contexto del motor de banda ancha celular, la conmutación de cualquiera de los subprocesos del núcleo toma 2000 microsegundos en el mejor de los casos. Algunas técnicas de software como el almacenamiento en búfer doble o múltiple pueden resolver el problema de latencia de la memoria. Sin embargo, se pueden usar en algoritmos regulares, donde el programa sabe dónde está el siguiente fragmento de datos para recuperar de la memoria; en este caso envía la solicitud a la memoria mientras procesa los datos de la solicitud anterior. Sin embargo, esta técnica no funcionará si el programa no conoce el siguiente fragmento de datos para recuperar de la memoria. En otras palabras, no funcionará en algoritmos combinatorios, como la distribución de árboles o la clasificación de listas aleatorias. Además, el almacenamiento en búfer múltiple asume que la latencia de la memoria es constante y puede ocultarse estáticamente. Sin embargo, la realidad muestra que la latencia de la memoria cambia de una aplicación a otra. Depende de la carga general de los recursos compartidos del microprocesador, como la tasa de solicitudes de memoria, interconexiones de núcleos compartidos.
Implementación actual
Actualmente, los microprocesos están implementados en Cell Broadband Engine . [1] Se podría lograr una mejora del rendimiento de tres a cinco veces. Actualmente está probado para algoritmos regulares y combinatorios. Algunos otros esfuerzos están tratando de probar su viabilidad para algoritmos científicos.
Actuación
Los microprocesos proporcionan una muy buena solución para ocultar mejor la latencia de la memoria en función de la utilización del microprocesador en tiempo de ejecución. Por ejemplo, si la latencia de la memoria es muy alta en comparación con el tiempo de procesamiento y cambio de contexto, se pueden agregar más microprocesos; esto sucede cuando se solicitan grandes fragmentos de datos de la memoria o hay muchos puntos de acceso de memoria. Si esta ración es pequeña, es posible que se introduzcan menos microprocesos en tiempo de ejecución. Esto depende de factores relacionados con la aplicación implementada y los factores de tiempo de ejecución del sistema.
Crítica
Aunque los microprocesos proporcionan un modelo prometedor para ocultar la latencia de la memoria para procesadores de varios núcleos y múltiples núcleos, tiene algunas críticas importantes que deben abordarse:
- Requiere soporte de hardware especial. Cada núcleo debe tener su propia función de interrupción local para programar de manera eficiente los microprocesos. Sin embargo, si se sigue la política de programación no preventiva, no se requiere la función de interrupción incorporada.
- Funciona mejor cuando cada núcleo tiene su propia caché local que es administrada manualmente por el programador.
- Agregar más micro-subprocesos por núcleo aumenta drásticamente la carga en los recursos compartidos del microprocesador. Más solicitudes de memoria y sincronización probablemente crearán congestiones en los recursos compartidos. Sin embargo, este problema puede mitigarse mediante la supervisión del sistema en tiempo de ejecución de las medidas críticas del microprocesador, como la latencia de la memoria, y en consecuencia ralentizar la ejecución general ya sea reduciendo los microprocesos o modificando la política de programación.
Referencias
- ^ Ahmed, M .; R. Ammar; S. Rajasekaran (2008), "SPENK: añadiendo otro nivel de paralelismo en el motor de banda ancha celular" (pdf) , 1er foro internacional sobre tecnologías multinúcleo / manycore de próxima generación , El Cairo, Egipto: ACM, págs. 1-10 , recuperado 2009-03-04