Conker64 escribió:- 500MB/s de lectura, de escritura o combinados? De escritura creo que se va a quedar muy lejos de los 500MB/s, en los tests de fillrate conseguía algo cercano a 200MB/s, dibujando rectángulos 320x240x16bit de 1 sola textura sin hacer nada más (target 60fps), sin recarga, tendría que revisar muy bien, porque en las multiplicaciones si me equivoqué en algo puede ser muy arriba o muy abajo el resultado, comprobar que corre de fondo o si podría sacar más, que seguramente sí, porque eran tests en libdragon.
Si
el datasheet de una RDRAM igualita a la de N64 no falla, en escritura la tasa de transferencia sería mayor ya que hay menos latencia al solicitar la escritura (40 nanosegundos en lectura frente a 16ns en escritura). Pero esto solo benefícia sustancialmente si los paquetes son pequeños. Es decir, la velocidad de lectura es mucho menor que la velocidad de escritura si se trata de paquetes más pequeños de 100 bytes.
También tengo que señalar que la hoja no me detalla si hay un tiempo de espera después de una operación de escritura, y que si lo hay, pues evidentemente la tasa de transferencia disminuiría.
Voy a clarificar lo de los paquetes porque igual no se me entendió bien.
A la memoria no le puedes pedir que te lea o escriba 1MB del tirón. Has de decirle una dirección de memoria y un tamaño del paquete de datos que quieres leer o escribir. En el caso de la RDRAM, los paquetes pueden ser de entre 4 y 256 bytes. Si quieres leer 512 bytes, tendrás que pedir dos paquetes de 256, y si quieres pedir 300 bytes, pues un primer paquete de 256 y otro de 44bytes. Y si quieres pedir 1MB, pues 1048576 / 256 = 4096 paquetes. En principio de gestionar esto se encarga el RCP o el sistema operativo y el desarrollador no lídia con esto.
La cuestión es que debido a la latencia un paquete pequeño no va tan rápido como uno grande. Por ejemplo, leer 4bytes nos va a tardar 48ns, pero leer 28bytes tardará 96ns. En este caso tardando el doble de tiempo obtenemos 7 veces más datos. Sin embargo esto no es proporcional, ya que por ejemplo con un paquete de 108 bytes tarda 256ns, y con 236bytes tarda 512ns, un poco más de doble de datos con el doble de tiempo.
Nota: por simplificar los bytes son de 8bits, no los 9 del bus de la RAM.
Esto significa que el rendimiento de la memoria varía y mucho dependiendo del tamaño de los paquetes que se estén manejando. Cuanto más grandes más velocidad conseguiremos, pero cuando sean pequeños, la velocidad se desploma.
Basandome en los datos del datasheet hice una hoja de cálculo con una tabla de velocidad por tamaño de paquetes, y el resultado es este gráfico de tasas de transferencia muy ilustrativo:

Como se puede ver, por debajo de los 50 bytes el ancho de banda se nos va al garete.
Para quién le interese ver la hoja de cálculo,
pinchar aquí.
Un ejemplo práctico de este problema lo tenemos con el rellenado del framebuffer. Hace un tiempo se habló de que era más eficiente estirar los polígonos horizontalmente que verticalmente. Como el framebuffer se organiza en la memoria una línea horizontal seguida de otra, escribir 10 píxeles horizontales es una escritura de un paquete completo de 10 píxeles seguidos, pero escribir 10 píxeles verticales significa 10 saltos en la memoria, y por tanto 10 paquetes distintos y encima de apenas un par de bytes por paquete. Resultado: la línea horizontal se pinta a tasas cercanas a 400MB/s, la línea vertical a menos de 200MB/s. Justo esa cifra es la que te daba con tu prueba de pintar rectangulos, ¿no? Parece que por algún motivo pinta los rectángulos pixel a pixel.
En resumen, y fijándonos en el gráfico, la velocidad ronda los 400MB/s, pero dependiendo de las operaciones que se hagan puede caer estrepitosamente.
Conker64 escribió:La CPU consigue muy poco ancho de la RAM, es el componente más castigado del sistema en ese aspecto, tienes los tests del autor de CEN64 aquí, que probablemente los hizo en ASM donde nada interfiere (nota: tests sin cache, obligando a la CPU a acceder a RAM)
https://forums.cen64.com/viewtopic.php?f=15&t=35
No me extraña porque debe tener una latencia enorme entre que solicita un dato, el RCP lo solicita a la RAM, esta le responde y se lo pasa a la CPU. De todas formas es una cosa que ya comenté hace tiempo, el grueso de la necesidad de memoria del pipeline gráfico se establece entre RCP y RAM. La CPU no debería necesitar tanto ancho de banda y limitarse a operaciones pequeñas que pueda hacer con sus 8kb de caché. Es decir, la CPU está perjudicada pero a efectos de un juego no debería ser vital en el funcionamiento. Pero es opinión mía.
Conker64 escribió:- El Z-Buffer se hace por hardware, la comparación de pixel la hace el RDP al activar el bit Z-compare (y algunas cosas más), es muy rápido, aunque repercute en el rendimiento, hace 2 lecturas o escrituras por pixel.
Habría que ver como lee y compara el RCP este z-buffer. No creo que vaya pixel por pixel porque el rendimiento sería mucho peor del que vemos. ¿Es posible que lea una línea entera y la cargue en el RCP para hacer la comparación y después escribir el resultado?
Conker64 escribió:- Sí, el Z-Buffer es una región en la RAM.
¿Pero es una región separada del framebuffer o cada pixel de este tiene información de Z? Creo recordar que alguién dijo que debido al bus de 9bits cada pixel eran 15 bits de color y 3 bits de Z (o 16 y 2, no lo recuerdo bien). Por lo que he comentado antes, sería mucho más óptimo de esta manera al solicitar a la RAM paquetes de mayor tamaño.
Aviso: según como sea esto, se nos puede caer el mito del World Driver Championship.
Vaya tochete técnico...