sábado, 19 de noviembre de 2022

Ideas para procesador fpga risc (no creo que me ponga a ello ni de coña jj)

Idea para procesador para fpga


sería risc así que cuantas menos instrucciones mejor

cuantas menos instrucciones menor complejidad y menor número de transistores en un chip, mayor velocidad, menor consumo de energía y menor pérdida de energía en calor,

menor tamaño y más núcleos.(se sabe desde los años 80 cuando Oracle hacia los procesadores spark https://es.wikipedia.org/wiki/Sun_SPARC

el sparc M6 de oracle 3,6 Ghz 2013 de litografía 28nm era capaz de 96 hilos (8x12)

ese año salió el Intel Core i5 3,4 a 3,8 Ghz (Core i5-4670K) y Core i5-4670T 2.3 a 3.3 Ghz con GPU integrada 4600 de cuatro núcleos/hilos y 1.4 Billones de transistores (igual es mucho pero parece todo en uno el procesador) y litografía de 22nm.


del sparc M6: “Servidor SPARC M6-32: de 8 a 32 procesadores SPARC M6, cada uno con 12 núcleos y 8 threads por núcleo”


Es decir en 2013 procesadores risc de 12 núcleos que cada núcleo tenía 8 hilos


https://docs.oracle.com/cd/E40866_01/pdf/E49751.pdf


es bastante potencia… (igual ahí sí funciona el Crysis)


https://es.wikipedia.org/wiki/Sun_SPARC


me quedo con las ganas de ver el consumo en vatios del SPARC M6


El SPARC 64 X 32 hilos (2x16) con igual litografía 28nm tiene 2950 millones de transistores.


El i5 4750K tiene 1400 millones de transistores (menos) pero para cuatro núcleos de un hilo.

El i5 consume 84W y se calienta a 72 ° grados centígrados.


No puedo ver datos del SPARC M6 o el SPARC64X (de Fujitsu)

Sin embargo el SPARC64X lXfx de fujitsu a 1,8 Ghz del año 2012 con un solo núcleo de 16 hilos consume 110W con 1870 millones de transistores.


otros:


El ultra sparc T1 de 2005 consume 72 W tiene 300 millones de transistores cuatro núcleos de 8 procesos y funciona entre 1Ghz y 1,4Ghz


Igual para jugar a videojuegos va de sobra pues todo lo hace la gráfica si la frecuencia, la memoria y los tiempos de acceso no la frenan.


Bastante mejores pues los procesadores RISC a diferencia de los CISC pues los CISC tienen instrucciones para todo (incluso para cosas que hacen combinaciones de otras instrucciones)


Yo esto lo veo como las cámaras de fotos hace tiempo que se podía hacer muy buenas pero había que sacar productos de menor calidad para simular que había una gran diferencia en gamas por ejemplo la CANON 50D no grababa video porque no les dio la gana al principio y había que vender cámaras que grabarán video mas caras…


Pero pese a ser casi lo mismo en litografía y tecnología para fabricar los procesadores (los hace una máquina sobre el mismo soporte con láser) los RISC son mucho mejores y no un invento de ahora sino de los años 80.


Apple en sus nuevos chips procesador ha introducido núcleos risc y se nota.


Los RISC-V son hardware libre y Apple quiere utilizarlos para fabricar los suyos propios y es una buena idea pues a saber que hay dentro de un “INTEL” (suena a agencia de espionaje pero está dirigido a la población para espiar a la población).

Igual al principio muchas instrucciones por hardware tenían sentido por conseguir velocidad, mientras que procesadores de pocas instrucciones con muchos núcleos consiguieron muchos procesos en paralelo, un procesador cisc como los i7 de intel igual llega a 4Ghz 4.000.000.000 Hz o ciclos por segundo
pero si tienes pocos hilos y núcleos el windows con sus mil y un svchost y los subprocesos de estos entre otras cosas igual pueden con tus de 4 a 8 núcleos como mucho dobles (16 hilos reales) como he dicho antes consumen muchísimo por la gran cantidad de transistores que irradian energía en forma de calor que se pierde consumen más y se calientan mas… otro sistema operativo igual los aprovecharia mejor pues windows tiene mucho de windows nt para servidores y muchas cosas que ni se usan de normal y para los videojuegos la gráfica hace prácticamente todo pues ella sí tiene muchos núcleos matemáticos y de IA e igual ni procesador haría falta  (estaría guay un ordenador para jugar sin procesador carísimo ya que la gráfica de por sí lo es).
4Ghz mide los ciclos del reloj solía ser el tiempo que tarda de media en ejecutar una instrucción el procesador los z80 del amstrad y spectrums de 8 bit de unos pocos Mhz los 386 y 486 pues ya eran cientos de Mhz, pero parece que han topado con un límite… igual se podría superar si no se calientan tanto pues a partir de ahí es cosa de refrigeración con nitrógeno líquido y cosas así (no hablo de la refrigeración líquida de gaming).
4Ghz sería 1/(4.000.000.000) es decir tendría que ser capaz en un núcleo de realizar una operación de su conjunto de instrucciones en 0,00000000025 segundos.
Por otra parte la arquitectura RISC parecía menos apetecible por ser algo más lenta pero si hay que usar un sistema operativo como windows pues seria mucho mejor y los juegos dependen más de las capacidades de la tarjeta gráfica siendo el procesador y la placa por lo general un cuello de botella.
De todas formas la arquitectura RISC alcanzó hace tiempo en velocidad a la CISC y la CISC se quedó atrás en núcleos y procesos desde el principio.
Lo tenían planeado para volver a vender a saco ordenadores o simplemente les salió así? Este tipo de cosas suelen pasar muy a menudo.
Que los procesadores sean cada vez mejores no depende de la tecnología del procesador sino del láser con el que se graba para meter más transistores en menos espacio, aún así cuando más pequeño igual disipa más energía en forma de calor y se calienta mas (a parte de haber más transistores) luego lo que habría que mejorar es el diseño.
Parece que 28nm de litográfica esta mas que bien ahora estań en 7 nm y 5 nm con AMD RYZEN y otros… es muy pequeño…
28nm de 2013 sería 4 veces más pequeño con litografía de 7nm… luego como como vimos antes:
 

“Servidor SPARC M6-32: de 8 a 32 procesadores SPARC M6, cada uno con 12 núcleos y 8 threads por núcleo”
nos cabrían 4 de esos en el mismo espacio, 48 núcleos con 8 hilos por núcleo
384 hilos… Fue un procesador hecho para servidores así que igual el windows iría suave en el pero windows es el problema aquí con los CISC.

Cuántos Z80 y nos cabrían a día de hoy en un procesador del tamaño de un z80?
El z80 está basado en el 8080 (de 1972) que tiene una litografía de 6000 nm ha día de hoy están entre 7 y 5 nm así que 1000 z80 en el tamaño de un z80 sería posible (y flipante) es decir un procesador con 1000 núcleos de z80 en el tamaño de un z80 original mola. Y a que no sabéis qué? 

El Z80 era arquitectura CISC.

A día de hoy existen unas placas llamadas FPGA que emulan circuitos por hardware (se re-configuran las conexiones) y son capaces de emular ya procesadores por poco dinero.


Hace mucho tenía un libro de código de máquina del Z80 que se parece al 8080 (pero el Z80 es mejor) y hay programas y lenguajes para programar las fpga.


Voy a anotar mis ideas de un procesador muy simple, e iré mirando como lo programo si tengo tiempo, pues me gustaria hacerme con una placa de desarrollo fpga para trastear 🙂



BORRADOR IDEAS:


Todas las operaciones matemáticas están basadas en sumas y loops


Todo se guardaría con enteros

pues 8/7 ocupa menos que por ejemplo su resultado :1,142857143


El código de máquina tendría saltos, loops, sumas (la resta es una suma)

y enteros.


Los loops se deberían realizar dentro del procesador


pi por ejemplo no es un número en base 10 es un número en sí mismo y los radianes son su sistema numeral… (y así con otros números especiales)


En vez de saltar a posiciones de memoria saltaría a programas en la memoria


punteros programas:


programa 1 [número programa],[dirección memoria programa], [estado]: (iniciado, pausado, esperando respuesta, terminado, vacío/disponible (cargar otro programa)), [esperando valor para continuar si pausado] (id,valor,posición continuar),[estado](ok,error),[reloj] (para comprobar si funciona unos pocos bits que cambian)


Ejemplo de multiplicación


8*4


En c# se parecería a esto lo que haría el procesador para multiplicar

foreach (bit in 4){val=+8;} return val;

(no sería así exactamente jeje)

tendría un loop que contaría hasta 4 sumando 8 al retorno;


Haría falta una instrucción para un loop que devuelva un valor al terminar

y una operación de sumar a un puntero


Se debería realizar en el procesador directamente (no leyendo la memoria)

sino cargado en la memoria interna del procesador para ir más rápido


El procesador debería tener variables internas predefinidas para no ir definiendo todo el rato

simplemente las operaciones con estas serían asignarles un valor.


Se podría hacer incluso que fueran valores diferentes cuando se salta de un programa o proceso interno a otro.


Teniendo que haber pues variables de intercambio

podrían ser variables para un programa y para el otro constantes

o variables que se pasan o compartidas pero serían pocas.


Habría unas variables simples que podrían usar todos y serian globales

unas variables con programa dueño y para los otros igual solo son constantes

si no saltas de un programa a otro con permisos.

y constantes que solo se pueden definir y borrar.


Los valores de las variables serían enteros positivos y solo se usarían como negativos para las restas.


Los demás tipos de variables pues se implementarían por software y sus operaciones por software también.


(ya volveré a esto…)


igual la multiplicación había que guardarla como multiplicación


y tener una operación para pasar a entero.


es decir guardar las operaciones de multiplicar y dividir en variables o tener la opción de ello


sería fácil implementar como se opera con estas variables que guardan operaciones

(ouch que luego hice otra  cosa jajaja) empecé sumando y lo multiplique jaja tambien  me vale

8*7 suma 5/4 = 8*7*5/4 maal

el valor de las variables


A + B = C

A: (8*7)

B: (5/4)

C: (8*7*5*¼ ) maaal


de forma interna

si quieres ver el valor


ejem lo que quería era explicar cómo se convierte de estos valores a float o entero...

pongamos que era A*B=C...


(para sumar estas variables que contienen multiplicaciones habrá que implementar el MCM y el MCD pero ya lo miraré)


(float) C =


funcion (float) ToFloat (int[array] c{8,7,5,¼})


foreach (int i in c)


        {

            foreach (bit in c[i+1];while c[i+1]!=null;)


            {


                val=+c;


            }


        c[i+1]=val;


            }


return (float) val ;


(es una sintaxis inventada pero habría que imaginarselo en nemotécnico y código de máquina)


habría un problema y es ¼ que sería un float ya de por sí.


la división es una resta en bucle


si es menor devuelve cero directamente y si no va buscando los números más cercanos…


¼


1 dividido 4; cuatro es mayor luego 0 y me sobra de resto 1

luego se multiplica por 10


i=0: 4 es mayor que 1

>me quedo con “”0” y multiplicó el resto (1) por 10


i=1: 4 es menor que 10

i=2: 8 es menor que 10

i=3: 12 es mayor que 10


>luego me quedo con i = “2” y se lo resto a 10 ahora con (8)


i=4: 4 es menor que 8

i=5: 8 es igual a 8 me quedo el “5” pues.


luego tengo 0.25

habría que reducir las instrucciones a las mínimas necesaria (en el hardware) pero que permitan construir todas las demás instrucciones del procesador (pero por software interno).


(otras cosas interesantes de la división)


cuántos ¼ hacen falta pues para llegar a 4

¼+¼+¼+¼ hacen falta 4 si sumas 4+4+4+4 = 16

4/16 es lo mismo que ¼

y 16/4 es 4

si sumas ambos se anulan 20/20=1 (son inversos)


las divisiones entre 9 da cero el resto si es múltiplo de 9 lógicamente

pero si es diferente de múltiplos de 9 pues dará la suma reducida de sus

dígitos del módulo.

3248903576 mod 9 = 2

lo cual dice que si le sumas 2 sería múltiplo de 9

3+2+4+8+9+0+3+5+7+6 = 47 : 4+7=11 : 1+1 = 2

cualquier combinación de estos números en cualquier orden haría lo mismo.

y cualquier combinación si le sumas 2 sería múltiplo de 9

Qué pasaría si a un múltiplo de 9 si le restas un número N al azar

sería múltiplo de ese número al azar.


245678×9=2211102 esto sería un múltiplo de nueve


alteró el orden 1112202/9=123578 un número entero


1112202 - 6 = 1112194 mod 9 = 3

digamos que 1112202 mod 9 da 0

si le resto 6 se los resto al 9

compruebo otra combinación

2120211 - 7 = 2120204 (espero 9-7=2)

2120204 mod 9 = 2 efectivamente 🙂


lo pruebo con un número más largo


5782395781 * 9 = 52041562029 (múltiplo de nueve)

le resto 8 por ejemplo


52041562029 - 8 = 52041562021


52041562021 mod 9 = 1 (es lo que esperaba 9-8=1)


y las combinaciones de este número (52041562021 múltiplo de 9 menos 8)

21205256410 mod 9 = 1 (9-8=1)


o las operaciones con (52041562029 múltiplo de 9)


52041562029−5 = 52041562024

52041562024 mod 9 = 4 (9-5=4) Quería exponer con esto que las matemáticas tienen sus trucos y se podrían poner las operaciones mas usadas pre-calculadas e incluso los cálculos mas recurrentes guardar las respuestas; como ponerle un modo aprendizaje al procesador; creo que los ryzen de amd hacen algo parecido... pero no estoy puesto en el tema. Además de sumar y restar muy rápido, deberían haber instrucciones de salto (saltos condicionales también), copiar bloques de memoria, y algunas comparaciones. sumar y restar es muy fácil con contadores que son bastante sencillos en binario, las puertas lógicas se hacen fácil con transistores aunque un procesador creo que también podía tener diodos.(tendré que mirarlo) comprobar si un numero es mayor o menor o igual con ceros y unos también es fácil. son el tipo de cosas que tendría que hacer a nivel mas básico. Seguiré con esto otro día también me molaría hacerme con una raspberry pero mola más meditar y pasear la verdad me siento como jubilado después de lo que me han puteado jeje

No hay comentarios:

Publicar un comentario