Está en la página 1de 10

Computación Híbrida 

Co-diseño Hardware-Software
Lino García Morales, lino.garcia@uem.es 

Toda verdad pasa por tres etapas. Primero, es ridiculizada. Segundo, es


violentamente rechazada. Tercero, es aceptada como evidente.

Arthur Schopenhauer 

El término computación híbrida no es demasiado afortunado. En el ámbito del diseño


hardware-software (HW/SW) parece una obviedad. Está claro que los sistemas son
una combinación de ambos componentes HW/SW donde el primero actúa como un
soporte material programable o reconfigurable y el segundo define los procesos
intangibles que gestionarán determinada información o datos para conseguir equis
resultados. En este caso damos por hecho que la hibridación se produce siempre en el
dominio digital; sin embargo, las computadoras hibridas son una combinación entre las
computadoras analógicas y las digitales; se desarrollaron para complementar la
flexibilidad de las computadoras digitales con la velocidad de las computadoras
analógicas y se utilizan sobre todo para el control de procesos y robótica, muy rara vez
fuera del entorno universitario o de investigación.  

El mundo real es analógico, pero la interacción y control sobre esta realidad, desde
hace ya mucho y por ahora, es digital (quizá en un futuro haya un retorno a la
computación analógica pero eso está por ver). Los sistemas son cada vez más
complejos porque el mundo real, en “realidad”, siempre ha sido y será mucho más
complejo de lo que consideramos. Se requieren muy diversas interfaces para capturar
y gestionar esta riqueza y una gran potencia de cálculo para procesarlas.  

Cuando se plantea el diseño de un sistema de este tipo la primera pregunta que surge
es: qué puedo y debo hacer por hardware y qué por software. Esta interrogación es
válida incluso cuando toda la información es digital por naturaleza. La respuesta
claramente dependerá de qué se quiera y habitualmente estará en función de un
conjunto de variables en relación de compromiso como coste, rendimiento,
prestaciones, velocidad, tamaño, etc. 

Un ejemplo que pone de manifiesto una contradicción de la computación híbrida es la


actual guerra de Apple y Adobe en torno al desarrollo de aplicaciones para iPhone y
iPad. Resumiendo, porque el tema es muy complejo, Adobe ataca a Apple porque ni el
iPhone ni el nuevo iPad soportan Flash, y lanza una campaña virulenta contra los
productos de la manzana. Apple contraataca con una carta abierta en la que critica
duramente a Adobe y asegura que sus productos no necesitan esta tecnología, que
considera obsoleta. El propio Steve Jobs asegura que Flash se queda corto tanto en
tecnología como en seguridad y anima a los desarrolladores a crear alternativas para
el ecosistema de Apple: "La era móvil va de dispositivos de baja potencia, pantallas
táctiles y estándares abiertos para la web, todas ellas áreas donde Flash se queda
corto". Y es que Flash, el producto de Adobe, utiliza el códec de vídeo H.264 por
software en lugar de por hardware lo que acaba con la batería de estos dispositivos
portátiles en mucho menos tiempo de lo esperable, ya no de lo deseable. Lo que hay
detrás de esta guerra no es simplemente un problema de diseño técnico. La solución
de Jobs para esta “era móvil” pasa por el diseño de un coprocesador que garantice
bajo consumo, fiabilidad y paralelismo simultáneamente.

Un diseño híbrido adecuado de Flash debería utilizar su códec sólo no exista una
alternativa hardware pero no existe estándar ni voluntad entre las grandes industrias
para solucionarlo en aras de mejores prestaciones para el consumidor. Lo que hay en
juego es mucho más que esto: más del 75% de los videos en Internet se ven a través
de Flash (software instalado en el 98% de los ordenadores a nivel mundial y presente
en más de 800 millones de dispositivos móviles fabricados por 19 de los 20 primeros
fabricantes donde, por supuesto, el vigésimo es Apple). Prueba de esto es que
Universal y Time Warner se posicionan a favor de Adobe y comunican que no tienen
intención de convertir sus colecciones a H.264 porque no es económicamente viable
con Flash dominando la web. 

 
Figura 1.La guerra Apple-Adobe no ha hecho más que comenzar. 

