martes, 16 de agosto de 2016

Big Endian vs. Little Endian

Introducción 

En orden para entender los conceptos de Big Endian y Little Endian, primero debemos entender el concepto de memoria. 

La memoria es un gran arreglo que contiene bytes. En la organización de computadoras no nos referimos con el término de "índice" a las ubicaciones en memoria, en lugar de eso, usamos el termino de "direcciones". Cada dirección almacena un dato de la memoria (arreglo). Cada elemento por lo general es un byte. Existen algunas configuraciones de memoria en donde cada dirección almacena algo que no es un byte, comos ser un bit. Pero estas configuraciones son muy extrañas, así que para fines de este articulo asumiremos que todas las direcciones almacenan únicamente bytes.

Vamos a definir que una palabra son 32 bits, lo cual es lo mismo que decir 4 bytes. Los enteros, números flotantes y las instrucciones MIPS son de 32 bits de largo. Así que... ¿Como podemos almacenar todos estos valores en memoria? Después de todo, cada dirección de memoria solo puede almacenar un único byte, no cuatro bytes.

La respuesta es simple. Dividimos la cantidad de 32 bits en 4 bytes. Por ejemplo supongamos que tenemos la cantidad de 32 bits, escritos como  90AB12CD/16, el cual es hexadecimal. Dado que cada dígito hexadecimal es 4 bits, necesitamos ocho dígitos hexadecimales para representar el valor de 32 bits.

Así que los cuatro bytes son: 90, AB, 12, CD, donde cada byte requiere dos dígitos hexadecimales.

Resulta que hay dos maneras de almacenar esto en memoria.

Big Endian

En Big Endian, se almacena el byte mas significante en la dirección mas pequeña. Así es como se veria: 


Little Endian

En Little Endian, se almacena el byte menos significante en la dirección mas pequeña. Así es como se veria: 


¿Cual tiene mas sentido?

Diferentes ISAs usan diferentes estilos. Aunque pareciera que Big Endian se ve mas natural, ambos modelos tienen sus justificaciones.

Por ejemplo, DEC e IBMs son little endian, mientras que Motorolas and Suns son big endian. Los procesadores MIPS permiten escoger cualquiera de los estilos para ser utilizados, ya sea big o little endian.

¿Por que es este tema tan importante? Supongamos que estamos almacenando valores enteros a un archivo, luego enviamos el archivo a una maquina que usa el endian opuesto al nuestro. Esta discrepancia generaría errores. El valor seria leido al reves y no tendría sentido.

"Endianness", es también un tema importante cuando se envían números por una red. De nuevo, si se envía un valor desde una maquina con un endian en particular a otra con el endian opuesto, tendremos problemas. Esto es aun peor a través de una red, porque podríamos darnos cuenta de que no podemos determinar el tipo de endian de la computadora que nos envió los datos.

La solución es enviar cantidades de cuatro bytes usando "network byte order", el cual es arbitrariamente escogido para ser uno de los dos endian. Si nuestra maquina tiene el mismo endian que network byte order, ningun cambio es necesario. Si no, debemos invertir los bytes.

Arduino... ¿Basado en Harvard o Von Neumann?

Introducción

Arduino es una plataforma de creación de prototipos de código abierto basado en hardware y software fácil de usar. Las placas arduino son capaces de leer entradas como la luz en un sensor, un dedo sobre un botón o un mensaje de Twitter y convertirlo en una salida, como la activación de un motor, encender un LED o publicar algo en línea. Podemos decidir que hará nuestro tablero mediante el envío de un conjunto de instrucciones al microcontrolador en el tablero. Para ello se utiliza el lenguaje de programación de Arduino (basado en el cableado), y el software de Arduino (IDE), basadas en el procesamiento.

A través de los años arduino ha sido el cerebro de miles de proyectos, desde objetos cotidianos a los instrumentos científicos mas complejos. Una comunidad mundial de fabricantes, estudiantes, aficionados, artistas, programadores y profesionales, ha reunido en torno a esta plataforma de código abierto, sus contribuciones han añadido hasta una increíble cantidad de conocimiento accesible que puede ser de gran ayuda para los principiantes como para expertos.

