¿Hay una mejora en el ancho de banda al instalar un sistema operativo de 32 bits en una máquina de 64 bits?

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

Pregunta

Knuth recientemente objetó a sistemas de 64 bits, diciendo que para los programas que caben en 4 gigas de memoria, " efectivamente tiran la mitad de la caché " porque los punteros son dos veces más grandes que en un sistema de 32 bits.

Mi pregunta es: ¿se puede evitar este problema instalando un sistema operativo de 32 bits en una máquina de 64 bits? ¿Y hay puntos de referencia de uso intensivo de ancho de banda que demuestren la ventaja en este caso?

¿Fue útil?

Solución

La respuesta es: sí, en cierta medida, aunque es poco probable que la diferencia de rendimiento sea grande.

Cualquier punto de referencia para probar esto tendrá que hacer una gran cantidad de resolución de puntero, que será difícil separar del ruido. Diseñar un punto de referencia que no se optimice lejos es difícil. Este artículo sobre puntos de referencia de Java defectuosos fue publicado por alguien en la respuesta a otra pregunta, pero muchos de los principios descritos en ella se aplicarán a esto.

Otros consejos

El ancho de banda no es realmente el término correcto aquí. De lo que realmente estaba hablando Knuth era de la densidad de datos, en relación con la huella del caché. Imagine que tiene un caché de datos L1 de 16 KB: si está almacenando simplemente punteros, puede almacenar 2 ^ 14/2 ^ 2 = 2 ^ 12 = 4096 punteros de 32 bits, pero solo 2048 punteros de 64 bits. Si el rendimiento de su aplicación depende de poder realizar un seguimiento de más de 2K buffers diferentes, es posible que vea un beneficio real del rendimiento de un espacio de direcciones de 32 bits. Sin embargo, la mayoría de los códigos reales no son de esta manera, y los beneficios de rendimiento real de un sistema de almacenamiento en caché a menudo provienen de la capacidad de almacenar en caché las estructuras de datos de enteros y puntos flotantes comunes, no grandes cantidades de punteros. Si su conjunto de trabajo no es muy pesado, la desventaja de 64 bits se vuelve despreciable, y la ventaja se vuelve mucho más obvia si está realizando una gran cantidad de aritmética entera de 64 bits.

No creo que Knuth se opusiera a los sistemas de 64 bits. Simplemente dijo que el uso de punteros de 64 bits en un sistema que tiene menos de 4 GB de RAM es idiota (al menos si tiene muchos punteros como los de una lista de doble enlace). No puedo decir que estoy de acuerdo con él, aquí hay 3 formas diferentes que se pueden tomar. Supongamos que tiene una CPU con capacidad para 64 bits que también puede ejecutarse en modo de 32 bits como algunos Intel Core Duo.

1 - Todo es de 32 bits, el sistema operativo, la APPZ, todos ellos. Por lo tanto, tiene punteros de 32 bits pero no puede usar los registros / instrucciones adicionales que están disponibles en el modo de 64 bits.

2 - Todo es de 64 bits, el sistema operativo, la APPZ, todos ellos. Así que tiene punteros de 64 bits y puede usar los registros / instrucciones adicionales que están disponibles en el modo de 64 bits. Pero como tiene menos de 4 GB de RAM, el uso de punteros de 64 bits parece idiota. Pero, ¿lo es?

3: el sistema operativo es de 64 bits y el sistema operativo se asegura de que todos los punteros de código / datos estén en el rango 0x00000000 - 0xFFFFFFFF (memoria virtual !!!). El ABI se ejecuta de una manera muy extraña, ya que todos los punteros de código / datos que se guardan en la memoria / archivos tienen un ancho de 32 bits, pero se cargan en registros de 64 bits con extensión cero. Si hay una ubicación de código para saltar, el compilador / ABI realiza las reparaciones necesarias y realiza el salto real de 64 bits. De esta manera, los punteros son de 32 bits, pero APPZ puede ser de 64 bits, lo que significa que pueden hacer uso de los registros e instrucciones de 64 bits. Este proceso es algo así como thunk, creo ;-P

Mi conclusión es:

La tercera opción me pareció factible, pero no es un problema fácil. En teoría puede funcionar pero no creo que sea factible. Y también creo que su cita "Cuando tales valores de puntero aparecen dentro de una estructura, no solo desperdician la mitad de la memoria, sino que efectivamente tiran la mitad de la memoria caché". es exagerado ...

He visto en alguna parte que la mejor combinación (en las CPU x86) es usar un sistema operativo de 64 bits y aplicaciones de 32 bits.

con un sistema operativo de 64 bits obtienes:

  • capacidad para manejar más de 4GB de espacio de direcciones
  • más, registros más grandes para ayudar en las operaciones de copia de datos

con una aplicación de 32 bits obtienes:

  • punteros más pequeños
  • menos, registros más pequeños para guardar en cambios de contexto

contras:

  • todas las bibliotecas deben estar duplicadas. pequeño para los estándares de espacio HD.
  • todas las bibliotecas cargadas están duplicadas en la memoria RAM. no tan pequeño ...

sorprendentemente, parece que no hay sobrecarga al cambiar de modo. Supongo que pasar del espacio de usuario al kernel cuesta lo mismo, sin importar el bitness del espacio de usuario.

por supuesto, hay algunas aplicaciones que se benefician del gran espacio de direcciones. pero para todo lo demás, puede obtener un rendimiento adicional del 5% si se mantiene a 32 bits.

y no, no me importa esta pequeña aceleración. pero no "ofende" yo para ejecutar FireFox de 32 bits en una máquina KUbuntu de 64 bits (como he visto en algunos foros)

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