viernes, 10 de noviembre de 2017

Proyecto Carrito

Objetivo 

Elaborar un carrito auto dirigido vía bluetooth  que detecte la proximidad de los objetos usando un sensor .

Componentes Materiales y Circuito



Código implementado en la tarjeta Arduino uno para el movimiento y el sensor y  modulo bluetooth .

 





Ejercicios MIPS

Ejercicio 1

Código en C



Código MIPS



Ejercicio 2



Ejercicio 3




Ejercicio 4



Ejercicio 5



Multihilos,Pipeline,Memoria Cache,CPU vs GPU, Desempeño Rendimiento

MULTIHILOS


 Al escuchar la palabra multi-hilo, tal vez lo primero que te viene a la mente son muchos "hilos" de los que conocemos normalmente en casa, pero al hablar en términos de programación, no nos estamos refiriendo a esos "hilos". 

En programación, nos estamos refiriendo a los lenguajes de programación que permiten la ejecución de varias tareas en forma simultánea.

En un entorno multihilo se le asocia a los
procesos:

  •  Un espacio de direcciones virtuales que soporta la imagen del proceso.
  • Acceso protegido a procesadores, a otros procesos, archivos y recursos de E/S.

Un programa multihilos es un proceso que contiene más de un hilo. Cada hilo dentro del programa es como un mini-programa con exactamente las mismas propiedades que se mencionaron previamente.

Los mayores beneficios de los hilos provienen de las
consecuencias del rendimiento:
  •  Lleva mucho menos tiempo crear un hilo en un proceso existente, que crear un proceso totalmente nuevo.
  •  La creación de un hilo puede ser hasta 10 veces más rápida que la creación de un proceso en Unix.
  •  Lleva menos tiempo finalizar un hilo que un proceso.
Modelos
Hilos a nivel de usuario.
  • El kernel probablemente desconozca la existencia de los hilos. 
  • Como no se involucra al kernel, las operaciones sobre los hilos son más rápidas. 
Hilos a nivel de kernel
El núcleo gestiona los hilos. No hay código de gestión de hilos en la aplicación, sólo la
interfaz (API) para acceder a las utilidadesde los KLT. 



FORMAS DE MULTIHILOS

Multihilo apropiativo
Permite al sistema operativo determinar cuándo debe haber un cambio de contexto. La desventaja de esto es que el sistema puede hacer un cambio de contexto en un momento inadecuado, causando un fenómeno conocido como inversión de prioridades y otros problemas.
Multihilo cooperativo
Depende del mismo hilo abandonar el control cuando llega a un punto de detención, lo cual puede traer problemas cuando el hilo espera la disponibilidad de un recurso.

Modelos Multihilo

  • Modelo de uno a uno
En este tipo de modelo se asigna un hilo de usuario a un hilo de núcleo. Es decir, cada hilo de ejecución es un único proceso con su propio espacio de direcciones y recursos. 
  • Modelo de Muchos a Uno
Este enfoque de modelo asigna múltiples hilos de nivel de usuario a un hilo de nivel de núcleo. La administración concerniente de los hilos se lleva a cabo mediante la biblioteca de hilos en el espacio de usuario. 
  • Modelo de Uno a Muchos
La migración de un entorno de proceso a otro se lleva a cabo mediante este tipo de modelo, permitiendo con ello a los hilos moverse fácilmente entre los diferentes sistemas.
  • Modelo de Muchos a Muchos
Combinación de los modelos de Muchos a Uno y Uno a Muchos, con este enfoque se multiplexan varios hilos de nivel de usuario de sobre un número de hilos, el cual es menor o igual a la cantidad de hilos de kernel. 


Pipeline

Segmentación (Pipeline) es una técnica de implementación por medio de la cual se puede traslapar la ejecución de instrucciones. 

  • La segmentación no ayuda en la realización de una única tarea, ayuda en la realización de una carga de trabajo.
  •  Se pueden realizar múltiples tareas simultáneamente utilizando diferentes recursos. 
  • La velocidad se incrementa si se aumentan el número de segmentos. 
  • La razón de segmentación está dada por el segmento más lento. 
  •  El desbalance en el largo de los segmentos reduce la velocidad (speedup) 
  •  El tiempo en llenar y vaciar los segmentos reduce la velocidad. 
  • Almacén para las dependencias.
En la informática, el pipeline se emplea en microprocesadores, tarjetas gráficas y software. Los cálculos que se realizan en el proceso de programación deben sincronizarse con un reloj para evitar los tramos más recargados que se detectan entre dos registros.

Etapas en las instrucciones MIPS
•IF: Recuperación de instrucción desde memoria.
•ID: Lectura de registros mientras se decodifica la instrucción. Debido al formato regular.
•EX: Ejecución de la operación o cálculo de la dirección.
•MEM: Acceso a operandos en memoria de datos.
•WB: Escritura del resultado en los registros

Aquí están las cuatro etapas en su forma abreviada, que es la más común y la que verás más a menudo:
1. Fetch (Traer)
2. Decode (Descifrar)
3. Execute (Ejecutar)
4. Write (Escribir)

El pipelining no es lo mismo que el paralelismo (aunque, en cierto modo, en el pipeline también hay paralelismo). Ambas técnicas están dirigidas a mejorar el rendimiento (número de instrucciones por unidad de tiempo) incrementando el número de módulos hardware que operan simultáneamente
En el primer caso, el hardware para ejecutar una instrucción no está replicado, simplemente está dividido en varias etapas distintas especializadas, mientras que en las arquitecturas paralelas, el hardware (la CPU) sí está replicado (hay varios procesadores), por lo que varias operaciones pueden ejecutarse de manera completamente simultánea. 
El incremento del rendimiento con el pipelining está limitado al máximo número de etapas del procesador, mientras que con el paralelismo, las prestaciones mejoran siempre que se añadan más procesadores .

Problemas del pipe: los riesgos(hazards)
Riesgos estructurales. Una instrucción no puede ejecutar en el ciclo previsto porque el hardware no soporta la combinación de instrucciones dispuestas para ejecutar.

Riesgos de datos. Cuando una instrucción planificada no puede ejecutar en el ciclo previsto porque los datos que necesita aún no están disponibles.

Riesgos de control. Cuando la instrucción planificada no puede ejecutar en el ciclo previsto porque la instrucción recuperada no es la que se necesita.

Memoria Cache


En el sentido general, un caché es un espacio de almacenamiento de velocidad alta donde se guarda una copia de una parte de los datos que se encuentran en un segundo medio de almacenamiento de velocidad más reducida. En caso que nos interesa, el caché de un CPU, se trata de una memoria de muy alta velocidad que por lo general se encuentra integrada en el chip del CPU y guarda una parte de los datos de la memoria RAM para permitir acceder a ellos más rápidamente. La palabra proviene del francés “cache” (pronunciado cash) que significa “escondite”.