Respondiendo la Pregunta

Como toda otra plataforma que realiza operaciones de control y calculo para cumplir con objetivos específicos, es valido que nos preguntemos sobre que arquitectura de computadoras esta basado arduino. Para ello, debemos conocer que tipo de procesador utiliza arduino, y con poca investigación podemos descubrir que arduino trabaja con la familia de microcontroladores AVR. 

El AVR es un microcontrolador de una arquitectura Harvard modificada  RISC de 8-bit , que fue desarrollado por Atmel en 1996. AVR ue una de las primeras familias de microcontroladores en utilizar la memoria flash en un chip para almacenamiento de programas, en oposición de las ROMs programable por una sola vez: EPROM, EEPROM usados por muchos microcontroladores en ese momento.

Entonces podemos concluir que arduino, al utilizar microcontroladores AVR, esta orientado al modelo de arquitectura Harvard. Esta debido muy probablemente a que la arquitectura Harvard es mas eficiente para el desarrollo de tareas especificas que necesitan un tiempo rápido de ejecución, el cual es muchas veces el objetivo primario de los proyectos de arduino, que suelen ser pequeños pero con requerimientos de eficiencia muy precisos.

El modelo Von Neumann se ajusta mas a proyectos de micro computadoras como Raspberry.

viernes, 5 de agosto de 2016

Alternativas a CISC y RISC

Intel Itanium
Intel Itanium, antes conocida como IA-64 (Intel Architecture-64), es una arquitectura de 64 bits desarrollada por Intel en cooperación con Hewlett-Packard para su línea de procesadores Itanium e Itanium 2. Usa direcciones de memoria de 64 bits y está basada en el modelo EPIC (Explicitly Parallel Instruction Computing, procesamiento de instrucciones explícitamente en paralelo).
Los procesadores Intel Itanium 2 representan un complejo diseño con más de 1700 millones de transistores, lo que les permite ofrecer muy altas capacidades de virtualización, mejoramiento de confiabilidad y niveles de rendimiento.
La serie de procesadores Intel Itanium 2 ofrece al usuario final una amplia gama de opciones de software con más de 8000 aplicaciones en producción. Estos procesadores están dirigidos a servidores empresariales y sistemas de computación de alto nivel.
Actualmente, los servidores y sistemas de cómputo de alto desempeño basados en el procesador Itanium ofrecen soporte de misión crítica para Windows, Linux, Unix y otros sistemas operativos.
Organizaciones: Intel, HP.

VLIW
Del inglés Very Long Instruction Word. Esta arquitectura de CPU implementa una forma de paralelismo a nivel de instrucción. Es similar a las arquitecturas superescalares, ambas usan varias unidades funcionales (por ejemplo varias ALAs, varios multiplicadores, etc.) para lograr ese paralelismo.
Los procesadores con arquitecturas VLIW se caracterizan, como su nombre indica, por tener juegos de instrucciones muy simples en cuanto a número de instrucciones diferentes, pero muy grandes en cuanto al tamaño de cada instrucción. Esto es así porque en cada instrucción se especifica el estado de todas y cada una de las unidades funcionales del sistema, con el objetivo de simplificar el diseño del hardware al dejar todo el trabajo de planificar el código en manos del programador/compilador, en oposición a un procesador superescalar, en el que es el hardware en tiempo de ejecución el que planifica las instrucciones.
VLIWs también ha ganado una significante penetración en el mercado de unidades de procesamiento de gráficos (GPU), aunque tanto Nvidia y AMD se han movido a arquitecturas RISC para mejorar el rendimiento en ambientes de trabajo de no gráficos.
Organizaciones: Nvidia, ATI.

TRIPS
TRIPS es una arquitectura diseñada por un equipo en la Universidad de Texas en Austin en conjunto con IBM, Intel y Sun Microsystems. TRIPS usa un conjunto de instrucciones que esta diseñado para ser fácilmente seccionado en varios grupos de instrucciones (gráficos) que pueden ser ejecutados en elementos independientes de procesamiento. El diseño colecciona datos relacionados en gráficos, intentando evadir lecturas y escrituras gastonas de datos, y mantener los datos en memoria de alta velocidad, cercana a los elementos de procesamiento. El prototipo de procesador TRIPS contiene 16 de dichos elementos, pero es esperado que rápidamente escalara a 128, en procesador de la vida real en el futuro próximo.

