Uno de los mayores problemas a la hora de emular PlayStation 3 es la emulación de los SPE lo cual resulta paradojico por el hecho que a estas alturas cualquier núcleo de CPU podria emularlos sin problemas. ¿Que son los SPE? estos son núcleos en si mismos y no son unidades adicionales para la CPU principal ya que tienen su propio set de registros e instrucciones.

En el CBEA, el PPE es un núcleo PowerPC normal y corriente sin nada de especial y es la verdadera CPU del sistema, pero realmente el CBEA no es una CPU sino que es un SoC con un uncore que es el anillo llamado EIB y teniendo una serie de clientes heterogeneos alrededor del mismo que son el PPE como CPU, los 8 SPE donde uno esta desactivado por redundancia, el controlador de memoria y las interfaces de E/S correspondientes, una conectada a una interfaz FlexIO con el RSX en el caso de PS3, la otra con el Chipset/Southbridge.

Empezando por el PPE tenemos algo que realmente no es una CPU muy rápida, en realidad no es más rápido que un Pentium 4 a poco mas de 2 Ghz. Los núcleos PowerPC eran los mismos en PS3 y Xbox 360, solo que la consola de Microsoft tenia 3 y disponía de más registros para la unidad FPU+VMX. En Xbox One durante la ejecución de los juegos de 360 cada uno de los 6 Jaguar disponibles para juegos emula o interpreta a uno de los 2 hilos de ejecución de cada uno los 3 PPE. En el caso de PS3 sería suficiente con dos núcleos Jaguar en PS4 pero… ¿Y que ocurre con los SPE? Bueno, para empezar tenemos unos 7 por lo que asignar la emulación de cada uno a cada núcleo Jaguar cuando:

  • Uno de ellos están reservados para el sistema, otro esta medio reservado dependiendo de las circunstancias.
  • Se utilizarian dos de ellos para emular el PPE
  • Solo nos quedarían 4.

¿Pero serían lo suficientemente rápidos para emular los SPE? El problema de los SPE no es el hecho de emular su programa, en realidad en el traslado de los juegos de PS3 a PS4 solo ha sido necesario:

  • Traslador algunos trabajos al pipeline de computación de la GPU.
  • Muchos de los trabajos han sido portados a ser ejecutados en los núcleos del Jaguar.

La diferencia es que en PS4 no existe un director de orquesta que es el PPE sino que los diferentes núcleos van cogiendo las trabajos a medida que estos se encuentran libres para ejecutarlos, en el CBEA el sistema de trabajos era gestionado por el PPE.

El CBEA por tanto podía trabar de dos maneras distintas, en el modo «Cola de Trabajos» la comunicación entre el PPE y los SPE se hacía con el PPE comunicandose con una unidad llamada MFC dentro de cada SPE.

El sistema de trabajos del CBEA utiliza la unidad MFC para la comunicación entre el PPE y cada SPE, la unidad MFC es tratata como un elemento de E/S mapeado en memoria. Esto significa que dentro del direccionamiento del PowerPC se encuentran mapeados los SPE y su memoria por lo que solo es necesario enviar un dato a dicha dirección de memoria en concreto para que llegue al SPE correspondiente o viceversa desde los SPE. ¿Que significa esto? Que realmente puedes colocar cualquier CPU haciendo de director de orquesta y no solo eso, sino que además puedes comunicar también cualquier procesador externo, solo necesitas que tenga acceso al mismo espacio de direccionamiento que los SPE para ello.

El hecho de tener que emular o interpretar algo como el MFC no es algo a lo que la emulación/interpretación de Xbox 360 en Xbox One se enfrente dado que la intercomunicación entre núcleos es la clásica que se hace utilizando para ellos las caches más alejadas de los núcleos como elemento de coherencia. Sony con PS4 opto por una opción menos exótica y mucho más estándar para comunicar los diferente núcleos entre si, en realidad opto por la opción estándar de toda la vida y el mismo tipo de solución que Microsoft había realizado con Xbox 360, la misma solución que Intel y AMD llevaban años utilizando en PC.