En general cuanto mayor es la caché más puertas se requieren para direccionarla por lo que 3enden a ser algo más lentas (incluso a igualdad de tecnología).

 Con frecuencia su tamaño está limitado por el espacio disponible en el chip, ya que las caches de primer nivel están integradas. 

Tamaños típicos:
 Nivel L1: 8-64 KB 
Nivel L2: 256 KB – 4 MB 
Nivel L3: (menos usual): 2 MB – 36 MB 



Las cachés funcionan por lo general bajo la hipótesis de localidad de referencia de varios
tipos, en particular:
• Localidad espacial: si se utiliza un dato en memoria en un instante dado, es muy probable que en los instantes siguientes se utilice algún dato en una dirección cercana.
• Localidad temporal: si se utiliza un dato en memoria en un instante dado, es muy probable que en los instantes siguientes se vuelva a utilizar


Caché de escritura
Además de las políticas detalladas antes, que se refieren a como se comporta el controlador
de caché al momento de producirse una lectura, es necesario considerar también qué ocurre
con las escrituras. Básicamente, frente a una escritura, deben considerarse dos aspectos del funcionamiento del controlador. En primer lugar, frente a una escritura, ¿debe cargarse la línea correspondiente de la caché?
• En una caché write-allocate (asignación en escritura), cuando el CPU desea hacer una escritura a memoria, el controlador de caché carga la línea correspondiente.
• En una caché write-no-allocate, (¿a que no adivinan?), no.

En segunda instancia, si cuando se desea escribir a memoria, la posición involucrada se
encuentra almacenada en caché1 ¿qué hace el controlador?
• En una caché write-through (escritura inmediata), el controlador escribe los cambios tanto en la caché como en la memoria inmediatamente.
• En una caché write-back (escritura demorada), el controlador escribe los cambios a caché pero no realiza la correspondiente escritura en memoria hasta tanto no se desaloje la línea en cuestión.

Políticas de desalojo
Por último, las memorias caché con nivel de asociatividad mayor a uno comparten la característica de que una posición de memoria puede ocupar más de una posición en la memoria caché. Por lo tanto, de encontrarse llenos todos los espacios posibles que puede ocupar una posición de memoria que ingresa a caché, será necesario decidir cual de las alternativas será desalojada. Dicha decisión se toma según una política, entre las que se incluyen:
• LFU (Least Frequently Used, menos frecuentemente usada), que como su nombre lo indica desalojará la línea que haya sido usada con menor frecuencia desde que fue cargada. A su vez, el cálculo de la frecuencia puede hacerse de diversas maneras que dependerán de la implementación del controlador de caché.
• LRU (Least Recently Used, menos recientemente usada) que desalojará la línea que, entre las alternativas, haya sido usada por última vez hace más tiempo.
• FIFO (First In First Out, el primero que entra sale primero).

Las tres funciones de correspondencia que se suelen usar son las siguientes:

Cuando el procesador busca un dato en la memoria se pueden producir dos situaciones:
  1. Acierto(Hit): Datos están en el nivel superior. La tasa de aciertos(hit rate) define la fracción de los accesos a memoria en los que se han encontrado los datos en el nivel superior.
  2. Fallo (Miss o fault): Datos no están el nivel superior. Por tanto se debe acceder al inferior para traer el bloque que los contiene.

CPU vs GPU


La CPU (unidad de procesamiento central) a menudo se ha llamado el cerebro de la PC. Pero cada vez más, ese cerebro está siendo mejorado por otra parte de la PC: la GPU (unidad de procesamiento de gráficos), que es su alma.

La GPU es una clase en sí misma: va mucho más allá de las funciones básicas del controlador de gráficos y es un dispositivo computacional potente y programable por derecho propio.

Qué es una GPU

Las capacidades avanzadas de la GPU se usaron originalmente principalmente para renderizar juegos en 3D. Pero ahora esas capacidades se aprovechan de manera más amplia para acelerar las cargas de trabajo computacionales en áreas tales como el modelado financiero, la investigación científica de vanguardia y la exploración de petróleo y gas.
"Las GPU están optimizadas para tomar grandes lotes de datos y realizar la misma operación una y otra vez muy rápido, a diferencia de los microprocesadores de PC, que tienden a omitirse por todo el lugar."

Arquitectónicamente, la CPU se compone de pocos núcleos con mucha memoria caché que puede manejar algunos hilos de software a la vez. En contraste, una GPU se compone de cientos de núcleos que pueden manejar miles de subprocesos simultáneamente. La capacidad de una GPU con más de 100 núcleos para procesar miles de subprocesos puede acelerar un poco de software en 100 veces con solo una CPU. Además, la GPU logra esta aceleración a la vez que es más eficiente en términos de energía y de costos que una CPU.
Comparaciones entre CPU y GPU

Desempeño y Rendimiento


Cuando se dice que una computadora es más rápida que otra, ¿qué se quiere decir? El usuario de una computadora individual puede decir que ésta es más rápida cuando ejecuta un programa en menos tiempo, mientras que el director de un centro de cálculo puede decir que una computadora es más rápida cuando completa más tareas en una hora.
El usuario de la computadora está interesado en reducir el tiempo de respuesta – el tiempo transcurrido entre el comienzo y el final de un evento - denominado también tiempo de ejecución o latencia.
Métricas para determinar el rendimiento
El tiempo de ejecución el tiempo es la medida del rendimiento de la computadora: la computadora que realiza la misma cantidad de trabajo en menos tiempo es la más rápida.
El tiempo de ejecución de un programa se mide en segundos por programa. El tiempo se puede definir de formas distintas dependiendo de lo que se quiera contar. La definición más directa de tiempo se denomina tiempo de reloj (wall-clock time), tiempo de respuesta (response time), o tiempo transcurrido (elapsed time). Esta es la latencia para completar una tarea, incluyendo accesos a disco, accesos a memoria, actividades de entrada/salida,gastos del sistema operativo.

Rendimiento del CPU
La mayoría de las computadoras se construyen utilizando un reloj que funciona a una frecuencia constante. Estos eventos discretos de tiempo se denominan pulsos, pulsos de reloj, períodos de reloj, relojes, ciclos o ciclos de reloj.
Los diseñadores de computadoras referencian el tiempo de un período de reloj por su duración (por ejemplo, 10 ns) o por su frecuencia (por ejemplo, 100 MHz). El tiempo de CPU para un programa puede expresarse entonces de dos formas: 

Ciclos por Instrucción (CPI)
Además del número de ciclos de reloj para ejecutar un programa, también se puede contar el número de instrucciones ejecutadas - la longitud del camino de instrucciones o el recuento de instrucciones (IC, instruction count). Si se conoce el número de ciclos de reloj y el recuento de instrucciones, es posible calcular el número medio de ciclos de reloj pornstrucción (CPI)
Esta medida del rendimiento del CPU proporciona una nueva percepción en diferentes estilos de repertorios de instrucciones e implementaciones. Al transponer el IC en la  fórmula anterior, los ciclos de reloj pueden definirse como ICxCPI. Esto permite utilizar al CPI en la fórmula del tiempo de ejecución: 


