¿Todos los datos de una computadora deben seguir la jerarquía de la memoria o, por ejemplo, los datos de la memoria RAM pueden omitir la memoria caché e ir directamente a los registros?

La mayoría de los datos navegarán a través de la jerarquía de memoria de manera predeterminada, pero se pueden incorporar excepciones en la computadora; Puedo pensar en al menos tres ejemplos.

Extensiones de transmisión SIMD (SSE) en CPU x86 y sus sucesores

Los programas de usuario pueden acceder a las operaciones de SSE: si no confía en que su compilador las inserte, se pueden programar explícitamente utilizando un conjunto de intrínsecos que son un poco más convenientes que la inyección de un ensamblaje escrito a mano.

La familia _mm_store de intrínsecos generalmente escribe en ubicaciones de memoria (alineadas) a través del caché, pero también vienen en versiones de _mm_stream coincidentes. El último omite los cachés, excepto para actualizar las copias que ya se almacenaron en caché, de modo que pueda escribir datos que no volverá a utilizar sin el efecto secundario de llenar innecesariamente la jerarquía de memoria.

Contadores de rendimiento

En primer lugar, algunos datos no provienen de la memoria, las CPU modernas recopilan métricas de su propio comportamiento, como su número de instrucciones enteras y operaciones de punto flotante retiradas, temperatura de operación, consumo de energía, etc.

Este tipo de datos puede aparecer en registros de propósito especial para que los programas lo lean sin tocar su espacio de direcciones. La condición de la CPU no es parte del estado lógico del programa, por lo que no se aplica la jerarquía de memoria.

Memoria del depósito atómico en la línea SGI Origin

Este caso puede estar listo para los libros de historia en este momento, pero las máquinas SGI Origin se diseñaron como multiprocesadores de memoria compartida grandes (en ese momento), lo que hizo que fuera natural incluir soporte arquitectónico para la sincronización.

IRIX lucía un conjunto adicional de llamadas gratuitas / asignadas, permitía que los programas de usuario obtuvieran fragmentos de una memoria de depósito atómico separada, que admitía un conjunto de operaciones que garantizaban la atomicidad entre todas las CPU del sistema. Poner partes de esa memoria en cachés locales solo habría producido los problemas de consistencia que se diseñó para evitar en primer lugar, por lo que las transferencias omitieron el almacenamiento en caché en ambas direcciones.

Debe haber una gran cantidad de otros ejemplos, estos son justo lo que se me ocurrió.
De todos modos, no es absolutamente necesario que todos los datos sigan la jerarquía de memoria, pero los programas que hacen uso de funciones para omitirla probablemente están haciendo algo específico del sistema que afecta su portabilidad a otras computadoras.

En teoría sí. Partes del espacio de direcciones se pueden marcar como no almacenables en caché, y en principio se podría implementar memoria en esos espacios de direcciones.

También puede darse el caso de que ciertas funciones de diagnóstico de memoria o caché puedan beneficiarse de algo como esto.

Pero generalmente, la configuración no almacenable en caché se usa para E / S mapeadas en memoria y no para la memoria principal.