El otro punto es la memoria local, Los SPE carecen de un sistema de caches y no ven más allá de su memoria local, eso si, se comunican entre ellos no via MFC sino via la unidad DMA que tiene cada uno, la cual es utilizada para comunicar varios SPE entre si. La unidad DMA se utiliza también para hacerle peticiones a memoria al controlador de memoria externo a través del EIB y acceder a la memoria local. En realidad el MFC esta conectado a la unidad DMA de la misma manera que lo esta la memoria local.

En principio seria tan fácil como reemplazar el EIB por un uncore cualquiera, pero realmento es tan fácil desde el momento en que la unidad DMA de los SPE esta pensada para ser utilizada con el EIB y para una implementación a nivel de hardware se deberían hacer algunos cambios en la unidad DMA pero para entenderlos nos hemos de fijar en el EIB.

El EIB es como una autopista radial con unas 12 salidas distintas, la autopista tiene 4 carriles, dos en cada dirección y lo que hace es ir trasladando los datos de una sección a otra del anillo hasta que llegan a destino. Cada uno de los 4 carriles puede tener unos 3 transacciones simultaneas al mismo tiempo por lo que hay 12 transacciones de 16B cada una y la velocidad de reloj del EIB es la mitad que la velocidad de reloj del PPE y los SPE. Esto significa que la unidad DMA de cada SPE ha de estar programada para el timing del EIB y si cambiamos de uncore entonces pueden haber problemas graves.

Emular la unidad DMA y el MFC por software es un verdadero…

… para Sony y es mucho más viable y tiene más sentido integrar los SPE dentro del SoC de PlayStation 5 si es el mismo SoC utilizado para los futuros servidores de PlayStation Now que mantengan compatibilidad con PS3. Estos juegos funcionarían como los de Xbox 360 en Xbox One, interpretados y los SPE estarían en el hardware para evitar problemas de compatibilidad y acelerar la ejecución de los juegos.

Es decir, tendremos un ejecutable que lo que hará será adaptar el código del PPE de PowerPC a x86-64 pero manteniendo las llamadas al SPE. ¿Y que hay de la GPU? Es fácil, con un controlador/interprete de Libgcm a RDNA para ejecutar. ¿Pero cual es el coste de implementar a nivel de hardware los SPE en un SoC de 7nm? Pues unos pocos milimetros en el SoC, una cosa distinta es que lo hagan pero de cara al PS Now se ahorran un sinfin de problemas de compatbilidad con los juegos y no tener que tener servidores diferenciados para PS3 y PS4.

El motivo por el cual es necesario implementar los SPE a nivel de hardware, es por el hecho que cualquier uso de los SPE para comunicarse con ellos o su memoria local, incluso para los efectos de Post-Procesado requiere la invocación de la unidad DMA y del MFC por lo que el 100% de los juegos de PS3 en otras plataformas requieren de la emulación de estas unidades y aquí además entramos en el timing. Muchos juegos de PS3 tienen en cuenta el timing del SPE para solventar las cosas y el hecho de no emular con el timing correcto provocaría que…

Y con timing me refiero a que en la consola original la GPU tiene un tiempo de espera de los SPE, si es mucho más largo de lo esperado el tiempo de fotograma se alarga y la tasa de fotogramas baja.

¿Y a que viene todo este rollo? Bueno, esto no es más que un remake de otra entrada que hice hace un tiempo acerca de ejecutar los juegos de PS3 en PS5 y cual sería la mejor solución para Sony para ello si Sony decide tirar hacía adelante de la manera más fácil y menos costosa.

Teniendo en cuenta que el PPE es fácilmente emulable y los SPE y su entramado no y a nivel de software resultaría un enorme dolor de cabeza tiene sentido hacer este cambio que tendría un coste mínimo. Las ventajas de ello es que una buena colección de juegos no remasterizados en PlayStation 4 podrían jugarse en PlayStation 5.

Esto es todo, como siempre tenéis el Discord y los comentarios de la misma entrada para comentar el contenido de la misma.

El