MIPS y errores de utilización
Hasta el momento se ha visto que la única medida fiable y consistente del rendimiento es el tiempo de ejecución de los programas reales, en esta sección se analizan otras alternativas al tiempo, propuestas como métricas para los programas reales, que presentándose como «items» medidos han conducido, eventualmente, a afirmaciones erróneas o incluso a errores en el diseño de las computadoras. Una de estas alternativas son los MIPS, o millones de instrucciones por segundo. Para un programa dado, los MIPS son sencillamente Recuento de Instrucciones Frecuencia de reloj MIPS = Tiempo de ejecución x 106 = CPI x 106 Algunos encuentran adecuada la fórmula de más a la derecha, ya que la frecuencia de reloj es fija para una máquina y el CPI, habitualmente, es un número pequeño, de forma distinta a la cuenta de instrucciones o al tiempo de ejecución. La relación de los MIPS con el tiempo es:
MFLOPS y errores de utilización
Otra alternativa popular al tiempo de ejecución son los millones de operaciones en punto flotante por segundo, abreviadamente megaFLOPS o MFLOPS, pero siempre pronunciado «megaflops». La fórmula de los MFLOPS es simplemente la definición del acrónimo: 

 Programas para evaluar el rendimiento
Un usuario de computadoras que ejecuta los mismos programas día tras día sería el candidato perfecto para evaluar una nueva computadora. Para evaluar un nuevo sistema simplemente compararía el tiempo de ejecución de su carga de trabajo habitual (workload) la mezcla de programas y órdenes del sistema operativo que los usuarios ejecutan en una máquina. Sin embargo, pocas veces ocurre esta feliz situación. La mayoría de veces se debe confiar en otros métodos para evaluar las máquinas, y con frecuencia, en otros evaluadores, esperando que estos métodos predigan el rendimiento de la nueva máquina.Niveles de programas utilizados en estas circunstancias, listados a continuación en orden
decreciente de precisión.
1. Programas reales (Real programs). - Aunque el comprador puede no conocer qué fracción de tiempo se emplea en estos programas, sabe que algunos usuarios los ejecutarán para resolver problemas reales. Ejemplos son compiladores de C, software de tratamiento de textos como TeX, y herramientas CAD como Spice. Los programas reales tienen entradas, salidas y opciones que un usuario puede seleccionar cuando está ejecutando el programa.
2. «Núcleos» (Kernels). - Se han hecho algunos intentos para extraer pequeñas piezas claves de programas reales y utilizarlas para evaluar el rendimiento. «Livermore Loops» y «Linpack» son los ejemplos mejor conocidos. De forma distinta a los programas reales, ningún usuario puede correr los programas «núcleo»; únicamente se emplean para evaluar el rendimiento. Los «núcleos» son adecuados para aislar el rendimiento de las características individuales de una máquina para explicar las razones de las diferencias en los rendimientos de programas reales.
3. Benchmarks reducidos (Toy benchmarks). - Los benchmarks reducidos, normalmente, tienen entre 10 y 100 líneas de código y producen un resultado que el usuario conoce antes de ejecutarlos. Programas como la Criba de Eratóstenes, Puzzles, y Ordenamiento Rápido (Quicksort) son populares porque son pequeños, fáciles de introducir y de ejecutar casi en cualquier computadora. 

La Ley de Amdahl define la ganancia de rendimiento o aceleración (speedup) que puede lograrse al utilizar una característica particular. Si para una máquina es posible realizar una mejora que, cuando se utilice, aumente su rendimiento. La aceleración está dada por la relación: 

Referencias

http://ldc.usb.ve/~yudith/docencia/ci-3825/ClaseThreads.pdf
http://carteleras.webcindario.com/pipeline-intro.pdf
http://www.dacya.ucm.es/hidalgo/arquitectura/pipeline.pdf
https://www.dc.uba.ar/materias/oc1/2010/c2/descargas/apunte-memoria-cache.pdf
http://electro.fisica.unlp.edu.ar/arq/transparencias/ARQII_00-Repaso2.pdf
https://blogs.nvidia.com/blog/2009/12/16/whats-the-difference-between-a-cpu-and-a-gpu/
https://previa.uclm.es/profesorado/licesio/Docencia/ETC/15_MedidasRendimiento_itis.pdf
http://mixteco.utm.mx/~merg/AC/pdfs/Unit_1_Part_2.pdf

viernes, 27 de octubre de 2017

Modelos de Arquitectura de Computo

Existen diversos tipos de arquitectura de computo  a través del recorrido de la historia computacional  dentro de la cuales podemos mencionar las siguientes como pilares fundamentales.
  • Arquitecturas Clásicas
    • Arquitectura Mauchly-Eckert (Von Newman)
    • Arquitectura Harvard.
  •  Arquitecturas Segmentadas.
  • Arquitecturas de multiprocesamiento.
    •  SISO 
    •  SIMO 
    •  MISO 
    • MIMO
La arquitectura Eckert-Mauchly (publicada por John von Neumann y la más utilizada) describe una computadora en 4 secciones principales:
 
Unidad aritmetica logica (ALU): calcula operaciones aritmeticas (como adicion, substracción, etc.) y operaciones lógicas (como OR, NOT, XOR, etc.) 

Unidad de control: encargada de activar o desactivar los diversos componentes del microprocesador en función de la instrucción que el microprocesador esté ejecutando 

Memoria central: dispositivos y medios de grabación que retienen datos informáticos durante algún intervalo de tiempo 

Dispositivos de entrada y salida (E/S): dispositivos de comunicación con el exterior.

Esta arquitectura es la más empleada en la actualidad ya, que es muy versátil. Ejemplo de esta versatilidad es el funcionamiento de los compiladores, los cuales son programas que toman como entrada un archivo de texto conteniendo código fuente y generan como datos de salida, el código maquina que corresponde a dicho código fuente (Son programas que crean o modifican otros programas). Estos datos de salida pueden ejecutarse como un programa posteriormente ya que se usa la misma memoria para datos y para el código del programa.




La principal desventaja de esta arquitectura, es que el bus de datos y direcciones único se convierte en un cuello de botella por el cual debe pasar toda la información que se lee de o se escribe a la memoria, obligando a que todos los accesos a esta sean secuenciales. Esto limita el grado de paralelismo (acciones que se pueden realizar al mismo tiempo) y por lo tanto, el desempeño de la computadora. Este efecto se conoce como el cuello de botella de Von Newman.


 Arquitectura Harvard se utilizan dispositivos de almacenamiento (memorias) separados para las instrucciones y los datos, y tiene dos sistemas completos de buses, uno para datos y otro para instrucciones. Esta arquitectura perite llevar simultáneamente datos e instrucciones por lo que permite mayor rapidez. 
