
Algún día, tal vez, podremos construir una máquina que será capaz de realizar las funciones de una mente humana, una máquina pensante....
.................
Aunque la construcción de una inteligencia artificial todavía no esté a nuestro alcance, las maneras en las cuales nuestras arquitecturas computacionales son deficientes [para ese propósito] están ya a la vista....
.................
Así pues, ¿qué es lo que anda mal con la computadora? Parte del problema es que no entendemos completamente los algoritmos del pensamiento. Pero parte del problema es velocidad. Podría pensarse que la razón por la que la computadora es lenta es que sus componentes electrónicos son mucho más lentos que los componentes biológicos del cerebro, pero no es así. Un transistor puede cambiar de estado en unos pocos nanosegundos, más o menos un millón de veces más rápido que el tiempo de cambio de una neurona, que se cuenta en milisegundos. Un argumento más plausible es que el cerebro tiene más neuronas que la computadora transistores, pero incluso este falla para explicar la disparidad de velocidad. Hasta donde podemos decir, el cerebro humano tiene como 1010 neuronas, cada una capaz de cambiar de estado no más de 1000 veces por segundo. Así, el cerebro sería capaz de aproximadamente 1013 eventos de cambio por segundo. Una computadora digital moderna, en contraste, puede tener hasta 109 transistores, cada uno capaz de cambiar de estado tanto como 109 veces por segundo. Así, el total de velocidad de cambio sería tan alta como 1018 eventos por segundo, o sea 10.000 veces mayor que el cerebro. Así pues, la potencia computacional bruta de la computadora sería mucho mayor que la de un ser humano. Sin embargo, sabemos que en la realidad es justamente lo contrario. ¿En qué nos hemos equivocado?
Una razón para que las computadoras sean lentas es que su hardware es usado de manera extremadamente ineficiente.... La razón de la ineficiencia es en parte técnica y en parte histórica....
Una computadora grande moderna contiene como un metro cuadrado de silicio. Este metro cuadrado contiene aproximadamente mil millones de transistores que constituyen el procesador y la memoria de la computadora. El punto interesante aquí es que tanto el procesador como la memoria están hechos del mismo material. Esto no fue así siempre. Cuando von Neumann y sus colegas diseñaban las primeras computadoras, sus procesadores estaban hechos de componentes de cambio de estado relativamente rápidos y caros, tales como tubos al vacío, mientras que las memorias estaban hechas de componentes relativamente lentos y baratos, como líneas de retraso o tubos de almacenamiento. El resultado fue un diseño de dos partes que mantenía los caros tubos al vacío tan activos como fuera posible. Llamamos a este diseño de dos partes, con memoria por un lado y proceso por el otro, la arquitectura de von Neumann y es la manera en que están construidas la mayor parte de las computadoras de hoy en día. Este diseño ha sido tan exitoso que la mayor parte de los diseñadores de computadoras lo han mantenido a pesar de que la razón tecnológica para la separación de memoria y procesador no se justifica actualmente.
En una computadora von Neumann grande, casi ninguno de sus mil millones de transistores realiza ningún proceso útil en un instante dado. Casi todos los transistores están en la sección de memoria de la máquina y solo unas pocas de las localidades de memoria están activas en un determinado momento. La arquitectura de dos partes mantiene el silicio que está dedicado al proceso maravillosamente ocupado, pero este es sólo un 2 o 3 por ciento del área de silicio. El otro 97 por ciento permanece ocioso. A un millón de dólares por metro cuadrado para el hardware de silicio, esto resulta un recurso desperdiciado. Si fuéramos a tomar otra medida de costos en la computadora, kilómetros de cable, los resultados serían muy parecidos: la mayor parte del hardware consiste en la memoria, de modo que la mayor parte del hardware no hace nada la mayor parte del tiempo.
.................
Esto es lo que se llama el cuello de botella de von Neumann. Cuanto
más grandes las máquinas que construimos, peor se pone.
La solución obvia es librarse de la arquitectura von Neumann y construir una máquina computadora más homogénea, en la cual la memoria y el proceso estén combinados. No es difícil construir una máquina con cientos de miles o incluso millones de celdas procesadoras que tengan una fuerza bruta computacional varios órdenes de magnitud mayores que las de las más rápidas máquinas convencionales. El problema yace en cómo acoplar la fuerza bruta con las aplicaciones de interés, cómo programar el hardware para el trabajo. ¿Cómo descomponemos nuestra aplicación en cientos de miles de partes que puedan ser ejecutadas concurrentemente? ¿Cómo coordinamos las actividades de un millón de elementos procesadores para realizar una sola tarea? La arquitectura de la máquina de conexiones fue diseñada como una respuesta a estas preguntas.
.................
[Dicha arquitectura surge directamente de los siguientes dos requisitos:]
Que haya suficientes elementos de proceso para ser distribuidos según se necesiten, en proporción al tamaño del problema.
Que los elementos de proceso puedan ser conectados por software.
La arquitectura de la máquina de conexiones ... provee un número grande de pequeñas celdas procesador/memoria conectadas por una red de comunicaciones. Cada celda es suficientemente pequeña para que sea incapaz de ninguna computación significativa por sí misma. Al contrario, celdas múltiples están conectadas entre sí en patrones dependientes de los datos, llamadas estructuras de datos activas, que tanto representan como procesan los datos. Las actividades de estas estructuras de datos activas son dirigidas desde afuera de la máquina de conexiones por una computadora anfitriona convencional. Esta computadora anfitriona almacena las estructuras de datos en la máquina de conexiones de parecida manera a como una máquina convencional almacena en la memoria. Pero a diferencia de la memoria convencional, la máquina de conexiones no tiene el cuello de botella procesador/memoria. Las celdas de memoria mismas hacen el proceso. Más precisamente, la computación tiene lugar por medio de la interacción coordinada de las celdas de la estructura de datos. Siendo así que miles o incluso millones de celdas de proceso trabajan simultáneamente en el problema, la computación procede mucho más rápido que lo que sería posible en una máquina convencional.
Una máquina de conexiones ... difiere de una memoria convencional en tres respectos. Primero, asociada con cada celda de almacenamiento está una celda de proceso que puede realizar computaciones locales basadas en la información almacenada en la celda. Segundo, existe una red general de intercomunicaciones que puede conectar todas las celdas siguiendo un patrón arbitrario. Tercero, existe un canal de entrada/salida con un ancho de banda de alta capacidad que transfiere datos entre la máquina de conexiones y los aparatos periféricos a mucho mayor velocidad que lo que podría hacerse por medio de la anfitriona.
Se forma una conexión entre dos celdas de memoria procesadora mediante el almacenamiento de un puntero en la memoria. Estas conexiones pueden ser arregladas por la anfitriona, cargadas por medio del canal de entrada/salida o determinadas dinámicamente por la máquina de conexiones misma.
.................
El control de las celdas individuales procesadores/memorias es orquestado
por la computadora anfitriona. Por ejemplo, la anfitriona puede pedir a
cada celda que está en un cierto estado que sume dos a su locación
de memoria localmente y que pase el resultado a otra celda conectada por
medio de la red de comunicaciones. Así, una sola instrucción
de la anfitriona puede resultar en decenas de miles de sumas y en una permutación
de datos que depende del patrón de conexiones. Cada celda procesador/memoria
es tan pequeña que es esencialmente incapaz de computar o incluso
almacenar ninguna computación significativa propia. En vez de eso,
la computación tiene lugar por medio de una interacción orquestada
de miles de celdas en la red de comunicaciones.
En el pasado, los científicos de la computación han encontrado conveniente y productivo adoptar un modelo del mundo computacional NOTA 2 que es diferente de nuestros modelos del universo físico. Eso está cambiando. Conforme construimos computadoras más grandes a partir de componentes cada vez más pequeños, nuestros modelos computacionales se ven forzados a variar. Hay razón para esperar que nuestros nuevos modelos para sistemas específicos se hagan parecidos a los modelos de la física.
Un diseñador de computadoras está constreñido por problemas mundanos que no tienen contrapartes en los modelos teóricos de la computación: el tamaño de los conectores, el costo y disponibilidad de los componentes, la disposición espacial mecánica del sistema. Recientemente estos factores han dictado un cambio dramático en la manera en que diseñamos computadoras. Las cosas no parecen las mismas. Los cables cuestan más que los transistores, el software cuesta más que la memoria y el aire acondicionado ocupa más lugar que la computadora. Nuestro modelos actuales de la computación son inadecuados para diseñar e incluso describir las nuevas arquitecturas. Un modelo abstracto es poderoso solamente cuando nos permite poner atención a ciertos aspectos de una situación mientras pasamos por alto otros. Nuestros actuales modelos parecen enfatizar los detalles incorrectos.
Las áreas en las cuales los modelos computacionales son débiles son a menudo las áreas en las cuales difieren de los modelos físicos. En física, por ejemplo, muchas cantidades fundamentales se conservan, mientras que en nuestros viejos modelos computacionales los datos pueden ser creados o destruidos sin costo alguno....
En el universo físico el efecto que un acontecimiento tiene sobre otro tiende a decrecer con la distancia en el tiempo o espacio entre ellos. Esto nos permite estudiar los movimientos de las lunas de Saturno sin tomar en cuenta el movimiento de Mercurio.... Este localismo de la acción se muestra en la velocidad finita de la luz, en la ley cuadrado-inversa del campo [etc.].... [En cambio,] en computación, o por lo menos en nuestros viejos modelos de ella, un acontecimiento arbitrariamente pequeño puede a menudo causar efectos arbitrariamente grandes. Un programa pequeñísimo puede borrar toda la memoria. Una sola instrucción puede detener la máquina. En computación tradicional no existe el análogo de la distancia. Una dirección de memoria es tan influenciable como cualquier otra.
Algo fundamental para nuestra vieja concepción era la conexión idealizada, el cable. Un cable, como nos lo imaginábamos, era una cosa maravillosa. Uno ponía información en un extremo y simultáneamente aparecía en un número de lugares útiles a lo largo de la máquina. Los cables eran baratos, no ocupaban casi ningún espacio y no disipaban calor.
Más recientemente nos hemos venido desenamorando un poco de los cables. Conforme los componentes de cambio de estado se han venido haciendo más pequeños y menos caros, hemos empezado a notar que la mayor parte de nuestros costos son cables, la mayor parte del espacio es colmada con cables y la mayor parte del tiempo se gasta en trasmitir de un extremo al otro de los cables. Estamos descubriendo que antes parecía como si pudiéramos conectar un cable a tantos lugares como quisiéramos, sencillamente porque en realidad no queríamos conectarlo a demasiados lugares. Estamos siendo forzados a notar que no podemos medir una señal sin perturbarla; por ejemplo, debemos controlar un cable con potencia proporcional al número de entradas que consultan su estado. Por supuesto que sabíamos esto antes, pero el hecho es más significativo cuando el número en cuestión es diez millones en vez de diez. También, los cables reales ocupan espacio. Siendo así que construimos en un espacio meramente tridimensional, es impráctico conectar componentes de manera arbitraria. Cuando conectábamos unos pocos cientos de tubos al vacío esto no era problema, pero hoy necesitamos conectar con cables cientos de millones de componentes y tenemos que hacerlo en un espacio menor. La mayor parte de los cables deben ser cortos. No hay campo para nada más....
Nuestros modelos de la computación no nos ofrecen mucha ayuda
para resolver estos problemas. Hasta hace poco, abstraían el cable
convirtiéndolo mentalmente en una conexión idealizada sin
costo ni volumen. Nuestros viejos modelos no imponían constreñimientos
locales de conexión, a pesar de que el mundo real sí los
impone. Este es un ejemplo primario de cómo y dónde nuestros
viejos modelos dejan de funcionar. En la computación clásica
el cable ni siquiera es considerado. En la ingeniería actual puede
ser la cosa más importante. Algo está mal en la teoría.
Un mensaje [en la máquina de conexiones] se envía a la celda apropiada especificando como dirección desplazamientos relativos en el cuadriculado, del destinatario con respecto al remitente (por ejemplo, dos hacia arriba y cinco hacia el otro lado) NOTA 3. Esto no especifica la ruta del mensaje sino sólo el destino. El remitente envía un mensaje pasándoselo a un vecino y el vecino decide con base en la dirección la siguiente manera de encaminarlo. Si el desplazamiento y es positivo, irá para arriba. Si el desplazamiento x es negativo, irá para la izquierda. El vecino modifica la dirección incrementándola o decrementándola apropiadamente, de modo que cuando el mensaje alcanza la dirección deseada los dos desplazamientos serán cero. Por ejemplo, un comunicador que recibe un mensaje dirigido a "dos para arriba y cinco para un lado" puede cambiarlo a "uno para arriba y cinco para un lado" y enviar el mensaje al comunicador inmediatamente encima.
Definimos la distancia entre dos puntos como el tiempo promedio de comunicación entre ellos. En un espacio celular vacío esto es lo mismo que la métrica del taxista. La presencia de un objeto atravesado distorsiona la métrica porque los mensajes tienen que fluir alrededor de él. La curvatura de las trayectorias óptimas de los mensajes (geodésicos) aumenta con la densidad de los objetos. Cuanto más lejos estén los objetos, menor es el efecto, de modo que hay una distorsión local en la métrica proporcional a la densidad de objetos.
Esta distorsión no es la misma que la gravedad física y no estoy sugiriendo que las causas de las dos sean similares, pero es interesante encontrar en computación un efecto que sea tan similar a uno de la física.
Aquí viene otro. Imaginamos que dos celdas están colocadas una a la par de la otra en el enrejado. Imaginamos que la celda izquierda comunica sobre todo con celdas hacia la derecha y que la celda de la derecha comunica con celdas a su izquierda. Sería ventajoso (en el sentido de minimizar el tiempo de comunicación) si las celdas pudieran cambiar puestos, acercándose las dos a las celdas con las cuales comunican. El hardware de las celdas no puede moverse, pero las dos celdas pueden intercambiar sus estados internos. El efecto es el mismo. El objeto computacional que estaba en la celda derecha se pasa a la celda izquierda y viceversa (las partes interesadas deben ser informadas del cambio, pero esto resulta muy fácil de hacer en la máquina de conexiones).
Por este mecanismo, con algunos refinamientos, el hardware de la máquina causa la migración de cada celda en la dirección en que envía la mayor parte de sus mensajes. Los grupos de celdas intercomunicantes tienden a formar racimos. En un sistema tal las sendas de comunicación actúan como fuerzas de atracción que ligan a las celdas entre sí. En la escala mayor los racimos son como objetos. La comunicación entre dos racimos tiende a acercarlos. Este movimiento es un efecto cumulativo del comportamiento local de las celdas individuales pero puede ser analizado como una fuerza macro entre dos objetos. No se necesita poner atención a las interacciones detalladas de las celdas individuales.
Podemos dar reglas locales específicas que causen un comportamiento
de las fuerzas macro conforme con la ecuación F=Ma,
NOTA
4 pero eso sería perder la idea esencial. Lo esencial no es
que esto sea un buen modelo de la física (no lo es) sino que las
leyes que describen su comportamiento son similares en forma a las leyes
físicas. Recuérdese que el propósito de la máquina
no tiene nada que ver con la física. Ha sido diseñada como
lo ha sido por buenas y fuertes razones de ingeniería: el costo
de los conectores, la necesidad de disipar el calor, el volumen de los
cables. Cualquier similitud con la física, viva o muerta, es puramente
no intencional, pero no accidental.
El progreso en física viene de desarmar las cosas; en computación, de armarlas. Podríamos haber tenido una ciencia analítica de la computación pero, tal como sucedieron las cosas, aprendimos más [sobre la informática] armando termostatos y computadoras que disecando cerebros de monos y ojos de sapos. La ciencia de la computación como tal es sintética.
Los modelos respectivos de la física y de la computación reflejan la diferencia de enfoque. Por ejemplo, en la física clásica la mayor parte de las cantidades son continuas. Conforme los físicos se adentraron más hondo en niveles más y más bajos de la realidad, las cosas empezaron a aparecer discretas. El físico de ayer medía. El físico de hoy cuenta. En computación las cosas son inversas. Comenzamos en la otra dirección y, porque comenzamos solo recientemente, no hemos avanzado mucho. Esta es una de las razones por las cuales la ciencia de la computación se presenta como "no buena": no hemos pasado de contar. Saber las reglas más bajas es bueno, pero no es suficiente de ningún modo. La cromodinámica cuántica no es de mucha ayuda en el diseño de puentes. La ciencia de la computación no es mucho más útil para el diseño de computadoras.
No me descorazono. Mientras la física ve hacia abajo, hacia niveles más y más bajos, la ciencia de la computación ve hacia arriba. Lo hace porque los sistemas se están haciendo suficientemente grandes para exhibir la clase de comportamiento simple y continuo que estamos acostumbrados a ver en la física de todos los días, suficientemente grandes como para que su comportamiento no pueda ser ya dominado por ningún componente único. Comienza a haber un bosque para ver entre los árboles.
Existen dos clases de cosas que podemos llamar modelos computacionales y quiero aclarar de cuáles estoy hablando. Podría entender por modelo computacional un modelo de todos los mundos computacionales posibles. Ha habido unos pocos pasos importantes hacia tal teoría metacomputacional (teorías de los servomecanismos, la computabilidad Turing NOTA 5, teoría de la información), pero por el momento un modelo completo y coherente yace más allá de lo que podemos ver. El segundo sentido de modelo computacional es un modelo de un sistema computacional particular. La física es un modelo tal. Las leyes físicas no necesitan describir lo que pasaría en cualquier universo posible, solo en este. En computación la distinción es más importante porque diseñamos nuestros propios mundos. La máquina de conexiones es un ejemplo de tal mundo.
No vemos ninguna manera de predecir el desarrollo de una teoría generalizada de la computación, pero sí vemos razones para esperar buenos, limpios y útiles modelos de sistemas computacionales específicos –modelos que se parecerán a la física–. La primera razón es que la ley física misma parece ser un modelo tal. Si el universo es una máquina de computar, entonces sabemos que por lo menos alguna máquina de computar tiene leyes elegantes....
.................
NOTA 1 En honor del matemático húngaro John von Neumann, uno de los inventores de la computadora digital secuencial cuya arquitectura discute el autor aquí. Nota del editor.
NOTA 2 Las lecturas del capítulo segundo de esta colección contienen un buen sumario de ese modelo computacional tradicional. Nota del editor.
NOTA 3 Piénsese en el plano de una ciudad bien cuadriculada, como San José, Costa Rica, o Nueva York, donde se le puede indicar a un taxista: "Vaya a un lugar que queda de aquí dos cuadras al norte y cinco al este". Nota del editor.
NOTA 4 Una ley muy conocida de la física clásica. Nota del editor.
NOTA 5 Ver segundo capítulo de esta colección. Nota del editor.