Puedes explicar cómo funcionan las computadoras desde lo más básico?
Para entender las computadoras, primero debes aceptar una realidad física. No hay magia dentro de una computadora. Solo señales eléctricas. Más precisamente, solo alto voltaje y bajo voltaje.
El material base para los chips que usamos hoy es el silicio. El silicio es un semiconductor. Los semiconductores tienen una propiedad física: al doparlos con diferentes elementos y controlar el voltaje en el electrodo, se puede controlar si conducen electricidad o no. Esta diminuta estructura que se puede activar y desactivar con electricidad se llama transistor.
Las CPU modernas contienen decenas de miles de millones de transistores. El proceso actual de 3 nanómetros de TSMC significa que estos transistores se fabrican tan increíblemente pequeños que caben decenas de miles de millones en un trozo de silicio del tamaño de una uña.
Solo necesitas recordar una función central del transistor. Si aplicas un alto voltaje a su terminal de control, conduce. Si aplicas un bajo voltaje, se apaga. Esta es la realidad física fundamental. Definimos el alto voltaje como 1 lógico y el bajo voltaje como 0 lógico. Toda la informática se basa en estos dos estados.
Con los transistores, podemos combinarlos en puertas lógicas.
Supongamos que conectamos dos transistores en serie. La corriente solo puede fluir de un extremo al otro – dando como salida un 1 – cuando ambos terminales de control reciben un alto voltaje, es decir, ambas entradas son 1. Si alguna es 0, la corriente se corta y la salida es 0. Este circuito físico se llama puerta AND.
Por la misma lógica, si dos transistores se conectan en paralelo, la corriente fluye – dando como salida un 1 – siempre que al menos una entrada sea 1. Solo cuando ambas son 0 la salida es 0. Esto es una puerta OR.
Usando un método de conexión ligeramente diferente, donde introducir 1 da salida 0 e introducir 0 da salida 1, creamos una puerta NOT.
Con las puertas AND, OR y NOT, el mundo físico entra oficialmente en el mundo matemático. Recomiendo encarecidamente un libro de texto clásico aquí llamado Code, de Charles Petzold. Este libro no tiene relleno – comienza desde el telégrafo y explica cómo cablear puertas lógicas. Es perfecto para construir esa primera capa de intuición física. Deberías leerlo después de este artículo – te volará la cabeza.
Ahora que tenemos puertas lógicas, como hacemos que una computadora sume?
En binario, 1 más 1 es igual a 10. Eso significa que el bit actual se convierte en 0 y llevamos 1 a la siguiente posición. Esto es en realidad dos operaciones lógicas. Primero, determinar el bit actual: si ambas entradas son 1, el bit actual es 0. Si una entrada es 1 y la otra es 0, el bit actual es 1. Esta lógica se puede implementar combinando las puertas básicas que discutimos – la llamamos puerta XOR. Segundo, determinar el acarreo: solo cuando ambas entradas son 1 llevamos, que es exactamente lo que hace la puerta AND.
Conecta una puerta XOR y una puerta AND juntas, y has implementado físicamente la suma de un solo dígito binario. Esto se llama semisumador. Conecta varios semisumadores en cascada, manejando la señal de acarreo, y obtienes un sumador completo. Si conectas 64 de estos sumadores completos, obtienes un circuito físico que puede sumar números binarios de 64 bits.
Cuando escribes la línea de código a = b + c, lo que sucede a nivel inferior es que las señales eléctricas que representan b y c entran simultáneamente en este circuito sumador hecho de decenas de miles de transistores. Después de un retardo físico extremadamente corto, el otro extremo del circuito produce voltajes altos y bajos estables que representan el resultado.
Eso es lo que se conoce como la Unidad Aritmético-Lógica. No es ningún componente misterioso – es solo una densa red de puertas lógicas semiconductoras, cableadas según reglas matemáticas diseñadas por humanos. Además de la suma, mediante diferentes configuraciones de cableado, también puede realizar restas, desplazamientos de bits e incluso multiplicaciones.
Pero poder solo sumar no sirve de nada. El resultado es solo un montón de señales eléctricas – en cuanto se corta la corriente o la entrada cambia, el resultado desaparece. Una computadora debe poder recordar datos. Esto nos lleva a la memoria y los registros.
Como se usan señales eléctricas para recordar un estado? Los ingenieros electrónicos inventaron un circuito extremadamente ingenioso llamado biestable. Es un circuito de puerta lógica con un bucle de retroalimentación. En pocas palabras, la señal de salida se realimenta a la entrada. Este diseño hace que incluso después de retirar la entrada original, el circuito pueda mantener su estado de alto o bajo voltaje actual mediante la retroalimentación interna.
Cuando le das a este biestable una señal de escritura específica, actualiza su estado interno y lo bloquea. A menos que le envíes otra señal de escritura, mantendrá ese 0 o 1 indefinidamente.
Coloca 64 biestables en fila y puedes almacenar un número binario de 64 bits. Dentro de la CPU, justo al lado de la ALU, estas unidades de almacenamiento ultrarrápidas hechas de biestables se llaman registros. Su ubicación física está justo al lado del circuito de cómputo, lo que significa que la señal eléctrica recorre la distancia más corta posible, por lo que son extremadamente rápidos. Por supuesto, también son extremadamente caros de fabricar, por lo que solo pueden ser muy pequeños.
Aquí tengo que recomendar enérgicamente un libro absolutamente legendario: Computer Systems: A Programmer’s Perspective, más conocido en el mundo de la informática como CSAPP. Es el libro de texto utilizado en la Universidad Carnegie Mellon. Lo que lo hace increíble es que tiende un puente desde el lenguaje ensamblador hasta la arquitectura de hardware y los sistemas operativos. Una vez que lo entiendes, sabrás por qué algún código corre rápido y otro lento – porque empezarás a escribir código con una mentalidad a nivel físico.
Si quieres ir más allá y tender un puente sistemático entre los sistemas operativos, la organización de computadoras, las redes y otros fundamentos esenciales, he preparado una colección que cubre estructuras de datos y algoritmos, organización de computadoras y más.
Más de un millón de descargas en toda la web – fundamentos informáticos que potenciarán tus habilidades.
Sigamos hacia afuera. Y si los registros no son suficientes? Necesitamos almacenamiento más grande. Aquí es donde entran los módulos de RAM conectados a tu placa base. El nombre técnico es Memoria Dinámica de Acceso Aleatorio, o DRAM.
El principio físico de la DRAM es completamente diferente al de los registros. En lugar de biestables, usa diminutos condensadores para almacenar carga eléctrica. Un condensador con carga es 1, sin carga es 0. Debido a que la estructura del condensador es extremadamente simple – necesita solo un transistor y un condensador para almacenar un bit de datos – la capacidad puede ser muy grande. Hoy en día, docenas o incluso cientos de gigabytes son comunes.
Pero los condensadores tienen un defecto fatal: pierden carga. Si se dejan solos, la carga que representa el 1 se pierde completamente en milisegundos, convirtiéndose en 0. Por lo tanto, la placa base debe tener un circuito de control dedicado que lea los datos de la memoria y los recargue a intervalos extremadamente cortos. Esto se llama refresco dinámico. Por eso cuando desconectas tu computadora, todo en la memoria desaparece al instante.
Ahora tenemos una ALU que puede hacer matemáticas, y registros y memoria que pueden almacenar datos. La pregunta central es: cómo empiezan a moverse estas cosas inertes? Quién les ordena hacer primero la suma, luego la multiplicación y finalmente almacenar el resultado?
Este es el trabajo de la unidad de control, y es el mecanismo central que hace que una computadora sea una máquina.
La placa base tiene un oscilador de cristal – un cristal de cuarzo que genera una señal de pulso de frecuencia fija mientras tenga alimentación. Por ejemplo, si tu CPU está clasificada a 4.0 GHz, significa que este cristal genera 4 mil millones de transiciones de alto a bajo voltaje cada segundo.
Este es el latido del corazón de la computadora. Todas las puertas lógicas y biestables dentro de la CPU operan en estricta sincronización con este latido.
Dentro de la CPU, hay un registro muy especial llamado contador de programa. Solo contiene una dirección de memoria.
Cuando suena el primer latido, la CPU hace lo primero: buscar la instrucción. Envía la dirección almacenada en el contador de programa a la memoria a través de las trazas metálicas de la placa base. La memoria devuelve la larga cadena de 0s y 1s almacenada en esa dirección.
Esa larga cadena de 0s y 1s es la instrucción. Una vez que la instrucción regresa a la CPU, entra en la unidad de control. La unidad de control también es solo un montón de puertas lógicas cableadas – su trabajo es decodificar. Por ejemplo, cuando ve que los primeros dígitos de los 0s y 1s entrantes son 1011, su estructura de cableado interno determina que estos altos y bajos voltajes activan precisamente el interruptor que lleva al circuito de suma en la ALU. Al mismo tiempo, el resto de la instrucción especifica qué registros contienen los dos datos a sumar.
Cuando suena el siguiente latido, comienza la fase de ejecución. El circuito de suma activado recibe los datos, las señales eléctricas atraviesan la red de puertas lógicas del sumador en un instante, y se produce el resultado.
En el siguiente latido, el resultado se escribe de vuelta en el registro especificado.
Finalmente, el contador de programa se incrementa automáticamente en uno, apuntando a la siguiente instrucción en memoria. Luego el ciclo se repite. Miles de millones de veces por segundo.
Esta es la verdad completa a nivel inferior de cómo funciona una computadora. No hay inteligencia avanzada alguna – solo un oscilador de cristal que late ciegamente, un contador de programa que incrementa direcciones mecánicamente, una unidad de control que cambia rutas de señal robóticamente según los 0s y 1s que lee, y una ALU que convierte pasivamente niveles de voltaje entrantes en nuevos niveles de voltaje.
El código Python o Java que escribes en tu trabajo diario es finalmente traducido por un software llamado compilador a una larga y tediosa secuencia de instrucciones de máquina específicas para la arquitectura de la CPU – puros 0s y 1s.
En este punto, has completado toda la cadena desde la arena (silicio) hasta el programa. Mucha gente siente que entiende en esta etapa, pero en el entorno industrial actual, solo entender los principios tradicionales de la CPU ni siquiera llega al nivel de aprobado.
Dado el tema más candente actual de los grandes modelos de IA, tengo que expandir tus horizontes. Veamos cómo es realmente el panorama de la potencia computacional hoy en día.
Cualquier equipo que trabaje hoy con grandes modelos, ya sea para entrenamiento o inferencia, absolutamente no puede usar CPUs para computar. Por qué?
Porque las CPUs fueron diseñadas para manejar control lógico complejo. Mira una CPU: una gran parte de su área está dedicada a la predicción de ramas, la gestión de caché y la unidad de control. La porción realmente usada para computación numérica pura – la ALU – no es tan grande. Es como si la CPU fuera un intelectual altamente educado que sobresale en procesos de gestión complejos. Pídele que calcule 1+1, puede hacerlo, e incluso podría analizar si hay algún error – pero solo puede manejar unos pocos a la vez.
La esencia matemática en el núcleo de los grandes modelos es la multiplicación de matrices a escala extremadamente grande. Por ejemplo, multiplicar dos matrices de varios miles por varios miles. Esto requiere cientos de millones de operaciones de multiplicación y suma. La lógica es extremadamente simple – multiplicar-sumar, multiplicar-sumar – sin ramificaciones complejas, pero el volumen de datos es alucinante.
Si usaras una CPU tradicional para calcular esto, ciertamente podría ejecutar miles de millones de instrucciones por segundo, pero frente a cientos de miles de millones de parámetros, sería una gota en el océano.
Para entender verdaderamente lo que los grandes modelos están calculando realmente, si tu intuición matemática todavía se basa en fórmulas de memoria, te recomiendo encarecidamente que veas “Essence of Linear Algebra” de 3Blue1Brown. Para facilitar la revisión y deducción, puedes combinarlo con estas notas compiladas de 3Blue1Brown en chino e inglés. Logra una visualización intuitiva genuina de la multiplicación de matrices avanzada y las transformaciones lineales. Después de verlo, tendrás una imagen mental real a nivel físico de las operaciones de multiplicación-acumulación a través de miles y miles de parámetros.
Notas de Álgebra Lineal de 3Blue1Brown: Posiblemente la mejor compilación chino-inglés en la web
La naturaleza de este masivo cómputo matricial dio origen a la GPU, la Unidad de Procesamiento Gráfico – que ahora debería llamarse Unidad de Cómputo Paralelo de Propósito General.
La filosofía de diseño de una GPU es completamente opuesta a la de una CPU. Elimina la mayor parte del circuito de control complejo y los grandes cachés, llenando cada bit de espacio físico liberado con las ALU más simples posibles. Un chip NVIDIA H100 actual contiene decenas de miles de núcleos de cómputo. Aunque cada núcleo puede funcionar a una frecuencia más baja que un núcleo de CPU y tiene lógica de control débil, todos pueden trabajar simultáneamente.
Piensa en una GPU como una formación de 100,000 estudiantes de primaria que solo saben aritmética. Les das una orden extremadamente simple: multiplica el número de tu izquierda por el número de tu derecha. Los 100,000 estudiantes calculan el resultado simultáneamente en el mismo ciclo de reloj. Para las operaciones matriciales masivamente paralelas requeridas por los grandes modelos, una GPU es cientos o miles de veces más eficiente que una CPU.
En realidad, la IA – como el sumador de la CPU – no es tan misteriosa. Sigue siendo solo capa tras capa de lógica y matrices. Si quieres construir tu comprensión del aprendizaje profundo desde cero, recomiendo un libro que muchos en Twitter han elogiado por desmitificar completamente la IA: Deep Learning with Python. Una vez que entiendas los cálculos tensoriales en la propagación hacia adelante y hacia atrás, te darás cuenta de que no hay magia dentro de los grandes modelos.
Después de leer este libro, quede completamente desmitificado sobre la IA!
De vuelta al hardware. Cuando hacemos optimización de algoritmos de bajo nivel, la mayor parte de nuestro esfuerzo se dedica a luchar con el ancho de banda de la VRAM. Aquí es también donde muchos programadores avanzados tropiezan.
Porque la ALU computa muy rápido. Como se mencionó anteriormente, los módulos de memoria almacenan datos cargando y descargando condensadores, y están a cierta distancia física de la CPU o GPU – las señales eléctricas tardan tiempo en viajar a través de la placa base. El mayor desafío que enfrentan los chips de IA hoy en día es lo que la academia llama el cuello de botella de von Neumann.
Es decir: miles de núcleos de cómputo terminan de procesar los datos en sus manos en un instante, y luego solo pueden permanecer inactivos, esperando que nuevos datos sean movidos desde la memoria lenta. Incluso si haces los circuitos de cómputo en el chip más rápidos, si no puedes alimentar los datos lo suficientemente rápido, la potencia de cómputo se desperdicia.
Para resolver este problema, los ingenieros de hardware han sido llevados al extremo. Ya que los módulos de memoria ordinarios están demasiado lejos y son demasiado lentos, por qué no empaquetar la memoria y el chip GPU directamente en el mismo sustrato? Para aumentar el ancho del canal para la transmisión de datos, en lugar de usar cables tradicionales, usan una tecnología llamada interposers de silicio – perforando miles de vías conductoras microscópicas dentro del silicio para conectar directamente la memoria y los núcleos de cómputo. Esto es lo que se ha promocionado hasta el cielo como Memoria de Alto Ancho de Banda, o HBM.
Si esta parte te emociona profundamente y quieres asegurar un salario alto irremplazable como arquitecto o desarrollador de bajo nivel en la venidera era de la IA, te insto encarecidamente a que abordes Computer Architecture: A Quantitative Approach. Este libro fue escrito por dos ganadores del Premio Turing, y casi todos los ingenieros de hardware en Silicon Valley tienen un ejemplar. Utiliza cantidades masivas de datos reales y fórmulas para decirte por qué los chips deben diseñarse con arquitecturas de caché específicas y exactamente dónde se encuentran los cuellos de botella en el paralelismo multinúcleo. Aunque es increíblemente árido de leer, y algunos capítulos son muy difíciles, es el camino necesario para salvar la brecha cognitiva en la comprensión de bajo nivel.
Volviendo a tu pregunta original. Por qué todavía te sientes confundido después de aprender todos esos términos? Porque la enseñanza tradicional corta la conexión vital entre las entidades físicas y las abstracciones lógicas.
Cuando tratas la CPU como una caja mágica negra, esos términos se sienten como definiciones incomprensibles. Pero si sigues las leyes de la física hacia arriba:
- Porque el alto y bajo voltaje pueden formar puertas lógicas, obtuvimos unidades aritméticas que pueden hacer matemáticas.
- Porque los circuitos de retroalimentación pueden bloquear estados de voltaje, obtuvimos registros que pueden almacenar datos.
- Porque necesitábamos controlar rítmicamente el flujo de señales eléctricas, obtuvimos osciladores de cristal y unidades de control.
- Porque este sistema es demasiado complejo para que los humanos introduzcan niveles de voltaje directamente, inventamos conjuntos de instrucciones, empaquetando 0s y 1s en lenguaje ensamblador, y finalmente en C y Python.
Como profesional que ha pasado por la trinchera en esta industria, puedo decirte muy responsablemente: en esta era, los frameworks frontend van y vienen, las arquitecturas backend de microservicios tienen su momento durante unos años, e incluso las arquitecturas de grandes modelos de IA están iterando a una velocidad vertiginosa. Muchas técnicas de desarrollo de aplicaciones de alto nivel que aprendes hoy podrían quedar obsoletas el año que viene. De hecho, los grandes modelos ya pueden hacer muchas tareas básicas de codificación mejor que el programador promedio.
Pero lo único que nunca cambia es este conjunto de principios fundamentales de funcionamiento de las computadoras arraigados en la física de los semiconductores. No importa cómo se abstraiga el software, no importa cuán sofisticados se vuelvan los algoritmos, todo se reduce en última instancia a fluctuaciones de voltaje en un trozo de silicio. Cuanto más avanzada sea la optimización del rendimiento, cuanto más vanguardista sea la programación de la computación, más necesitan los ingenieros la capacidad de ver a través de todas las capas de abstracción del software y percibir directamente el estado operativo del hardware subyacente.
No pienses que este conocimiento de bajo nivel está lejos de ti. Cuando te encuentres con un fragmento de código que consume mucho rendimiento, y porque entiendes el mecanismo de las líneas de caché a nivel inferior, ajustas la disposición de los arreglos en la memoria para mejorar drásticamente las tasas de acierto de caché de la CPU – haciendo que el código se ejecute diez veces más rápido – en ese momento, sentirás la inmensa sensación de control que viene de dominar los principios subyacentes.