El hecho de tener un bus separado para el programa y otro para los datos permite que se lea el código de operación de una instrucción, al mismo tiempo se lee de la memoria de datos los operados de la instrucción previa. Así se evita el problema del cuello de botella de Von Newman y se obtiene un mejor desempeño.
 Comparacion entre Harvard y Neuman


Las arquitecturas segmentadas o con segmentación del cauce buscan mejorar el desempeño realizando paralelamente varias etapas del ciclo de instrucción al mismo tiempo. El procesador se divide en varias unidades funcionales independientes y se dividen entre ellas el procesamiento de las instrucciones. Para Procesador Memoria de datos Entrada y salida Bus de datos Memoria de programa Bus de programa Registros ALU Unidad de Control comprender mejor esto, supongamos que un procesador simple tiene un ciclo de instrucción sencillo consistente solamente en una etapa de búsqueda del código de instrucción y en otra etapa de ejecución de la instrucción.

En la segmentacion la ejecución de una instrucción pasa por varias etapas:
1. Búsqueda de Instrucción.
2. Decodificación.
3. Búsqueda de Operandos.
4. Ejecución.
5. Almacenamiento de Resultados.

Mejora dramáticamente el rendimiento debido a que en los procesadores modernos tienen hasta 14 etapas en el ciclo de instrucción.
La unidad de control se subdivide en dos o más unidades funcionales, cada una encargada de llevar a cabo una parte del ciclo de instrucción.
Se comunican a través de una cola de instrucciones (Pipeline)

Arquitecturas  multiprocesamiento  construidas con dos o más procesadores, esto nos permite ejecutar de manera simultánea varios procesos, su ventaja reside en la operación llamada cambio de contexto que consiste en quitar un proceso de la CPU, ejecutar otro y volver a colocar el primero sin que se entere de nada. Los dos objetivos primordiales de los multiprocesadores son acelerar la ejecución de aplicaciones orientadas a la supercomputación y ejecutar más aplicaciones por unidad de tiempo. 

Los sistemas multiprocesadores tienen dos modelos de organización:

. Los de memoria compartida, que permiten, a través de la red de interconexión, que cualquier procesador acceda a cualquier posición de memoria, sin embargo en este tipo de multiprocesadores, la red de interconexión es un cuello de botella lo cual impide que sea escalable.


Los de memoria distribuida, donde la red de interconexión permite que cualquier procesador se comunique con cualquier otro del sistema. Los sistemas multiprocesadores, pero en especial los de memoria distribuida, tienen una gran potencia de cálculo y al paso del tiempo esta característica sigue aumentando. La figura 2 muestra la estructura de este tipo de sistemas.
Las CPU de multiprocesamiento se clasifican de la siguiente manera (Clasificación de Flynn):
SISO – (Single Instruction, Single Operand ) computadoras Monoprocesador
SIMO – (Single Instruction, Multiple Operand ) procesadores vectoriales, Exenciones MMX
MISO – (Multiple Instruction, Single Operand ) No implementado
MIMO – (Multiple Instruction, Multiple Operand ) sistemas SMP, Clusters, GPUs .

La nueve tendencia en Arquitecturas de computo procesadores vectoriales son computadoras pensadas para aplicar un mismo algoritmo numérico a una serie de datos matriciales, en especial en la simulación de sistemas físicos complejos, tales como simuladores para predecir el clima, explosiones atómicas, reacciones químicas complejas, etc., donde los datos son representados como grandes números de datos en forma matricial sobre los que se deben se aplicar el mismo algoritmo numérico.

Como su nombre implica, los procesadores vectoriales se ocupan de múltiples datos en el contexto de una instrucción, contrastando con las CPUs más comunes de hoy en día que tienen procesadores escalares/superescalares y tratan un dato por cada una. A estos dos esquemas se les conoce respectivamente como SISD (Single Instruction, Single Data) que se corresponde con la arquitectura Von Neumann y SIMD (Single Instruction, Multiple Data) que es una técnica empleada para conseguir paralelismo a nivel de datos. Esta clasificación recibe el nombre de taxonomía de Flynn. Casi todas las CPUs de hoy en día incluyen algunas instrucciones de procesamiento de tipo vectorial. En particular y como se verá más adelante, dispositivos móviles, consolas de videojuegos, tarjetas gráficas, etc hacen un uso intensivo de este tipo de procesamiento. 

Un procesador vectorial (vector processor o array processor)  es una CPU queejecuta instrucciones que operan sobre un array unidimensional de datos (un vector).Una máquina vectorial consta de una unidad escalar segmentada y una unidad vectorial. La unidad vectorial dispone de M registros vectoriales de N elementos y deunidades funcionales vectoriales (de suma, resta, multiplicación, división, decarga/almacenamiento, etc) que trabajan sobre registros de ese tipo.El juego de instrucciones de este tipo de procesadores es evidentemente tambiénvectorial. Un ejemplo de instrucción vectorial sería addv v1,v2,v3, es decir, unaoperación vectorial que equivale a un bucle escalar completo que procesaría los N elementos del registro vectorial.


Referencias
http://www.tdx.cat/bitstream/handle/10803/3038/fgt1de2.pdf?sequence=1
http://www.atc.uniovi.es/inf_superior/4atc/trabajos/paralelas/2-Procesadores%20Vectoriales%20comerciales-memoria.pdf
http://rvazquez.org/Misitio/Arquitectura_de_Computadoras_files/unidad2arqcom.pdf
http://www.frbb.utn.edu.ar/hpc/lib/exe/fetch.php?media=2017-02-aquitecturas.pdf
http://www.aliat.org.mx/BibliotecasDigitales/sistemas/Arquitectura_de_computadoras_II.pdf
http://profesores.fi-b.unam.mx/luist/archivos/MicroprocesadoresSavage.pdf
http://personales.upv.es/pabmitor/acso/FILES/ArqComp/CST/ArqComp%20t4.pdf




lunes, 16 de octubre de 2017

Arquitectura


Arquitectura de computadoras 


Un computador o computadora es una máquina calculadora electrónica rápida que acepta como entrada información digitalizada, la procesa de acuerdo con una lista de instrucciones almacenada internamente y produce la información de salida resultante. A la lista de instrucciones se le conoce como programa y el medio de almacenamiento interno memoria del computador.


Dentro la comprensión del funcionamiento de las computadoras y de todos los sistemas digitales de la actualidad (celulares, reproductores de música, videojuegos, medidores, controladores, etc.) pasa primero por entender el concepto de circuito lógico. Este concepto está ligado a la lógica simbólica tradicional o lógica Booleana (de George Boole, matemático inglés del siglo XIX). Las entradas y salidas de estos circuitos solo pueden tener dos estados: alto (uno) y bajo (cero). 

El dominio de los circuitos binarios en los sistemas digitales es una consecuencia de su simplicidad,que resulta de restringir las señales para asumir solo dos valores posibles. Lo más simple el elemento binario es un conmutador que tiene dos estados en este contexto un estado verdadero 1 o un estado falso 0.

