Planificación, núcleos y eventos · Lección 26 de 30 · unos 15 minutos
Repartir trabajo entre núcleos
Divide trabajos independientes y combina sus resultados.
01 / Comprende
Comprender la idea
Varios núcleos pueden ejecutar distintas tareas de forma independiente. El trabajo independiente se puede repartir antes de ejecutarlo: una tarea trabaja con índices pares y otra con impares. Sus resultados necesitan una forma acordada de combinarse.
El laboratorio de sistemas usa instancias separadas de la máquina para sus carriles de núcleo. Este reto calcula el mismo reparto secuencialmente en una sola máquina; sus salidas comprueban la descomposición, no una ejecución paralela real. Evita escrituras compartidas cuando bastan destinos independientes.
02 / Prueba
Observar qué ocurre
La tarea de índices pares procesa las direcciones 0 y 2: 1² + 3² = 10. La vista de sistemas muestra ambos carriles de trabajo.
STORE 1 0
STORE 2 1
STORE 3 2
STORE 4 3
LOAD [0]
MUL R0
COPY R0 R1
LOAD [2]
MUL R0
ADD R1
PRINT
HALTUsa Avanzar un paso para seguir una instrucción cada vez. Puedes modificar el ejemplo y repetirlo.
03 / Reto
Hacerlo funcionar
Hay cuatro valores de trabajo inicializados en la memoria 0–3. La tarea par calcula valor[0]² + valor[2]² y la impar valor[1]² + valor[3]². Llama a ambas. Imprime el total par, el impar y el combinado, en ese orden.
El comprobador ejecuta el programa actual del editor en una máquina nueva para cada uno de 3 casos. Suministra entradas y memoria inicial; la salida y memoria actuales del laboratorio no deciden el resultado.
CALL evenWorker
PRINT
CALL oddWorker
PRINT
LOAD R1
ADD R2
PRINT
HALT
evenWorker:
#
RETURN
oddWorker:
#
RETURN¿Necesitas una pista?
Eleva cada valor al cuadrado en R0, guarda el primer cuadrado en el registro de resultado de esa tarea y suma el segundo.
Mostrar una solución resuelta
Lee el programa, predice el efecto de cada instrucción y después avanza paso a paso en el laboratorio.
CALL evenWorker
PRINT
CALL oddWorker
PRINT
LOAD R1
ADD R2
PRINT
HALT
evenWorker: LOAD [0]
MUL R0
COPY R0 R1
LOAD [2]
MUL R0
ADD R1
COPY R0 R1
RETURN
oddWorker: LOAD [1]
MUL R0
COPY R0 R2
LOAD [3]
MUL R0
ADD R2
COPY R0 R2
RETURNLaboratorio de CPU con emojis
Programa con emojis
Escribe LOAD, ADD u otro código de operación y pulsa Espacio para insertar su emoji. Ctrl/⌘ + Intro ejecuta o pausa; Escape pausa; Ctrl/⌘ + ] añade sangría. Tab mueve el foco. Las etiquetas terminan en dos puntos. Los saltos usan direcciones de instrucción que empiezan en cero.
Mapa de instrucciones y puntos de interrupción (0)
Los puntos de interrupción detienen la ejecución antes de una instrucción. Ejecutar permite pasar una vez por el punto en el que se ha detenido; Avanzar un paso ejecuta esa instrucción directamente. Editar el código borra los puntos de interrupción anteriores y el estado de la máquina.
Registros de la CPU
- R0
- 0
- R1
- 0
- R2
- 0
- R3
- 0
- R4
- 0
- R5
- 0
- R6
- 0
- R7
- 0
Pilas y marcos de bucle
SP = 255 − profundidad de datos − profundidad de llamadas. La pila está separada de la memoria.
Pila de datos (fondo → cima)
Vacío
Direcciones de retorno de llamadas (fondo → cima)
Vacío
Marcos de bucle
Vacío
Salida y entrada
Ejecuta una instrucción PRINT para ver la salida.
Entrada en la cola: Vacío
Memoria · 256 bytes · 0 distintos de cero
Cada celda muestra dirección:valor. R = leído en este paso; W = escrito en este paso. Selecciona una celda para inspeccionarla o inicializarla antes de ejecutar. Usa las flechas para desplazarte, Inicio/Fin para la fila y Ctrl/⌘ + Inicio/Fin para toda la memoria.
Traza de ejecución · 0 entradas
Abajo aparecen las entradas recientes. Inspecciona cualquier índice, empezando por cero, para ver una copia completa e independiente del estado anterior y posterior.
Comprobar tu reto
Puedes comprobarlo en cualquier momento. Todos los casos deben superar la prueba para registrar la finalización.
El progreso usa solo almacenamiento local. Permanece en este navegador y nunca se envía a un servidor.