2010-06-01 26 views
11

Quiero saber si un programa que estoy usando y que requiere mucha memoria está limitado por el ancho de banda de la memoria.¿Cuándo un programa está limitado por el ancho de banda de la memoria?

¿Cuándo espera que ocurra esto? ¿Alguna vez te pasó en un escenario de la vida real?

he encontrado varios artículos sobre este tema, incluyendo:

El primer enlace es un poco viejo, pero sugiere que es necesario realizar menos de aproximadamente 1-40 operaciones de coma flotante por variable de coma flotante para ver este efecto (corríjame si estoy equivocado).

¿Cómo puedo medir el ancho de banda de memoria que está usando un programa dado y cómo mido el ancho de banda (máximo) que mi sistema puede ofrecer?

No quiero discutir ningún problema complicado de caché aquí. Solo me interesa la comunicación entre la CPU y la memoria.

+2

Lamentablemente, no puede evitar entrar en problemas de caché complicados si quiere una respuesta a su pregunta – erikkallen

+0

Hm, supongamos que inicializo toda la memoria con 1.0s. Luego multiplico cada elemento con un número constante. Y repita ese proceso ... – hanno

+0

Acceder a toda la memoria va a causar que esté limitado por el ancho de banda de la memoria, a menos que el intervalo entre los elementos accedidos sea muy largo. Que, por lo que parece, no lo será. –

Respuesta

7

Para referencia de rendimiento de memoria de su sistema de prueba el STREAM benchmark. Estudie las tareas de referencia y los resultados que obtiene con cuidado ya que proporcionan los datos básicos sobre su memoria que necesita para hacer algo más. Necesitas descubrir el (los) efecto (es) de la (s) memoria (s) caché (s), tienes que entenderlos, y cuando el ancho de banda alcanza un pico.

para averiguar el rendimiento de la memoria de su programa:

  1. Medir el tiempo de ejecución para una gama de tamaños de problemas.
  2. Calcular, a mano, la cantidad de datos que su programa lee y escribe desde y hacia la memoria de la misma gama de tamaños de problemas.
  3. Divida el uso de memoria por tiempo.

ADVERTENCIA: este es un enfoque crudo y solo debe utilizarse para determinar si debe prestar atención a los problemas de ancho de banda de memoria. Si su cálculo crudo le dice que su programa utiliza menos del 50% del ancho de banda de memoria disponible (las cifras que obtuvo de la prueba comparativa de STREAM), entonces no debe pensarlo más.

Este enfoque crudo funciona mejor cuando el programa manipula relativamente pocas estructuras de datos muy grandes con patrones de acceso simples. Esto describe una gran cantidad de programas científicos de alto rendimiento, pero tal vez no muchos otros tipos de programas.

Si su programa está usando memoria virtual o si está haciendo E/S mientras se ejecuta, entonces el ancho de banda de la memoria no es un problema, hasta que no solucione el ancho de banda del disco.

Finalmente, sí, cada vez que ejecuto uno de nuestros códigos científicos, la velocidad de ejecución está limitada por el ancho de banda de la memoria. Como regla general, si un código ejecuta el 10% de los FLOPS que promete la especificación del procesador, estoy contento.

+0

Gracias. Probaré eso... – hanno

3

El alcance amplio y general de su pregunta hace que sea casi imposible responder en más que en el sentido más amplio. Puede esperar un programa vinculado a la CPU cuando el número de ciclos requeridos para procesar una línea de datos en caché es menor que el número de ciclos requeridos para leer una línea de caché y el conjunto de datos procesados ​​es considerablemente mayor que la memoria caché de datos de la CPU. El procesamiento de imágenes es un ejemplo en el que a menudo es el caso.

¿Cómo puedo medir el ancho de banda de memoria que está usando un programa dado y cómo mido el ancho de banda (máximo) que mi sistema puede ofrecer? El primero solo se puede medir (en software) si la CPU admite algún tipo de contador de rendimiento que cuente el número de ciclos que la CPU está detenida porque tiene que esperar a que se complete el acceso a la memoria.
El segundo se puede medir fácilmente, normalmente rellenar/copiar grandes áreas de memoria. Hay innumerables programas de referencia disponibles que puede usar (no he usado ninguno en años, pero me vienen a la mente Sandra y PCMark. Debe haber muchas utilidades gratuitas que también lo hagan).

6

aplicaciones intensivas de memoria o aplicaciones que requieren mucha memoria están restringidas por:

  1. velocidad de RAM fuera del procesador
  2. velocidad de caché dentro del procesador
  3. Número de entidades que comparten la memoria
  4. bus
  5. memoria virtual