Estos circuitos cuentas con operaciones lógicas básicas reconocidas AND,OR y NOT la principal manera de representación es mediante el uso de tablas de la verdad una ayuda útil para representar información que involucra funciones lógicas.

Representación de Circuitos lógicos:

Circuitos Digitales Combinacionales

Un circuito combinacional es aquel que está formado por funciones lógicas elementales ( AND, OR, NAND, NOR, etc. ), que tiene un determinado número de entradas y salidas, dependiendo los valores que toman las salidas exclusivamente de los que toman las entradas en ese instante. Ejemplo de este tipo de circuitos son : los codificadores, decodificadores, multiplexores, demultiplexores, comparadores, generadores-detectores de paridad, etc.

En este punto se trata el análisis de circuitos combinacionales a nivel de puertas lógicas. La estructura del circuito vendrá dada por su diagrama lógico, cuyos constituyentes serán puertas lógicas cuyo comportamiento lo determina el símbolo que lo representa. Un circuito combinacional se analiza determinando la salida de los elementos lógicos que lo constituyen ( normalmente puertas lógicas ), partiendo de las variables de entrada y avanzando en el sentido de la señal hacia la salida.
Pastes Combinacionales

Partes Cominacionales Utiles
DECODIFICADORES

Un decodificador es un circuito lógico con n entradas y 2 a la n salidas como máximo, tal que para cada combinación de entradas se activa al menos una salida. Si sólo se activa una salida se denomina decodificador completo.
Tanto las entradas como las salidas, principalmente estas últimas, pueden ser:
• ACTIVAS A NIVEL ALTO: la salida activa es 1 y la no activa 0.
• ACTIVAS A NIVEL BAJO: la salida activa es 0 y la no activa 1.
Además el número de entradas de habilitación puede ser de una o más, y
pueden estar activas a nivel alto o bajo.
Podemos encontrar decodificadores de muy diversos “tamaños”:
De 2 a 4 líneas
De 3 a 8 líneas (bin a oct)
De 4 a 16 líneas (bin a hex)
Convertidores de códigos: BCD/decimal y BCD/7-seg
CODIFICADORES

Son los dispositivos MSI que realizan la operación inversa a la realizada por los decodificadores. Generalmente, poseen 2 elevano a la n entradas y n salidas. Cuando solo una de las entradas está activa para cada combinación de salida, sele denomina codificador completo.
MULTIPLEXORES

Multiplexar es pasar información de “muchos” canales o líneas a “pocos”
canales o líneas.Un MULTIPLEXOR (MUX) es un circuito combinacional que selecciona una entrada y la transfiere a la salida. La selección de la entrada, o dato, se realiza según un conjunto de valores de las variables de control.Poseen por tanto, n entradas de selección, para 2 elevado a la n entrada de datos, proporcionando, generalmente, dos salidas: una para el dato directo y otra para el dato negado.

DEMULTIPLEXORES 

En realidad no existen como tales, sino que vienen definidos por los decodificadores/demultiplexores. La función que debe realizar es la inversa de la que realiza el MUX, o sea, debemos seleccionar una salida por donde transmitir el dato de la entrada. Por tanto, el circuito constará de 1 entrada de datos, n entradas de selección de salida, y 2 elevado a la n salidas.

Partes Combinacionales Programables

