Gente, estuve mirando un poquito el ISA de esta nueva arquitectura RISC-V:
http://riscv.org/
Creada en berkeley igual que todas las cosas que destrullen el cerebro
(como el LSD)
Mi idea es ponerme a implementarla en VHDL (primero para aprender y
luego para aprender, porque es un ejercicio de masturbación nada mas)
Ahora, mi duda no es de como implementarlo o no, sino mas conceptual.
Mirando el ISA en si, me di cuenta, que las instrucciones que
realmente operan sobre los datos son pocas, siendo mayormente,
instrucciones de control, movimiento de registros, de carga y
almacenamiento, de comparación y saldo (ok, eso se puede entender como
operación sobre los datos)
Así que me pregunté, cual era el ratio de instrucciones en un programa
típico, es decir, cuantas instrucciones en un programa son usadas para
las operaciones en si, y cuantas para el control, movimiento de datos,
manejo de flujo del programa.
Hice una primera búsqueda en internet por papers sobre eso, pero
(decidía mía) no salio nada en los primeros resultados y me puse a
hacer yo mismo (tal vez con poco rigor científico)
La idea es dividir las instrucciones que se ejecutan en "utiles" (que
operan sobre datos en si) e "inutiles" o "innocuas" a los datos (que
no los transforman)
Ejemplo de instrucciones utiles: add, cmp, xor, sub, mul, div, etc.
Ejemplo de instrucciones inutiles: mov, ld, st, b.*, bl, blx, etc.
Aclaro que no me rompí demasiado, agarre un par de algoritmos como
fft/firs y un OS completo (chibiOS) y le mande un objdump junto con un
grep para cada conjunto de instrucciones.
El target objetivo es un procesador típico como el cortex-m4, el
compilador es gcc 5.0 y todo se hace en -O2 (algo típico del software
actual)
Estoy masticando mas algoritmos así que todavía no pongo muchos
resultados pero en ChibiOS da 70% de instrucciones "inútiles" y el
resto de "las otras" (no diferencio mucho, por eso podría decirse que
son "al menos 70%)
FFT: 91%
IFF: 60%
FIR: 68%
Esto me hace plantear que estamos haciendo no algo mal, sino TODO mal.
Es decir, armamos un ISA-X con un gran repertorio de instrucciones
(sea RISC, CISC o lo que sea) y la mayoría están destinadas a "no
hacer nada" por la causa que es "masticar datos"
Luego los compiladores usan mas del 50% de las instrucciones en "nada
de nada" (siempre visto desde el punto de vista de transformar datos)
para que el resto del programa recién empiece a hacer su trabajo.
Como estoy seguro que los métodos que estoy usando están
fundamentalmente mal (objdump|grep no es lo mas científico que se
puede hacer) y que solo estoy centrándome en una arquitectura dada,
consulto por acá si alguien sabe algo de este tema o ha leído alguna
cosa al respecto.
Mi planteo es, de comprobar esto, que estamos haciéndolo TODO MAL,
desde que el $%$#%#$#$ de Von Newman planteo su arquitectura de
buses!!!! Y hardvard es la misma M$%#A!!!!
Ok, no estoy diciendo nada que no sepa cualquier desarrollador de DSP
sobre VHDL o cualquiera que haya implementado un RTL para algun
procesamiento dado.
¿Que onda las arquitecturas en GPU? Resuelven esta limitación o es
algo demasiado acotado para ser de propósito general (a pesar del
nombre GPGPU) ¿O cuando se hacen de propósito general termina cayendo
en el mismo poso de Von Newman?
Nada, eventualmente sacare mas números, pero espero que alguien en la
lista tenga idea de estudios sobre esto que me eviten seguir perdiendo
el domingo y poder dormir sin soñar con pipelines raros...
Saludos!