2011-05-16 9 views
5

Acabo de leer este artículo bastante interesante, Copying Accelerated Video Decode Frame Buffers.cargas de transmisión y memoria no USWC

Donde explican cómo hacer copias de la memoria USWC lo más rápido posible usando cargas continuas.

Mi pregunta es por qué esta técnica no también podría acelerar las copias normales, desde la memoria no USWC?

Una carga de transmisión leería toda una línea de caché de una sola vez en lugar de la carga normal que solo carga 16 bytes a la vez. ¿Qué me estoy perdiendo? Y copiar desde un búfer de relleno al "búfer de caché" que se escribirá en la memoria caché no puede tener una sobrecarga, ¿o sí?

+0

+1 por título sugerente (Una carga humeante se vierte mejor en bruto) – sehe

+0

La descripción en su último párrafo es completamente al revés. La carga/almacenamiento en tiempo real significa que ** se pasa por alto ** la memoria caché, mientras que la carga/almacenamiento regular ('MOVDQA') se realiza con la ayuda de la memoria caché. También tenga en cuenta que una única línea de caché suele ser más ancha que la longitud del registro SIMD en cada arquitectura. – rwong

Respuesta

6

De http://software.intel.com/en-us/articles/increasing-memory-throughput-with-intel-streaming-simd-extensions-4-intel-sse4-streaming-load/

"La instrucción de carga de streaming está destinado a acelerar la transferencia de datos desde el tipo de memoria USWC. Para otros tipos de memoria tales como cacheable (BM) o no almacenable en caché (UC), la instrucción se comporta como un típico 16 -byte MOVDQA load instruction. Sin embargo, futuros procesadores pueden usar la instrucción de carga de transmisión para otros tipos de memoria (como WB) como una sugerencia de que la línea de caché deseada debe ser transmitida desde la memoria directamente al núcleo mientras se minimiza la contaminación del caché ".

Es decir, la memoria "normal" es WB y, por lo tanto, no hay ninguna ventaja al usar cargas/almacenes no temporales en comparación con los normales. Además, para la memoria cachable normal, la primera carga de una línea de caché atraerá toda la línea de caché a L1, de forma similar a cómo la primera carga no temporal extraerá una línea de caché completa en el "buffer no temporal" especial.

Como dice la cita anterior, los procesadores futuros pueden usar la carga/almacenamiento no temporal como una sugerencia para no contaminar el caché. ¿Cuál podría ser una buena idea en algunos casos, pero tal vez no sea la elección correcta para una implementación de memcpy() de propósito general?

+0

A la derecha, la salida 'memcpy' a menudo se usa de inmediato, por lo que puede obtener un' memcpy' más rápido, pero el código justo después podría ser ralentizado por todos los errores de caché. (ver http://svn.0x00ff00ff.com/mirror/package/avisynth/x86/FilterSDK/IsMovntqFaster.htm) –

Cuestiones relacionadas