Organizaciones: Universidad de Texas, Intel, Sub Microsystems.

miércoles, 3 de agosto de 2016

CISC y RISC

CISC

En la ilustración 1.1 vemos un un diagrama representando el esquema de almacenamiento para una computadora cualquiera. La memoria principal está dividida en filas y columnas. La unidad de ejecución es responsable por cargar todos los cálculos. Sin embargo, la unidad de ejecución solo puede operar en datos que han sido cargados en algunos de los seis registros (A,B,C,D,E o F). Digamos que queremos encontrar el producto de dos números, uno ubicado en la ubicacion 2:3 y otro ubicado en la ubicación 5:2, y luego almacenar el producto en la ubicacion 2:3.

El objetivo principal de la arquitectura CISC es el completar una tarea en tan pocas líneas de ensamblado como sea posible. Esto es logrado mediante la construcción de un procesador que es capaz de entender y ejecutar una serie de operaciones. Para esta tarea en particular, un procesador CISC vendría preparado con una instrucción especifica (la llamaremos "MULT"). Cuando se ejecute, esta instrucción carga los dos valores dentro de registros separados, multiplica los operandos en la unidad de ejecución, y luego almacena el producto en el registro apropiado. Por lo tanto, toda la tarea de multiplicar dos números puede ser completada con una instrucción: 

MULT 2:3, 5:2

MULT es lo que se conoce como una "instrucción compleja". Opera directamente en los bancos de memoria de la computadora y no requiere que el programador llame de manera explicita alguna funcion de carga o almacenamiento. Se parece de manera cercana a un comando de lenguaje de alto nivel. Por ejemplo, si decimos que "a" representa el valor que hay en 2:3 y que "b" representa el valor que hay en 5:2, entonces este comando es idéntico a la declaración de C "a = a * b".

Una de las principales ventajas de este sistema es que el compilador tiene poco trabajo que hacer para traducir una declaración de alto nivel a ensamblador. Porque la longitud del código es relativamente corta, poca RAM es requerida para almacenar instrucciones. Se hace énfasis en construir instrucciones complejas directamente en el hardware.

RISC

Los procesadores RISC solo usan instrucciones simples que puedan ser ejecutadas dentro de un ciclo de reloj. Por lo tanto, la instrucción "MULT" descrita anteriormente podría ser dividida en tres comandos diferente: "LOAD", que mueve datos del banco de memoria a un registro, "PROD", que encuentra el producto de dos operandos ubicados dentro de los registros, y "STORE", que mueve datos de un registro a los bancos de memoria. En orden para realizar exactamente la serie de pasos descritos en el tipo CISC, un programador necesitaría codificar cuatro líneas de ensamblador:

LOAD A, 2:3
LOAD B, 5:2
PROD A, B

Al inicio, esto podría parecer una manera mucho menos eficiente de completar la operación. Porque hay mas lineas de codigo, mas RAM es necesitada para almacenar las instrucciones de nivel ensamblador. El compilador también debe realizar mas trabajo para convertir una declaración de lenguaje de alto nivel en código de esta manera.

Porque cada instrucción requiere solo un ciclo de reloj para ejecutarse, todo el programa se ejecuta en aproximadamente el mismo periodo de tiempo que el multi-ciclo "MULT". Estas instrucciones reducidas de RISC requieren menos transistores de espacio de hardware que las instrucciones complejas, dejando mas espacio para los registros de propósito general.

Separar las instrucciones "LOAD" y "STORE" realmente reduce la cantidad de trabajo que el computador debe realizar. Después de un comando "MULT" de tipo CISC es ejecutado, el procesador automáticamente borra los registros. Si uno de los operandos necesita ser usado para otro calculo, el preocesador debe recargar los datos desde el banco de memoria hacia el registro. En RISC, el operando continuara almacenando en el registro hasta que otro valor sea cargado en su lugar.

Ilustración 1.1

Comparación Final