Cuando se lanza una nueva generación de procesadores, la mayoría de los sitios web informan que los motores y programas de juegos deben optimizarse para el nuevo hardware. No entiendo bien por qué. Un procesador generalmente tiene una arquitectura que define qué tipo de conjunto de instrucciones utiliza. El que todos usamos hoy en día es amd_x86_64. ¿Por qué debería actualizarse cualquier programa o compilador si todos los procesadores usan esta misma arquitectura? Seguramente hay características DENTRO de la tubería del nuevo procesador que optimiza la ejecución del código de la máquina, pero ¿por qué habría que cambiar el código de la máquina si la arquitectura no lo hizo?
39
Respuestas:
Porque diferentes generaciones de la misma arquitectura pueden tener diferentes conjuntos de instrucciones .
Por ejemplo, las extensiones SIMD de transmisión son probablemente el conjunto de instrucciones x86 más conocido, pero, a pesar de que solo hay una arquitectura x86, existen SSE, SSE2, SSE3 y SSE4.
Cada una de estas generaciones puede incluir nuevas instrucciones que proporcionan formas más rápidas de realizar ciertas operaciones. Un ejemplo que sería relevante para los juegos podría ser las instrucciones de productos de puntos.
Entonces, si un motor de juego se compila para una generación anterior de una arquitectura, no tendrá soporte para estas nuevas instrucciones. Del mismo modo, puede ser necesario optimizar el motor para obtener instrucciones más recientes; SSE4 , por ejemplo, tiene soporte para instrucciones de productos de puntos que funcionan en datos de matriz de estructuras. Una optimización que podría aprovechar estas nuevas instrucciones sería cambiar su diseño de datos a una matriz de estructuras.
fuente
La respuesta de Maximus es correcta, solo quiero dar otra parte de la historia:
El hardware en sí cambia de una manera que necesita cambiar la forma en que codifica, independientemente de las instrucciones recién introducidas.
El aumento o la disminución de las cantidades de caché significa que debe preocuparse cada vez más por la optimización de la memoria caché / la invalidación de la memoria caché. Más caché significa que con datos pequeños puede centrarse menos en asegurarse de que los datos sean contiguos sin encontrarse con problemas de rendimiento. Menos caché significa que esto podría ser un problema, y muy poco caché significa que con algunas estructuras de datos grandes no importará de ninguna manera.
Los nuevos niveles de caché significan que necesita pensar más sobre cómo organizar conjuntos de datos aún más grandes (L1, vs L2, vs L3 vs L4).
Más núcleos significa que debe pensar cómo va a mejorar las aplicaciones de subprocesos múltiples y cómo se escala su aplicación en un entorno de procesos múltiples.
Los relojes más rápidos significan que debe comenzar a pensar en la latencia de la memoria más de lo que necesita pensar en la velocidad de cálculo de la CPU como un cuello de botella de su sistema.
Es posible que el número de FPU en un sistema ya no coincida con el número de ALU enteras por núcleo (AMD tenía / tiene arquitecturas como esta).
El número de ciclos de reloj necesarios para calcular una operación puede haber disminuido o aumentado.
El número de registros disponibles cambió.
Todos estos tienen un impacto muy real en el rendimiento de los programas que hicieron suposiciones sobre la arquitectura subyacente en el hardware anterior con el mismo ISA, ya sea positivo o negativo.
fuente
pdep
toma 1 ciclo en Intel pero 6 en Ryzen, por lo que es posible que no desee usarlo en Ryzen.c[i] = a[i] OP b[i]
(es decir, 2 cargas y 1 almacenamiento por operación), por lo que los tiempos están dominados por el ancho de banda de la memoria debido a la muy baja intensidad computacional. El tamaño de la matriz no se muestra tan IDK si cabe en L1D. (gcc4.9 -Ofast
muy probablemente vectoriza automáticamente esos bucles, por lo que ni siquiera está midiendo el costo de las operaciones escalares normales como parte de un código entero complejo). La primera línea de esa página es IMPORTANTE: los comentarios útiles revelaron que algunas de estas medidas tienen serias fallas. Una actualización importante está en camino .Incluso más allá de cambios importantes como el soporte para nuevas instrucciones, los fabricantes de microprocesadores están modificando constantemente sus diseños para mejorar el rendimiento, y cada nuevo diseño puede tener un rendimiento relativo diferente para cada instrucción o técnica. Tal vez escribió un código sin ramificaciones cuidadosamente optimizado para el Modelo X, pero el Modelo Y tiene un predictor de ramificación mejorado que reduce la penalización de predicción errónea para la versión del código sin ramificación (que también libera un registro para ser utilizado en otro lugar) . Tal vez el Modelo Y admite un mayor paralelismo de una determinada instrucción de alta latencia, de modo que ahora un bucle desenrollado de esa instrucción le brinda un mejor rendimiento, mientras que en el Modelo X una secuencia más corta era mejor.
Cualquier problema puede resolverse de muchas maneras, y cada programa es una colección entrelazada de compensaciones y asignaciones de recursos, desde el punto de optimización. Incluso pequeños cambios en la disponibilidad de esos recursos o el costo de una determinada pieza de código en términos de esos recursos, pueden tener un efecto en cascada que proporciona una ventaja de rendimiento sustancial para una pieza de código u otra. Incluso si un chip actualizado tiene "más de todo", cómo mucho más de cada cosa puede decantar la balanza.
fuente