2012-01-26 6 views
6

Es bien sabido que acceder a la memoria de una sola manera es lo mejor para el rendimiento.¿Debo preferir pasar un acceso de memoria para leer o escribir?

En situaciones en las

  • debo acceder una región de la memoria para la lectura,
  • debo acceder a otra región para escribir, y
  • sólo puedo acceder a una de las dos regiones en un paso grande una moda,

¿Debo preferir leer stride one o escribir stride one?

Un ejemplo simple y concreto es una operación de copia y permutación similar a BLAS como y := P x. La matriz de permutación P está definida completamente por algún vector de permutación q(i). Tiene un vector de permutación inversa correspondiente qinv(i). Uno podría codificar el bucle requerido como y[qinv(i)] = x[i] o como y[i]=x[q(i)] donde el anterior lee x stride one y el último escribe y stride one.

Idealmente, uno siempre podría codificar ambas posibilidades, perfilarlas en condiciones representativas y elegir la versión más rápida. Imagina que solo puedes codificar una versión, ¿qué patrón de acceso esperarías siempre que fuera más rápido en función del comportamiento de las arquitecturas de memoria modernas? ¿Funciona el trabajo en un entorno enhebrado cambiar tu respuesta?

+0

No es muy conocido por mí. :-) No lo entiendo Si pudiera dar un ejemplo en C, tal vez podría dar una respuesta, pero en OTOH puede que no esté interesado en una respuesta mía si no obtengo lo que es un BLAS ... ;-) –

+0

Las BLAS son las Subprogramas básicos de álgebra lineal (http://netlib.org/blas/), un conjunto de componentes numéricos de alto rendimiento comúnmente implementados por los proveedores. –

Respuesta

4

El patrón de acceso, que el nombre "escribe stride one" (y[i]=x[q(i)]), suele ser más rápido.

Si la memoria está en caché y sus piezas de datos son más pequeñas que la línea de caché, este patrón de acceso requiere menos ancho de banda de memoria.

Es habitual que los procesadores modernos tengan más unidades de ejecución de carga que las unidades de tienda. Y la próxima arquitectura de Intel, llamada Haswell, solo admite instrucción GATHER, mientras que SCATTER aún no está en sus planes. Todo esto es también a favor del patrón "escribe un paso adelante".

Trabajar en un entorno con hebras no cambia esto.

+0

Gracias Evgeny. –

Cuestiones relacionadas