Estos sistemas proporcionan todos los términos posibles que podemos obtener con las variables de entrada. Su estructura es de tipo "AND Fija - OR Programable". Sólo la matriz OR es programable.

 PROM (Programmable Read Only Memory 'Memoria programable de sólo lectura'. 

PAL es un sistema combinacional programable universal incompleto,de estructura similar a la de una PLA, de la cual se diferencia en que cada una delas puertas OR están conectadas rígidamente a un conjunto de puertas AND cadauna. En general, si el número de términos producto es n’ y el de salidas m, cadauna de estas últimas irá conectada a n’/m puertas AND.

Una PLA está constituida por una matriz de n’ (n’ < 2n, donde n el númerode entradas) puertas AND y una matriz de puertas OR, ambas programables. Laspuertas AND poseen 2n entradas que se unen a cada variable de entrada a travésde conexiones que pueden ser eliminadas.

CIRCUITOS DIGITALES CON MEMORIA

Circuitos combinacionales con memoria
En los sistemas secuenciales la salida o salidas en un instante de tiempo no solo dependen de los valores de las entradas en ese instante, sino también de los valores que tuvieron en tiempos anteriores. 

Circuitos combinacionales sin memoria
Dependen de sus entradas corrientes no tienen historia pasasda ,cantidad finita de memoria 

Circuitos secuenciales:

Un latch (Lat Memori Inglet) es un circuito electrónico usado para almacenar información en sistemas lógicos asíncronos. Un latch puede almacenar un bit de información. Los latches se pueden agrupar, algunos de estos grupos tienen nombres especiales, como por ejemplo el 'latch quad' (que puede almacenar cuatro bits) y el 'latch octal' (ocho bits). Los latches pueden ser dispositivos biestables asíncronos que no tienen entrada de reloj y cambian el estado de salida solo en respuesta a datos de entrada, o bien biestables síncronos por nivel, que cuando tienen datos de entrada, cambian el estado de salida sólo si lo permite una entrada de reloj.

El latch mas simple es el RS y D.

Flip-Flops 

Los circuitos secuenciales son aquellos en los cuales su salida depende de la entrada presente y pasada. Dentro de estos circuitos se tienen a los Flip-Flops. 
Los Flip-Flops son los dispositivos con memoria mas comúnmente utilizados. Sus características principales son:
Asumen solamente uno de dos posibles estados de salida.
Tienen un par de salidas que son complemento una de la otra.
Tienen una o mas entradas que pueden causar que el estado del Flip-Flop cambie. 

Tipos de Flip-Flops
Flip-Flop S-R  (Set-Reset)

Flip-Flop T

Flip-Flop J-K
Flip-Flop D

Registros 
Represntan un arreglo de flip-flops con entradas de datos individuales y señales de control comun tenemos los siguientes.

Registros de Desplazamiento
Es un registro que ‘registra’ y ‘desplaza’ la información.

Registro de Despalazamiento con carga paralelo Un registro de este tipo carga todos los bits al mismo tiempo, con lo que no es necesario esperar muchos pulsos de reloj para obtener la información.

Registro de Desplazamiento Universal Se trata de un circuito integrado, que dispone de un registro de desplazamiento, que permite carga serie, carga paralela, desplazamiento a izquierda y a derecha, mediante el uso de unas señales de control.

Aplicaciones de los registros.
 Se utilizan donde se necesiten un almacenamiento temporal de información, por ejemplo, conectados a las salidas de circuitos combinacionales aritméticos para recoger el resultado de una operación, para
almacenar operaciones intermedias o proporcionar información estable a un sistema de representación por displays. Los distintos registros comparten líneas comunes llamadas buses tanto para recoger la información del bus como para volcar la información al bus, pero no todos los registros a la vez, sino uno y después otro. Mientras un registro vuelca su información al bus, otros registros conectados al mismo bus permanecen en estado de alta impedancia.También se suele utilizar para almacenar datos y direcciones en las operaciones de escritura y lectura
de las memorias por parte de los microprocesadores.

Maquinas de estado finito
Una máquina de estado finito M = (S, I, O,f, g, so) consiste de un conjunto finito deestados, un alfabeto finito de entrada I, unalfabeto finito de salida O, una función detransición f que asigna a cada par deestados y entrada un nuevo estado, unafunción de salida g que asigna a cada parde estados y entrada una salida, y unestado inicial so. 
Las maquinas de estado finito pueden ser:
*Máquina de Moore: es una máquina de estado que determina sus salidas solamente dependiendo de los estados presentes de la máquina.
*Máquina de Mealy: es una máquina de estado que determina sus salidas dependiendo de los estados presentes de la máquina y de las entradas.
Tipos de  de memoria: 

SDRAM:Esto significa que se espera una señal de reloj antes de responder a las entradas de control y por lo tanto está sincronizada con el bus de sistema, a diferencia de la DRAM que tiene una interfaz asíncrona lo que significa que responde lo antes posible a los cambios en las entradas de control.

DRAM:Tipo de memoria RAM más usada. Almacena cada bit de datos en un capacitor separado dentro de un circuito integrado. Dado que los capacitores pierden carga, eventualmente la información se desvanece a menos que la carga del capacitor se refresque y cargue periódicamente (períodos cortísimos de refresco).

ROM:Circuito integrado de memoria de solo lectura que almacena instrucciones y datos de forma permanente.

PROM:es una digital donde el valor de cada bit depende del estado de un fusible (o antifusible), que puede ser quemado una sola vez.

EPROM: se programan mediante un dispositivo electrónico, como el Cromemco Bytesaver, que proporciona voltajes superiores a los normalmente utilizados en los circuitos electrónicos. Las celdas que reciben carga se leen entonces como un 0.

Partes secuenciales utiles:

Contador es un circuito secuencial construido a partir de biestable y puertas lógicas capaz de almacenar y contar los impulsos (a menudo relacionados con una señal de reloj), que recibe en la entrada destinada a tal efecto, asimismo también actúa como divisor de frecuencia. Normalmente, el cómputo se realiza en código binario, que con frecuencia será el binario natural o el BCD natural (contador de décadas).

Según la forma en que conmutan los números, podemos hablar de contadores numeradores (todos los números conmutan a la vez, con una señal de reloj común) o asíncronos (el reloj no es común y los números conmutan uno tras otro.

Reloj:Constituye un circuito que emite una señal periódica.


Tecnologías de Sistemas de Computación


Ley de Moore

En 1965 Gordon Moore, co-fundador de Intel, formulo una teoría que se convirtió en ley sobre la velocidad de la evolución de las computadoras (microprocesadores). La ley de Moore nos habla de un crecimiento exponencial: doblar la capacidad de los microprocesadores cada año y medio.
Se estima que esta ley sea valida durante dos décadas mas aproximadamente, cuando no se puedan crear microprocesadores mas pequeños por limitaciones físicas de los materiales usados para crearlos.

Resultado de imagen para Ley de moore
GENERACIÓN DE COMPUTADORAS

Tubos de vacío. Grandes,lentos y desprenden mucho calor El uso fundamental fue la realización de aplicaciones en los campos cientifco y militar. Uitlizaban como lenguaje de programación, el lenguaje máquina (o y 1) y como única memorias para conservar la información estaban las tarjetas perforadas y las líneas de demosra de mercurio.
UNIVAC (1950) versión comercial del ENIAC.

Transistores (inventado en 1948). Más rápidos, más pequeños y más fiables. Los campos de aplicación fueron además del científico y militar, el adminsitrativo y de gestión. Comienzan a utilizarse lenguajes de programación evolucionados, como son el ensamblador y lenguajes de alto nivel ( COBOL, ALGOL FORTRAN).
Circuítos integrados (inventados en 1958 por Jack St. Clair Kilby y Robert Noice), también llamados semiconductores.

Circuito integrado encapsula gran cantidad de componentes discretos (resistencias, condensadores, diodos y transistores), conformando uno o varios circuitos en una pastilla de silicona o plástico.

Microprocesador del mundo (1971). Uso de memorias electrónicas.Ordenadores conectados a redes. Uso del disquete como uniDad de almacenamiento. Aparecen gran cantidad de lenguAjes de programación de todo tipo y las redes de transmisión de datos parA la interconexión de computadoras.


De los componentes a las aplicaciones es un proceso que pasa por diferentes etapas de diseño y diseñadores algunas de ellas son:

Diseñar aplicaciones con el Diseñador de aplicaciones. El Diseñador de aplicaciones proporciona una superficie para diseñar, configurar y conectar aplicaciones que que proporcionan o utilizan servicios. Con estas definiciones de aplicación, puede crear sistemas de aplicación y evaluar su implementación.

 Diseñador de sistemas es el que de define la arquitectura de hardware y software, componentes, módulos y datos de un sistema de cómputo, a efectos de satisfacer ciertos requerimientos. Es la etapa posterior al análisis de sistemas

Diseñador de computadoras conocimiento a nivel logico para entender sumadores de archivos de registro y estar informado sobre conflictos en el area de diseño de sistemas.

Diseñador  lógico es el que se encarga  de construir un esquema logico  con patrones los diferentes patrones.

Diseñador de  circuitos es la parte de la electrónica que estudia distintas metodologías con el fin de desarrollar un circuito electrónico.

Sistemas de cómputos y sus partes

Sistemas de computo personales, servidores, estación de trabajo, super computadoras y las diferentes medio de entrada y salida  como ser mouse, teclado, monitor, escaner etc...

Sistema de software y sus aplicaciones

La palabra software se refiere a las instrucciones que se incorporan a un sistema informático para que este lleve a cabo una determinada función. Partiendo de esta sencilla definición, el campo que se esconde detrás es inmenso, porque engloba desde pequeñas aplicaciones para llevar a cabo tareas muy específicas, a archivos conocidos sistemas operativos con capacidad para realizar miles de funciones.

Rendimiento de Computadoras

Se define rendimiento de un sistema como la capacidad que tiene dicho sistema para realizar un trabajo en un determinado tiempo. Es inversamente proporcional al tiempo, es decir, cuanto mayor sea el tiempo que necesite, menor será el rendimiento. Los computadores ejecutan las instrucciones que componen los programas, por lo tanto el rendimiento de un computador está relacionado con el tiempo que tarda en ejecutar losprogramas. De esto se deduce que el tiempo es la medida del rendimiento de un computador. 

El rendimiento del procesador depende de los siguientes parámetros:
1. Frecuencia de la CPU (fCPU) : es el número de ciclos por segundo al que trabaja el procesador o CPU. No confundir la frecuencia de la CPU con la frecuencia del sistema, el bus delsistema trabaja a menor frecuencia que la CPU.


2. Periodo de la CPU (TCPU) : es el tiempo que dura un ciclo y es la inversa de la frecuenciade la CPU.


3. Ciclos por instrucción (CPI) : las instrucciones se descomponen en micro instrucciones,que son operaciones básicas que se hacen en un ciclo de reloj. En un programa se llama CPI al promedio de micro instrucciones que tienen las instrucciones del programa, es decir, los ciclos de reloj que se tarda de media en ejecutar una instrucción.


4. Número de instrucciones del programa : cuantas más instrucciones haya en el
programa más tiempo se tarda en ejecutarlo luego baja el rendimiento. El que tengamos un número
reducido de instrucciones dependerá del programador y de que dispongamos de un buen
compilador.

5. Multitarea :hace referencia a la capacidad que tiene un computador de atender simultáneamente varias tareas. Como anteriormente hemos comentado, el rendimiento de un procesador para un programa concreto es un factor inversamente proporcional al tiempo que tarda en ejecutar dichoprograma.


El tiempo de programa depende a su vez del número de instrucciones del programa y del tiempo que se tarda en ejecutar cada instrucción.

Principios de Diseño.

1. Diseñando con la Ley de Moore en mente.
Indica que los recursos de circuitos integrados duplican cada 18-24 meses. Los recursos disponibles por chip pueden duplicarse o cuadruplicarse fácilmente entre el comienzo y la conclusión del proyecto.

2. Use la abstracción para simplificar el diseño.
Una de las principales técnicas de productividad para el hardware y el hardware es utilizar abstracciones para representar el diseño en diferentes niveles de representación; Los detalles de nivel inferior están ocultos de un modelo más simple en niveles más altos.

3. Haga que el caso común sea rápido.
Hacer que el caso común sea rápido tenderá a mejorar el rendimiento mejor que optimizando el caso raro. Irónicamente, el caso común es más sencillo que el caso raro y por lo tanto es más fácil de mejorar.

4. Desempeño vía  paralelismo.
Los arquitectos de computadoras tienen diseños más rendimiento realizando operaciones en paralelo.

5. Desempeño vía Pipelining.
Un patrón particular de paralelismo es tan frecuente en la arquitectura computacional que
Merece su propio nombre: pipelining.

6. Desempeño vía predicción
En algunos casos puede ser más rápido en promedio para adivinar y empezar a trabajar en lugar de esperar hasta que sepa con seguridad, suponiendo que el mecanismo para recuperarse de una mala predicción no es demasiado caro y su predicción es relativamente precisa.

7. Jerarquía de memorias.
La memoria más rápida, más pequeña y más cara por bit en la parte superior de la jerarquía
Y el más lento, más grande y más barato por bit en la parte inferior. La forma indica velocidad, costo y tamaño: cuanto más cerca de la parte superior, más rápido y más caro por bit la memoria; Cuanto más ancha sea la base de la capa, mayor será la memoria.

8. Dependencia  vía redundancia.
Los ordenadores no sólo necesitan ser rápidos; necesitan ser confiables. Dado que cualquier dispositivo puede fallar, hacemos que los sistemas sean fiables incluyendo componentes redundantes que puede asumir el control cuando ocurre un fallo y para ayudar a detectar fallas.

Costo, Rendimiento y costo/rendimiento

Un atributo clave de un sistema de cómputo es su costo. En cualquier año específico, probablemente se pueda diseñar y construir una computadora que sea más rápida que la más rápida de las computadoras actuales disponibles en el mercado. Sin embargo, el costo podría ser tan inalcanzable que quizá esta última máquina nunca se construya o se fabrique en cantidades muy pequeñas por agencias que estén interesadas en avanzar el estado del arte y no les importe gastar una cantidad exorbitante para lograr esa meta. Por ende, la máquina de mayor rendimiento que sea tecnológicamente factible puede nunca materializarse porque es ineficaz en costo (tiene una razón costo/rendimiento inaceptable debido a su alto costo).

Sería simplista igualar el costo de una computadora con su precio de compra. En vez de ello, se debería intentar evaluar su costo de ciclo de vida, que incluye actualizaciones, mantenimiento, uso y otros costos recurrentes. Observe que una computadora que se compra por dos mil dólares tiene diferentes costos. Puede haberle costado 1500 dólares al fabricante (por componentes de hardware, licencias de software, mano de obra, embarque, publicidad), y los 500 dólares restantes cubran comisiones de ventas y rentabilidad. En este contexto, podría llegar a costar cuatro mil dólares durante su tiempo de vida una vez agregado servicio, seguro, software adicional, actualizaciones de hardware, etcétera.

La formula para el rendimiento es la siguiente:
                                                   1/ tiempo de ejecución

Mejorar el rendimiento Ley de Amdhal: Siendo T el tiempo de ejecución de una tarea, y f la fracción de ese tiempo que puede acelerarse un factor k, la aceleración obtenida será:


Medición del rendimiento contra el modelado

Una prueba de rendimiento o comparativa (en inglés benchmark) es una técnica utilizada para medir el rendimiento de un sistema o uno de sus componentes. Más formalmente puede entenderse que una prueba de rendimiento es el resultado de la ejecución de un programa informático o un conjunto de programas en una máquina, con el objetivo de estimar el rendimiento de un elemento concreto, y poder comparar los resultados con máquinas similares. En el ámbito de las computadoras, una prueba de rendimiento podría ser realizada en cualquiera de sus componentes, ya sea la CPU, RAM, tarjeta gráfica, etc. También puede estar dirigida específicamente a una función dentro de un componente, como la unidad de coma flotante de la CPU, o incluso a otros programas.

INSTRUCCIONES Y DIRECCIONAMIENTO

 La vision abstracta del  hardware de computadora es su arquitectura de conjunto de instrucciones. Es necesario aprender esta interfaz para ser capaz de indicar a la computadora a realizar tareas computacionales de interés.

Una de los conjuntos de instrucciones que utilizaremos es el MIPS (Machine without Interlocked Pipelined Stages)
 Arquitectura diseñada por Hennessey, en 1980,guiada por los siguientes principios:
– La simplicidad favorece la regularidad
– Más pequeño es más rápido (menos es mas)
– Hacer rápido el caso común
 Objetivos de diseño: maximizar rendimiento y reducir costos usado por: NEC, Nintendo, Silicon Graphics, Sony.

MIPS es un conjunto de instrucciones load/store (carga/almacenamiento), ello significa que los elementos de datos se deben copiar o cargar (load) en registros antes de procesarlos; los resultados de operación también van hacia registros y se deben copiar explícitamente de vuelta a la memoria a través de operaciones store (almacenamiento) separadas.
Organización MIPS
Unidad Aritmética y Lógica (ALU) Unidad Aritmética entera, operaciones demultiplicación y división. Unidad punto flotante (FPU). Coprocesador dedicado al manejo de memoria caché y virtual.

Memoria
Se denomina palabra (word) al contenido de una celda de memoria.MIPS posee palabras de 32 bits. Las direcciones de memoria correspondes adatos de 8 bits (byte). 4 bytes en una palabra.Para acceder a una palabra se leen 4 bytes.

Dos formas de numerar los bytes contenidos en una palabra:Big endian (IBM, Motorola, MIPS)
Dos formas de numerar los bytes contenidos en una palabra:  Little endian (Intel, Dec)


Formato de Instrucciones

Formato de Instrucciones MIPS Formato R para operaciones.
Tres registros, dos para especificar las fuentes de datos y ellugar para almacenar el resultado.
Instrucciones de corrimiento utilizan el campo Shamnt (Shift Amount), especifica el número de posiciones de bits que sedesplazará uno de los operandos.
Un campo para expandir el código de operación.

Op: Operacion
Rs: Primer registro operando fuente
Rt :Segundo registro opeando fuente
Rd:Registro operando distinto donde se almacena el resultado de la operacion.
Shamnt:Tamaño del desplazamiento.
Funct:Funcion este campo selecciona la variante especifica de la operacion del campo op y aveces se le denomina codigo funcion.

Formato I para inmediatas, transferencias y
bifurcaciones. Se emplean 16 bits, para programar un valor constante.Basta un registro de operando y otro para depositar elresultado.Las operaciones lógicas se extienden los 16 bits a 32 conceros en la parte más significativa. Las operaciones aritméticas se extienden con signo.
Formato J para saltos
 Posee un campo de 26 bits que se emplea para generar la dirección efectiva de salto.

Formato Load -Store

Tipos de instrucciones de MIPS

El conjunto de instrucciones que especificamos permite realizar operaciones de carga y almacenamiento desde y hacia memoria tendrá capacidad de desarrollar programas aritméticos y lógicos y ofrecerá la posibilidad de controlare el flujo de la ejecución del programa mediante instrucciones de comparación y salto tanto condicionales como incondicionales en resumidas cuentas tendremos:
Instrucciones Aritméticas.
Instrucciones Lógicas.
Instrucciones de carga.
Instrucciones de comparación.
Instrucciones de salto condicional.
Instrucciones de salto incondicional.


Modos de direccionamiento

Contar con diferentes formatos de instrucciones, implica contar con diferentes formas de obtener los operandos de las instrucciones. Por lo general a estas múltiples formas se les conoce como modos de direccionamiento. Los modos de direccionamiento en MIPS son:

Direccionamiento por registro, donde los operandos son registros. Los datos a operar están contenidos en 2 registros de 32 bits y el resultado será colocado en otro registro, del mismo tamaño. 

Direccionamiento base o desplazamiento, donde uno de los operandos está en una localidad de memoria cuya dirección es la suma de un registro y una constante que forma parte de la misma instrucción. 

Direccionamiento inmediato; donde uno de los operandos es una constante que está en la misma instrucción.

Direccionamiento relativo al PC, donde se forma una dirección sumando una constante, que está en la instrucción, con el registro PC (Program Counter). El resultado de la suma corresponde a la dirección destino si un brinco condicional se va a realizar. 

Direccionamiento pseudo directo, donde la dirección destino de un salto corresponde a la concatenación de 26 bits que están en la misma instrucción con los bits mas significativos del PC.

Ejemplos MIPS:

código C: A = B + C
código MIPS: add $s0, $s1, $s2

código C: A = B + C + D; E = F - A; 
código MIPS: add $t0, $s1, $s2 add $s0, $t0, $s3 sub $s4, $s5, $s0

codigo estructura if

codigo estructura for

 
Ejemplos de MIPS elaborados en clase  con  QTSPIM

Ejercicio 1
data
.text
.globl main

 main:
li $t0,1
li $t1,3
li $t2,2
bne $t0,$t1,continuar
add $t2, $t2, 1

 continuar: add $t3, $t0, $t1

 li $v0,10
 syscall
Ejercicio 2
.data
.text
.globl main

 main:
li $t0,2
li $t1,2
li $t2,3
bne $t0,$t1,continuar
add $t2, $t2, 1

 continuar: add $t2, $t0, $t1

 li $v0,10
Ejercicio 3
.data
.text
.globl main

 main:
li $t0,1
li $t1,10
li $t2,5
while: 
slt $t3, $t0,$t1
beq $t3,$zero,end
add $t0, $t0, 1
add $t2, $t2, 1
j while

 end:

 li $v0,10
 syscall
Ejercicio 4
.data
.text
.globl main

 main:
li $t0,1
li $t1,5
li $t2,2

slt $t3, $t0,$t1
beq $t3,$zero,else1
add $t5, $t0,$t0
sub $t1, $t0,$t5
else1:

slt $t4, $t1,$t0
beq $t4,$zero,else2
add $t6, $t1, $t1  
sub $t0, $t1,$t5
else2:
add $t2, $t2,1

 end:

 li $v0,10
 syscall

 Ejercicio 5
.data
.text
.globl main

 main:
li $t0,2
li $t1,10
do: 
slt $t3, $t0,$t1
beq $t3,$zero,end
add $t1, $t1, 1
add $t0, $t0, 1
add $t0, $t0, 1
j do

 end:

 li $v0,10
 syscall

Referencias
http://www.aliat.org.mx/BibliotecasDigitales/sistemas/Arquitectura_computadoras_I.pdf
http://paginas.fisica.uson.mx/horacio.munguia/aula_virtual/Cursos/Instrumentacion%20I/Temario/Circuitos%20Logicos.htm
http://paginas.fisica.uson.mx/horacio.munguia/aula_virtual/Cursos/Instrumentacion%20I/Documentos/Intro_Circuitos_Logicos.pdf
http://www.profesormolina.com.ar/electronica/componentes/int/sist_comb.htm
http://www.uhu.es/rafael.lopezahumada/descargas/tema5_fund_0405.pdf
http://www.uhu.es/rafael.lopezahumada/descargas/tema9_fund_0506.pdf
http://cidecame.uaeh.edu.mx/lcc/mapa/PROYECTO/libro16/43_latches.html
http://www.uhu.es/rafael.lopezahumada/Cursos_anteriores/fund01_02/tema8.pdf
http://www.esi.uclm.es/www/isanchez/teco0910/profesor/tema8.pdf
http://www.profesores.frc.utn.edu.ar/electronica/tecnicasdigitalesi/pub/file/AportesDelCudar/Maquinas%20de%20Estado%20MC%20V5.pdf
http://bv.ujcm.edu.pe/links/cur_sistemas/ArqComputadoras-02.pdf
http://www.dacya.ucm.es/lanchares/documentos/2.9.5%20Apuntes%20de%20Estructura%20de%20Computadores.pdf
https://www.infor.uva.es/~bastida/OC/TRABAJO2_MIPS.pdf
http://profesores.elo.utfsm.cl/~tarredondo/info/comp-architecture/paralelo2/C03_MIPS.pdf