Hardware-level recursive self-improvement: what can you build?
Start by separating code that runs better on a device from changes to the device itself. The experiment, feedback time, and proof are different at each layer.
Updated

There are several different hardware loops
Hardware-level recursive self-improvement can mean an AI improving the software that uses hardware, helping design hardware, or using physical experiments to guide later designs. A faster GPU kernel is a software result on a device. A better chip layout is a design result. A fabricated chip that meets its power target is a physical result.
The recursive claim needs one more link: the improvement must feed back into the system's ability to make further improvements. A kernel that speeds up the search evaluator could do that. An unrelated faster application might be valuable without being recursive.
| Layer | Candidate | Required check |
|---|---|---|
| GPU software | Kernel, tile size, fusion choice | Correctness and timing on the target GPU |
| Compiler or runtime | Scheduling or memory policy | Representative end-to-end workloads |
| Digital design | RTL or implementation choices | Equivalence, timing, area, and power analysis |
| Physical hardware | Board, cooling, or device change | Instrumented measurements and safe operating limits |
- Kernel
- Verify outputs
- Simulation
- Test assumptions
- Device
- Respect limits
- Measurement
- Record physical evidence
A credible first project: optimize one GPU kernel
Our suggested first project starts with a kernel that your real workload spends time in. State the input shapes, data types, allowed numerical error, and memory ceiling. Save a trusted reference implementation. If you cannot define correctness before measuring speed, you cannot rank candidates reliably.
Let the search vary a small set of parameters first: block sizes, launch layout, or a fusion choice. Triton's matrix multiplication tutorial is a concrete starting reference for hardware-aware tuning. It is not evidence that the same settings will win on every GPU.
Record both the kernel time and the whole job time. If a kernel accounts for only a small part of the job, even a large local speedup may barely change the user's wait. Loading data, compiling, and moving bytes can dominate a short experiment.
Make the timer measure the work
Accelerator work can be asynchronous. A host-side timer can stop after enqueueing a kernel while the GPU is still running it. PyTorch's benchmark tools handle warmup and synchronization when needed. Use a runtime-aware timer and save repeated measurements, rather than reporting the best single sample.
Keep device model, driver, compiler, clocks or power settings, and competing workload conditions in the run record. Separate compilation from steady-state runtime. Rerun the baseline alongside promising candidates so a changing machine does not masquerade as a better algorithm.
A correctness test should include awkward shapes and boundary values, not just the shape used for tuning. Numerical tolerance needs a reason tied to the application. A candidate that is faster because it silently uses a less accurate operation may violate the actual task.
Why does a faster benchmark barely speed up the job?
A timer answers the question inside its boundary. To make that concrete, we compared an explicit Python integer-summing loop with the built-in sum function. First we timed summing an already decoded list. Then we timed a small complete job: decode the same in-memory JSON, sum the numbers, and check the answer. Both candidates produce exactly 199,990,000 for the 20,000-integer input.
In our September 20 local run, the built-in operation was 3.37× faster by the ratio of median batch times. The decode-and-sum job was only 1.18× faster. The operation improved; the unchanged decoding and list-management work still had to happen. This is a CPU demonstration of measurement boundaries, not a GPU benchmark or an AI-discovered optimization.
We used CPython 3.14.7 on macOS arm64 (Darwin 25.3.0), with garbage collection enabled. Each variant had three warmup batches and 20 measured batches of 50 calls. We rotated the four variants through every timing position equally often. Each call checked its output; separate checks covered empty input, zero, negative values, and large integers. The table reports milliseconds per call, averaged within each batch; its median and range describe those 20 batch averages, not individual-request tail latency.
This was a shared developer machine without fixed clocks, CPU affinity, or control of competing work. The raw report includes every batch, ordering, Python build, input hash, and source hash. Your numbers will differ. We retained the first completed run and do not claim a confidence interval or a universal speedup.
| Timed work | Median | Min–max |
|---|---|---|
| Sum only: Python loop | 0.1654 | 0.1614–0.1865 |
| Sum only: built-in sum | 0.0491 | 0.0429–0.0514 |
| Decode + sum: Python loop | 0.7985 | 0.7848–0.8326 |
| Decode + sum: built-in sum | 0.6795 | 0.6688–0.7026 |
python3 timing-boundaries.py > my-timing-report.json- Download the runnable timing experiment (.py)
- Read our raw timings and reproducibility manifest (.json)
- Read Python's guidance on setup, garbage collection, and repeated timings
The job starts with JSON already in memory and includes decoding, summation, the output check, and disposal of the decoded list. Process startup, imports, input generation, disk/network I/O, and report serialization are excluded. This is a complete decode-and-sum job, not a full application benchmark.
Carry the measurement boundary into your GPU experiment
Before searching for a faster kernel, estimate how much of the baseline job it occupies. If a component takes a fraction f of a serial job and becomes s times faster, the idealized job speedup is 1 / ((1 − f) + f / s). For example, making a component that takes 10% of the job four times faster gives about 1.08× overall speedup. This arithmetic assumes the other work stays unchanged and no new overhead or overlap; measure the actual job to check it.
On a GPU, record a device timing and a separate application timing. Device events must cover the intended work and stream dependencies. A host timer must wait for the relevant GPU work to finish. Decide whether the application boundary includes transfers, compilation, allocation, and output validation. Report cold-start and warmed runs separately. NVIDIA's timing guidance and PyTorch's runtime-aware benchmark tools explain the accelerator-specific details that this CPU script does not exercise.
For a self-improvement loop, use the metric that funds the next experiment: validated candidates per hour, cost per accepted result, or time to a fixed quality target. A kernel win is useful evidence, but it does not establish a faster research loop. Recheck the whole evaluator on representative inputs before retaining the candidate.
Estimate whether the feedback pays for itself
Here is illustrative arithmetic, not a Meshia benchmark. Suppose a search spends 30 GPU-hours to find a change that saves 0.2 seconds each time a job runs. Recovering 30 hours of device time would require 540,000 such runs: 30 × 3,600 ÷ 0.2.
That estimate ignores model API calls, engineering time, deployment overhead, and differences in hardware cost. Include those before making a financial claim. The point is to define the expected reuse before launching a large search.
Recursion becomes experimentally interesting if the improved component reduces the cost of later search rounds. Compare the same search budget with and without that component. A faster inner loop is plausible; a compounding improvement curve still needs measurement.
Simulation is a filter, not physical proof
For a board or cooling design, save geometry, material assumptions, boundary conditions, solver version, and mesh settings with each simulated result. Compare simulated trends with a measured baseline before trusting an optimizer that searches that model. Otherwise the search may exploit a simulator weakness.
Move promising candidates through separate gates: design checks, simulation, hardware review, then a bounded physical test. A device controller should enforce current, voltage, temperature, and motion limits outside the AI's editable process. The agent can propose a test; it should not be able to remove the independent stop.
Do not describe an improved simulated thermal field as a measured temperature reduction. The distinction is especially important when you share a result. Publish the test setup, uncertainty, and failed conditions so a reader can tell what actually transferred to hardware.
What published systems add to this picture
DeepMind describes AlphaEvolve applications across algorithms and computing infrastructure, including work related to chip design. Those reports motivate the approach; they do not make chip fabrication an instant software loop. Procurement, fabrication, instrumentation, and physical reliability still set feedback limits.
For an independent researcher, the most accessible entry is often software on an existing device. Build a reliable evaluator and an archive of candidates first. Expand the hardware boundary only when you can measure the next layer.
References
- Matrix multiplication and hardware-specific tuningTriton
- Benchmark timing, warmup, and accelerator synchronizationPyTorch
- Profiling, Amdahl's law, and CPU versus GPU timersNVIDIA
- Python timing boundaries and repeated measurementsPython Software Foundation
- AlphaEvolve: reported applications and impact (May 2026)Google DeepMind
Plan the run before renting the GPU
Keep the source, baseline, input manifest, and measured outputs together. Meshia's experiment guide explains the workspace records you can use to organize the work.
Read the experiment guide →