Será un binario más grande con piezas de código que no se ejecutan en el momento, afectar el uso de la memoria de la CPU de nivel 2?

StackOverflow https://stackoverflow.com/questions/4662321

Pregunta

Parece que la CPU se ejecutan mucho más rápido si su L2 está vacío. Será un programador estar mejor al código algo que con el tiempo será menor en el sistema binario, aun cuando parte de ese código no se ejecutan todo el tiempo? Por ejemplo, partes de código que sólo se activan en un archivo de configuración.

¿Fue útil?

Solución

La verdad es algo más complejo, voy a tratar de esbozar por usted.

Si nos fijamos en la jerarquía de memoria en un PC moderno con un procesador multi-núcleo se encuentra que hay seis niveles:

  1. El prefetcher, uno para cada núcleo (sin latencia)
  2. La caché L1, uno o dos (combinado o código y de datos, 2 * 64K en AMD K10) para cada núcleo (por ejemplo latencia tres clks)
  3. La caché L2, un (512K en AMD K10) para cada núcleo (por ejemplo latencia 10)
  4. La caché L3, un (ncores * 1 MB en AMD K10) por procesador utilizado por todos los núcleos (latencia decir 30)
  5. Sistema RAM, uno por sistema utilizado por todos los procesadores (por ejemplo latencia 100)
  6. Sincronización (o bloqueo de bus), un método por sistema utilizado por todo masterización bus dispositivos (latencia al menos 300 ciclos de hasta 1 con si una vieja tarjeta PCI está usando todos los 32 relojes disponibles cuando maestros de bus con fichar a 33 MHz - en un procesador de 3 GHz Eso significa 3000 ciclos de reloj)

¿No ve el número de ciclos de tan exactas, que están destinados a dar una idea de las posibles penalizaciones incurridos durante la ejecución de código.

Yo uso de sincronización como un nivel de memoria, porque a veces es necesario sincronizar la memoria demasiado y que el tiempo los costos.

El idioma que usa tendrá un gran impacto en el rendimiento. Un programa escrito en C, C ++ o Fortran será más pequeño y más rápido que ejecutar un programa interpretado como Basic, C # y Java. C y Fortran también le dará un mejor control en la organización de sus áreas de datos y acceso a programas para ellos. Ciertas funciones en lenguajes orientados a objetos (C ++, C # y Java), tales como la encapsulación y el uso de las clases estándar resultarán en código más grande está generando.

¿Cómo se escribe código también tiene un gran impacto en el rendimiento - aunque algunos individuos desinformados dirán que los compiladores son tan buenas en estos días que no es necesario escribir buen código fuente. Gran código significará un gran rendimiento y la basura En siempre resultará en basura que sale.

En el contexto de su pregunta pequeño escrito es generalmente mejor para el rendimiento que no se cuida. Si estás acostumbrado a la codificación eficiente (pequeño código / rápida), entonces usted lo hará independientemente de si está seldom- escrito o secuencias a menudo utilizado.

El caché más probable es que no tiene todo su programa cargado (aunque podría), sino más bien numerosos trozos 32 o 64 bytes ( "líneas de caché") de datos obtenidos a partir de 32 o incluso 64 direcciones de byte en el código. Cuanto más la información de uno de estos trozos se accede más tiempo se mantenga la línea de caché que está sentado en. Si el núcleo quiere un trozo que no está en L1 que buscará todo el camino hasta la memoria RAM si es necesario y de incurrir reloj pena ciclos, mientras que hacerlo.

Así que en general, pequeña, estrecha y secuencias de código en línea se ejecutará más rápido debido a su impacto en la memoria caché (s) menos. El código que hace que una gran cantidad de llamadas a otras áreas de código tendrá un mayor impacto en la memoria caché, como el código voluntad con saltos no optimizadas. Las divisiones son extremadamente perjudiciales, pero sólo para la ejecución del núcleo en cuestión. Al parecer AMD es mucho mejor en ellos que Intel ( http://gmplib.org/~tege/x86 -timing.pdf ).

También está el tema de la organización de los datos. Aquí también mejor es tener los datos a menudo usadas en residir en un área pequeña físicamente de tal manera que una línea de caché traiga traerá varias variables a menudo usado en lugar de sólo uno por recuperación (que es la norma).

Cuando acceder a las matrices de estructuras de datos o datos tratan de asegurarse de que tiene acceso a ellas de menor a direcciones de memoria superior. Una vez más, el acceso a todo el lugar tendrá un impacto negativo en las cachés.

Por último, existe la técnica de dar los datos de solicitud previa consejos al procesador para que pueda dirigir los cachés de datos para empezar a captar en lo posible antes de que realmente se utilizarán los datos.

Para tener una posibilidad razonable de la ONUcompren- estas cosas para que se les puede poner a su uso a nivel práctico, será necesario para poner a prueba diferentes construcciones y el tiempo de ellos, preferiblemente con el contador RDTSC (un montón de información sobre ello aquí en stackoverflow) o mediante el uso de un generador de perfiles .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top