Esto es precisamente lo que se considera en este artículo computación híbrida;


aquella relacionada con el diseño de sistemas eficientes, con la toma de decisiones
acerca de computación HW/SW, con los criterios que condicionan las respuestas. Un
sistema híbrido consiste de hardware (ya sea analógico, digital o mixto) no sólo para
interactuar con el mundo real, sino también para satisfacer determinados
requerimientos de tiempo real, y de software, a distintos niveles de virtualidad y
paralelismo. Un sistema de computación híbrido es un sistema complejo a medida que
combina todos los recursos que necesita para obtener el mejor rendimiento,
prestaciones, seguridad, robustez, etc. En este sentido se puede pensar en un sistema
integrado, multiprocesador (que involucra microcontroladores, microprocesadores y
procesadores digitales de señal), que combina hardware general con especializado y,
mucho más allá, en sistemas reconfigurables que se adaptan o “programan” para
realizar determinadas funciones.

Ingeniería de Sistemas 

Según la Wiki (http://es.wikipedia.org/wiki/Ingeniería_de_sistemas ) “Ingeniería de


sistemas es un modo de enfoque interdisciplinario que permite estudiar y comprender
la realidad, con el propósito de implementar u optimizar sistemas complejos. Puede
verse como la aplicación tecnológica de la teoría de sistemas a los esfuerzos de la
ingeniería, adoptando en todo este trabajo el paradigma sistémico”; definición que
podría valer perfectamente para el objetivo de este artículo. Sin embargo “Una de las
principales diferencias de la ingeniería de sistemas respecto a otras disciplinas de
ingeniería tradicionales, consiste en que la ingeniería de sistemas no construye
productos tangibles. Mientras que los ingenieros civiles podrían diseñar edificios o
puentes, los ingenieros electrónicos podrían diseñar circuitos, los ingenieros de
sistemas tratan con sistemas abstractos con ayuda de las metodologías de la ciencia
de sistemas, y confían además en otras disciplinas para diseñar y entregar los
productos tangibles que son la realización de esos sistemas”.  

En este ámbito compartimentado, aunque con una interrelación transdisciplinaria, la


ingeniería del hardware (término poco consolidado) agrupa un conjunto de áreas del
conocimiento como electrónica, circuitos (analógicos y digitales), arquitecturas de
procesamiento, etc. mientras que la ingeniería del software ofrece métodos y técnicas
para desarrollar y mantener software de calidad. 

 
Figura 2. Proceso de co-diseño típico. 

Sin embargo, desde el paradigma de la complejidad la ingeniería de sistemas debería


superar su capacidad de abstracción y constituirse como una disciplina que ofrezca,
como cualquier otra ingeniería, soluciones tangibles. Este enfoque moderno de diseño
de sistemas se relaciona directamente con los sistemas integrados y presenta el
diseño HW/SW de manera unificada, por lo que se utiliza el término co-diseño. El libro
Embedded System Design: A Unified Hardware/Software Introduction, de Frank Vahid
y Tony D. Givargis, por ejemplo, introduce el diseño y uso de procesadores de
propósito-específico (“hardware”), coprocesadores o aceleradores; de procesadores
de propósito general (“software”); de procesadores de conjunto de instrucciones
específicos a aplicación (ASIP, Application-Specific Instruction-Set Processor) y
diserta acerca de modelos de computación avanzada, sistemas de control, tecnologías
de dispositivos electrónicos y herramientas de diseño modernas. Hardware y Software,
simplemente, ya no pueden ser considerados independientemente sino de manera
híbrida y unificada. La ingeniería de sistemas, como paradigma de la computación
híbrida ni siquiera se estudia como tal en las universidades salvo contadas
excepciones (como en el Grado en Arte Electrónico y Digital de la UEM,
http://www.uem.es/titulacion/grado-en-arte-electronico-y-digital). 

La tecnología de los semiconductores facilita la integración de millones de puertas


lógicas (gates) en un solo dispositivo (chip) y ha dado lugar a la integración de
sistemas en un dispositivo (SoC, Systems on Chip). Entre muchas otras, los SoCs son
los reyes híbridos del dominio multimedia, los sistemas de transporte inteligentes y en
general en cualquier aplicación que procese, en paralelo, cantidades enormes de
datos. El rendimiento de estos sistemas es eficaz sólo en determinados casos
específicos con todo el procesamiento por software, incluso sobre un procesador de
alto-rendimiento, o sólo por hardware. Es mucho más deseable una combinación
óptima HW/SW y un sistema, también óptimo, de repartimiento (partitioning).  

 
Figura 3. Procesadores y solución del problema. a. problema, funcionalidad deseada, b.
procesador de propósito general, c. procesador específico a la aplicación, d. procesador de
propósito específico. Un desplazamiento hacia la izquierda en la línea inferior aumenta en
flexibilidad, coste (a pequeña escala), tiempo, etc. mientras que hacia la derecha en eficiencia,
rendimiento, tamaño y coste (a gran escala), etc. 

El diseño de sistemas requiere los siguientes pasos:

Captura de Especificación. Descomposición funcional en piezas para crear un


modelo conceptual del sistema. El resultado es una especificación funcional carente
de cualquier detalle de implementación. 

Exploración. Exploración de alternativas de diseño y estimación de su calidad hasta


encontrar la más adecuada. 

Especificación. Definición de la especificación en una nueva descripción que refleje


las decisiones hechas durante la exploración. 

Software y Hardware. Implementación de cada uno de los componentes utilizando


técnicas de diseño software y hardware o híbridas. 

Diseño físico. Generación de los datos de fabricación para cada componente. 


Esta metodología de modelado jerárquico permite alta productividad, preservación de
la consistencia a través de todos los niveles y por lo tanto la eliminación de iteraciones
innecesarias lo que se traduce a procesos más eficientes y rápidos.

Para describir la funcionalidad de un sistema es necesario describir las relaciones


entre las diferentes piezas funcionales del modelo conceptual. Algunos de los modelos
que describen esta funcionalidad de los sistemas son:

Gráfica de flujo de datos. Una gráfica de flujo de datos descompone la funcionalidad


en actividades y los flujos de datos entre estas actividades. 

Máquina de estado finito (FSM, Finite-State Machine). Este modelo representa al


sistema como un conjunto de estados y un conjunto de arcos que indican transición
del sistema de un estado a otro como resultado de determinado evento. 

Procesos secuencialmente comunicados (CSP, Communicating Sequencel


Processes). Este modelo descompone el sistema en un conjunto de procesos
concurrentes que corren instrucciones de programa secuencialmente. 

Máquina de estado programa (PSM, Program-State Machine). Este modelo combina


FSM y CSP; permite que cada estado de un FSM concurrente contenga acciones
descritas por instrucciones de programa. 

 
Figura 4. Fuente de sumador con signo en VHDL. El VHDL se diseñó para documentar el
comportamiento de los circuitos integrados de aplicaciones específicas (ASIC, Application
Specific IC) del Departamento de Defensa del gobierno americano. 
Cada modelo tiene sus ventajas y desventajas. Ninguno es perfecto para todos los
tipos de sistemas así que se debe seleccionar aquel que mejor se ajuste a las
características específicas del sistema.

Programación, Algoritmos, Lenguajes 

Es obvio que, independientemente de si se trata de hardware o software, es posible


describir los procesos, datos y flujos que intervienen mediante algoritmos. Por lo
tanto, es natural pensar que estos algoritmos se implementen en determinado
lenguaje. Si observa detenidamente el ejemplo de la figura 4, cuesta pensar que no
representa un fragmento de código programado en Pascal o algún tipo de
pseudocódigo y que, simplemente, implementa funcionalidades hardware.  

Existen diferentes tipos de hardware, configware, que permiten esta “programación”.


Los ASICs (ya sean de arreglo de puertas o celdas estándar) permiten interconectar
diferentes módulos pre-integrados (por ejemplo puertas AND o combinaciones AND-
OR-INVERTER) para conseguir determinada funcionalidad. Los dispositivos de lógica
programable (PLD, Programmable Logic Device) contienen determinadas capas de
circuitos programables que son interconectados (quemando fusibles o mediante
conmutadores programables) mediante software. La FPGA (Field Programmable Gate
Array) es un tipo de PLD complejo mientras que la PLA (Programmable Logic Array),
es un tipo de PLD simple. 

Los lenguajes de descripción del hardware, como VHDL o Verilog, difieren de los
lenguajes de programación software en detalles como las formas de describir la
propagación del tiempo y las dependencias de señal (sensibilidad). Existen dos
operadores de asignación, uno de bloqueo (=) y otro de no-bloqueo (<=); este último
permite describir la actualización de máquinas de estado sin necesidad de declarar y
usar variables adicionales. Desde su introducción, en 1984, Verilog representó un
aumento tremendo en la productividad. Los diseñadores de circuitos utilizaban un
programa de captura esquemático gráfico y los programas software escritos
especialmente para documentar y simular los circuitos electrónicos.  

Los diseñadores hardware desean lenguajes de especificación con características


similares a los lenguajes de programación ampliamente usados en el desarrollo de
sistemas. Verilog tiene un sintaxis similar a la de C: es sensible a mayúsculas-
minúsculas, tiene un preprocesador básico (aunque menos sofisticado que el de ANSI
C/C++), etiquetas de control de flujo equivalentes (if/else, for, while, case, etc.), y
operadores de precedencia compatibles. Las diferencias sintácticas incluyen la
declaración de variables (Verilog requiere bit-widths sobre tipos net/reg por ejemplo),
bloques procedimentales o de demarcación (begin/end en lugar de las llaves {}), y
otras pequeñas diferencias.

Otro lenguaje de descripción similar a VHDL y Verilog es el lenguaje de descripción de


sistemas SystemC (http://es.wikipedia.org/wiki/SystemC), realmente útil para modelar
sistemas a nivel de comportamiento. “SystemC es un conjunto de librerías y macros
implementadas en C++ que hacen posible una simulación de procesos concurrentes
con la sintaxis del lenguaje C++ ordinario. Así los objetos descritos pueden
comunicarse durante una simulación de tiempo real usando señales de cualquier tipo
ofrecido por C++, además algunas otras ofrecidas por las librerías de SystemC y
también otras definidas por el usuario”.  

La metodología de diseño comienza con un modelo de alto nivel escrito en C++ y


aplica un proceso iterativo que consiste en transformar el código para usar sólo los
elementos que tengan su equivalente en un lenguaje de descripción de hardware.

#include "systemc.h"

SC_MODULE(adder) // módulo, declaración de la clase


{
sc_in<int> a, b; // puertos
sc_out<int> sum;

void do_add() // proceso


{
sum = a + b;
}

SC_CTOR(adder) // constructor
{
SC_METHOD(do_add); // registro do_add al kernel
sensitive << a << b; // lista de sensibilidad de do_add 
}
};
Listado 1. Fuente de sumador en SystemC. 

La representación unificada de un sistema híbrido debe describir su funcionalidad


independientemente de su implementación hardware o software lo que permite la
repartición HW/SW según un compromiso óptimo, provee un entorno de simulación y
facilita una fertilización cruzada entre los dominios HW/SW. 

Partición 

La partición es el proceso que decide, para cada subsistema, cómo es más ventajoso
implementar la funcionalidad requerida: por hardware o por software. Este es un
problema de optimización multi-variable que debe satisfacer las prestaciones exigidas
dentro de determinados requerimientos del sistema: tamaño, peso, potencia, coste,
etc. que, en el contexto del co-diseño, se denomina frecuentemente partición
funcional. 

Existen dos enfoques básicos de división. O bien comenzar con todas las operaciones
en el software y mover algunas a hardware (por ejemplo, cuando la velocidad es
fundamental) o empezar con todas las operaciones en hardware y mover algunas a
software. Un programa de división funcional identifica los cuellos de botella de
cómputo y migra las funciones correspondientes a un hardware específico de la
aplicación. Por otra parte la migración de componentes hardware a rutinas software
pasa por la identificación de las tareas no críticas susceptibles de migrar. Esto conlleva
una reducción de tamaño y costes significativos sin reducir el rendimiento
(especificado en términos de latencia y restricciones en la velocidad de los datos).

La compartimentación funcional permite que el sistema se divida en componentes


hardware y software; es análogo a las particiones estructurales en que la estructura de
un sistema se refina en un menor nivel de componentes hardware. Sin embargo, en
las particiones estructurales, la funcionalidad no se puede mover desde el hardware
hacia el software. El particionado de objetos funcionales entre los componentes del
sistema se realiza: mediante una descripción de la funcionalidad del sistema (descrita
como una colección de objetos funcionales indivisibles) y a continuación cada
componente de la funcionalidad del sistema se implementa en hardware o software. 

El proceso de partición es guiado por la métrica y el tipo de métrica a utilizar depende


en gran medida del nivel de descripción del sistema. La métrica se define para
determinar el coste relativo de una partición frente a otras particiones potenciales.
Obviamente, algunos indicadores, como el tiempo de ejecución de una determinada
tarea en un procesador específico, son imposibles de medir con precisión hasta
alcanzar la aplicación definitiva. Algunas de estas técnicas son: de estimación
determinística (sólo útil cuando se parte de un modelo completamente especificado),
de estimación estadística (en modelos incompletos; se basa en el análisis de sistemas
similares y ciertos parámetros de diseño) o de perfiles (examina flujos de datos y
control en una arquitectura para determinar qué partes, más caras
computacionalmente, son mejores implementadas por hardware). El proceso de
seleccionar los componentes se denomina asignación (allocation). 

Los sistemas híbridos no sólo deben tener en cuenta qué implementar por hardware o
por software sino también cómo comunicar ambos dominios y es que esta
comunicación introduce determinada sobrecarga que debe ser considerada.  

Cuando es posible una implementación de todos los componentes del sistema sólo
con procesadores de propósitos generales (ya sean microcontroladores,
microprocesadores o procesadores digital de señal) el diseño de un sistema complejo
se convierte en un problema de integración (este concepto excluye la elaboración y
uso de procesadores específicos). Este es, sin embargo, un escenario frecuente no
menos complejo donde se puede considerar los componentes como piezas de un
rompecabezas que deben encajar perfectamente (en términos de métrica) para
conseguir el objetivo deseado. Este “encaje” pasa por unas interfaces de
comunicación bien definidas y por el uso de terminales de interacción universales o
estándares. 

Conclusiones 

El co-diseño HW/SW es muy útil en la búsqueda de soluciones a medida, prototipado


rápido, simulación, sistemas con determinados procesos críticos (ya sea en velocidad,
memoria, etc.), sistemas adaptables o reconfigurables, concurrentes (desarrollo
simultáneo HW/SW), integrables (la interacción del desarrollo HW/SW produce
diseños que satisfacen los criterios de rendimiento y especificaciones funcionales), etc.
y permite el desarrollo de sistemas complejos que sacan lo mejor de cada tecnología.

Imagine el siguiente escenario: necesita desarrollar un sistema muy complejo que


debe interactuar con el mundo real. Para ello primeramente crea un modelo
conceptual del sistema: una especificación funcional ajena e independiente de
cualquier detalle de implementación y, por lo tanto, de la tecnología. Este diseño le
permitirá implementar el sistema con la tecnología disponible en el momento que lo
requiera. Ahora suponga que es capaz de describir todos los algoritmos, procesos,
datos e interrelaciones de su modelo en una suerte de meta-lenguaje de programación
(pseudocódigo o de muy alto nivel como muestra la figura 5), ajeno igualmente a
cualquier implementación.

 
Figura 5. Co-compilador Software-Configware. Configware significa programación
reconfigurable. Configware versus software significa programación estructural versus
programación procedimental. Configware considera ASICs, PLDs, etc. 

Por último suponga que combinando estrategias automáticas y manuales (en la figura
5, por ejemplo, sólo se considera la división HW/SW automática) pueda decir qué y
cómo hacer por hardware o por software y cómo comunicarlas entre sí. Finalmente
obtendrá un sistema híbrido óptimo, susceptible de futuras implementaciones, definido
en términos no perecederos, en definitiva: un sistema eficaz resistente a la
obsolescencia tecnológica capaz de absorber la tecnología del futuro.

La computación híbrida, hoy día, parece aceptada como evidente pero aún queda
mucho por hacer y no existe, ni existirá, solución ideal ni genérica. La resistencia llega
de todas partes. El uso de meta-lenguajes no es casi nunca bien recibido por la
comunidad de programadores que lo considera un intrusismo automatizado y prefieren
seguir escribiendo sus líneas de código en el lenguaje que les apetezca. Para los
desarrolladores de hardware este enfoque es una quimera basada en patrones
susceptibles de mejoras. Pero para la industria simplemente significa ganar o perder
dinero. Aquí la hibridación es lo de menos y lo de más la imposición de tecnologías y
estrategias propietarias. Jobs reclama “baja potencia, pantallas táctiles y estándares
abiertos para la web” para el entorno de las aplicaciones hoy día mientras Apple, la
compañía que dirige, supera a Microsoft en el mercado mundial y es el cuarto en
ventas de ordenadores en Estados Unidos; es difícil desvincular ambos hechos y su
capacidad de expansión a otros mercados como el de los móviles y la reproducción
multimedia.

Linux cuenta con el procesador Leon 2 (una implementación en VHDL de un


procesador de 32 bits compatible con el juego de instrucciones Sparc V8, desarrollado
para la Agencia Espacial Europea y mantenido en la actualidad por Gaisler Research;
http://www.gaisler.com/cms/), de código abierto, acompañado de las herramientas
necesarias, que también son de código abierto: compiladores C, versión de Newlib, y
versiones de eCos y Linux. El procesador Leon no sólo es de código abierto, sino que
además no está ligado a ninguna tecnología de FPGA concreta. PeaCE, por otra
parte, permite realizar un particionado HW/SW automático. 
La computación híbrida no es tan nueva como parece y ya cuenta con algunas
décadas. Sin embargo el co-diseño no lo es tanto y cada vez ejerce mayor atracción.
¿Habrá que esperar por una comunidad HW/SW libre para impulsarlo? El tiempo dirá.
Mientras… el mundo sigue siendo analógico y complejo y el hombre ridiculizando,
rechazando violentamente y aceptando como evidente toda verdad.

Enlaces de interés 

VHDL: http://en.wikipedia.org/wiki/VHDL  
Verilog: http://www.verilog.com/  
SystemC: http://www.systemc.org/home/  

Sobre el autor 

Lino García Morales

Graduado en Ingeniería en Control Automático, Máster en Sistemas y Redes de


Comunicaciones y Doctor por la Universidad Politécnica de Madrid. Ha sido profesor
en el Instituto Superior de Arte de la Habana, la Universidad Pontificia “Comillas” y la
Universidad Meléndez Pelayo.

Actualmente es profesor titular de la Facultad de Artes y Comunicación y de la Escuela


Superior Politécnica de la Universidad Europea de Madrid y Coordinador del Grado en
Arte Electrónico y Digital. Artista y científico, lidera un grupo de investigación
transdisciplinar en la intersección Arte, Ciencia, Tecnología y Sociedad. Ha disfrutado
de Becas por la Agencia Española de Cooperación Internacional, FUNDESCO, el
Consejo Superior de Investigaciones Científicas (CSIC) y la Universidad Politécnica de
Madrid.

También podría gustarte