Desafortunadamente, Ts Las limitaciones no son jugadores importantes en el desempeño de un programa. Los efectos más grandes son: Cantidad de CPU, operaciones de E/S y otras tareas que se ejecutan con su programa. Cambiar estos elementos afectará su programa más que cambiar elementos que afectan el ancho de banda de la memoria.

1. Velocidad de RAM fuera del procesador
El procesador debe salir fuera de sus instrucciones y datos de concha y de agarre de la RAM. La RAM tiene velocidades diferentes a las que puede acceder a las celdas y devolver los bits al procesador. En general, esto está marcado en unidades de Hz. Cuanto más rápida sea la memoria, menos tiempo invertirá su proceso en cargar instrucciones e información, y más rápido se ejecutará su programa.

Nota: Aumentar la velocidad de la memoria más allá de las capacidades del procesador no aumentará el rendimiento. Cambia el cuello de botella de la RAM al procesador. Ver también # 3.

2. Velocidad de caché dentro de la memoria caché del procesador reside dentro de la cáscara del procesador. Este es uno de los tipos de memoria más rápidos disponibles. Los procesadores buscarán esta memoria antes de buscar RAM. La mejora de la velocidad y la cantidad de esta memoria mejorará el rendimiento de su procesador, , a menos que otros núcleos también accedan a esta memoria. Para múltiples núcleos que acceden a la memoria, es necesario que haya resolución de conflictos, lo que puede ralentizar el rendimiento de las aplicaciones.

Nota: No hay nada que pueda hacer para acelerar o cambiar el tamaño de la memoria caché, excepto obtener otro procesador. La memoria caché no es algo que pueda ser cambiado fácilmente por manos humanas o robóticas.

3. Número de entidades que comparten el bus de memoria bus
La memoria es como una carretera que utilizan las entidades para llegar a la RAM. Al igual que con una carretera, más carriles significa un rendimiento más rápido (por ejemplo, ancho de 16 bits frente a 32 bits). Muchos autobuses también tienen un límite de velocidad; una vez más, cuanto mayor sea el límite, más rápido será el acceso. Probablemente el concepto más notable es la cantidad de entidades conectadas al autobús. Al igual que con las carreteras, más usuarios ralentizan el tráfico. En la mayoría de los buses de memoria, solo una entidad puede usarlo a la vez; otras entidades deben esperar. Reducir el número de entidades que necesitan usar el bus de memoria acelerará su programa.

Algunas entidades comunes que comparten el bus de memoria: CPU, controladores DMA, procesadores de video, procesadores de sonido y procesadores de red o E/S.

4. Memoria virtual. Muchas computadoras modernas emplean memoria virtual. Si el programa requiere más memoria de la que está disponible en la memoria RAM, el sistema operativo intercambiará secciones de la memoria con áreas en el disco duro. Esto cuesta más tiempo de rendimiento que la reducción de la velocidad de funcionamiento de la memoria. Un programa de memoria intensiva es más eficiente al usar solo la memoria asignada que toda la memoria que podría necesitar. Reducir estos intercambios de memoria virtual acelerará un programa.


En resumen, hay una velocidad máxima a la que se puede ejecutar su aplicación. La memoria, tanto el caché interno como la RAM externa, son factores que contribuyen al límite superior. Hay factores más grandes que impiden que las aplicaciones lleguen a este límite. Algunos de estos factores son operaciones de E/S y otras tareas concurrentes. El diseño e implementación de un programa también puede contribuir a la lentitud. Se puede obtener más rendimiento al eliminar las operaciones de E/S, las tareas concurrentes y el rediseño del software que al cambiar el límite superior de la velocidad de acceso a la memoria. Cambiar estos límites aumentará el rendimiento de su programa, pero no tan drástico como las otras técnicas.

+1

Es un buen resumen, pero realmente no responde mi pregunta: ¿Cómo puedo medir el ancho de banda de memoria que está usando un programa determinado? – hanno

+0

Es posible que pueda medir el ancho de banda utilizando un depurador o un depurador JTAG conectado al procesador. De lo contrario, se vuelve difícil. Sugiero perfilar las secciones de código que son intensivas en memoria. Otra idea es colocar un analizador lógico en el bus de datos con una línea en las selecciones de chips de la RAM. –

1

Los programas que están limitados por el ancho de banda de memoria tienen referencias de memoria más altas (operaciones de carga y/o almacenar) a las operaciones de aritmética/lógica. Ejemplo son las rutinas BLAS1 como daxpy, ddot, etc.

Si las rutinas superiores del código (del perfil plano) tienen más operación aritmética para cargar/almacenar, entonces no se verá afectado demasiado por el ancho de banda de la memoria. El ejemplo es una multiplicación matriz-matriz optimizada, LINPACK.

Cuestiones relacionadas