¿Es realista esperar una corrección completa de Specter en los predictores de ramificación de las futuras CPU?

7

Recientemente, se ha observado que dos ramificaciones que comparten el mismo estado de predictor de ramificación en el mismo proceso o incluso entre procesos permiten ciertas explotaciones de canal lateral (Spectre).

Consideremos un predictor de rama básico. Tiene 2 ^ 14 ranuras, y cada ranura consta de dos bits (tomados fuertemente, tomados débilmente, no tomados débilmente, fuertemente tomados). Los 14 bits de índice son los bits de orden inferior de la instrucción de bifurcación. Por lo tanto, el predictor de rama tiene 2 * 2 ^ 14 = 32768 bits o 4 kilobytes.

Ahora, hay un problema: al cambiar entre los procesos del espacio de usuario, el estado del predictor de ramificación no se vacía. Esto se puede solucionar agregando una instrucción de vaciado del predictor de bifurcación que se usa activamente al hacer cambios de contexto.

Hay otro problema: dos ramas en el mismo espacio de direcciones de proceso pueden compartir la misma ranura. Si una de estas sucursales es un código JIT no confiable y la otra se ramifica en un bit de una contraseña secreta, estamos en problemas. Presumiblemente, esto podría solucionarse vaciando el estado del predictor de ramificación antes de ejecutar un código JIT no confiable. Sin embargo, si el proceso limpia el predictor de rama con demasiada frecuencia, sus beneficios se pierden.

Sin embargo, hay una solución más general (propuesta en enlace ): almacena además de 2 bits los bits de dirección restantes como una etiqueta. En una arquitectura de 32 bits, sería de 32-14 = 18 bits, en un espacio de direcciones de 48 bits en una arquitectura de 64 bits, sería de 48-14 = 34 bits. Esto haría que el predictor de bifurcación establezca 20 bits o 36 bits en lugar de 2 bits, multiplicando su tamaño por 10 o 18.

¿Este tipo de solución general es realista? Ciertamente requeriría más transistores en el predictor de rama. Pero, ¿el predictor de rama ya es demasiado grande o es tan pequeño que su tamaño se puede multiplicar fácilmente por el factor requerido? También podría haber otros beneficios, como la posibilidad de hacer que el predictor de bifurcación sea asociativo de 2, 4 o 8 formas, como los cachés de CPU son estos días. ¿Quizás los beneficios de la asociatividad de conjuntos son tan grandes que este tipo de solución más general podría implementarse?

P.S. Realmente debería haber un intercambio de pila de microarquitectura de CPU. Consideré el intercambio de pila de seguridad de la información, el desbordamiento de pila, el intercambio de pila de informática y el intercambio de pila de electrónica y decidí publicar aquí.

    
pregunta juhist

1 respuesta

1

El espacio del dado es abundante. El caché L1 está (/ solía estar) ubicado en el mismo dado con la CPU, y ocupa mucho espacio. Así que creo que el 20X podría permitirse para la expansión del predictor de rama. (El L2 en mi día, ahora L2 + L3, estaba en un dado separado conectado a través del bus trasero). Pero creo que todavía es el caso de que podrían intercambiar un poco de L1 por una gran expansión de la predicción de la rama y la matriz El tamaño se mantiene igual. Esto ni siquiera cuenta el espacio para el ROB y las unidades funcionales conectadas a la estación de registro. Creo que se podría hacer. - Jon 5 de enero a las 16:48

    
respondido por el RoyC

Lea otras preguntas en las etiquetas