<reponame>mathigatti/orga2-tp

Este trabajo nos sirvió para aplicar y desarrollar el conocimiento adquirido en la materia a un tema que nos interesaba. Al finalizarlo pudimos realizar una red neuronal perfectamente funcional en $C$ y $ASSEMBLER$ con una performance superior a la que obtenían expertos en el área hace menos de una década\footnote{\url{http://yann.lecun.com/exdb/mnist/}}, esto habría sido imposible sin cursar Organización del Computador 2. El trabajo desarrollado nos permitió aprender mas de los lenguajes de programación, herramientas de compilación, desarrollo de experimentos y demás temas que vimos en la materia.
\\
\\
Al finalizar este trabajo pudimos corroborar exitosamente la hipótesis de que la utilización de SIMD resultaría en una mejora en la performance temporal de nuestro programa en ciertas partes críticas. Viendo en detalle los resultados de nuestros experimentos pudimos ver como para algunos casos las optimizaciones que realiza C fueron suficientes e incluso superiores a las mejoras que realizamos nosotros en $ASSEMBLER$ lo cual nos hizo darnos cuenta que es útil sacar el máximo provecho de las mismas antes de recaer en optimizaciones hechas a mano. De todas maneras como se pudo ver con las funciones $cost\_derivative$, $hadamard\_product$ y $matrix\_prod$, estas obtuvieron resultados considerablemente superiores a sus versiones en $C$, lo cual prueba que bajo ciertas circunstancias tiene sentido y es muy fructífero realizar este tipo de mejoras.
\\
\\
Otra conclusión importante fue que a veces paralelizar al máximo genera código más complejo lo cual termina volviendo al programa más lento y difícil de mantener por lo que puede ser incluso mejor trabajar con una concurrencia de menos operaciones a la vez.
\\
\\
Cómo conclusión final entendemos que bajo ciertas circunstancias, donde mejoras en tiempo son cruciales, la utilización de SIMD puede ser una herramienta fundamental, aunque al mismo tiempo hay que tener en cuenta que los tiempos de desarrollo suelen ser mayores debido al bajo nivel de $ASSEMBLER$, incluso para funciones simples como las que hicimos y como vimos con $update\_weight$ y $vector\_sum$ para algunos casos incluso pueden encontrarse resultados mediocres.