Papers
Topics
Authors
Recent
Search
2000 character limit reached

A Virtual Processor brings back the Free Lunch

Published 28 May 2026 in cs.PF, cs.DC, and cs.PL | (2605.30507v1)

Abstract: This work introduces a self-optimizing virtual processor (VP) for numerical array programs that shifts parallelization from a manual developer task to a cooperative, agent-like runtime mechanism. Instead of relying on centralized task-graph scheduling, static compiler optimization, or explicitly annotated parallel constructs, the VP uses a decentralized network of cooperative execution segments, derived from the stream of numerical instructions and their data dependencies at runtime. Each segment makes only local decisions about when, where, and how to prepare and execute its computation, including task placement, kernel preparation, and data movement. No central scheduler or mapper instance determines the execution globally; instead, scheduling itself is parallelized and distributed over time - asynchronously and strictly dependency driven. The overall execution strategy emerges from concurrently executing local segments, continuously responding to data availability, cost estimates, system state, hardware capabilities, and problem size. While preserving the sequential semantics of the program our VP automatically exploits parallelism across large program regions rather than being limited to individual loop bodies, modules, or explicitly marked parallel sections; developers are not required to design or encode a parallelization strategy. The current VP primarily targets low-latency strong scaling on local heterogeneous hardware, covering workloads from small, latency-sensitive array operations to large data-parallel computations. The current implementation targets the predefined array instruction set of the ILNumerics.ONAL domain-specific language, while the underlying concept is applicable to general array-based numerical programming models such as MATLAB and NumPy.

Authors (1)

Summary

  • The paper presents a Virtual Processor that automatically parallelizes sequential array codes by constructing a dynamic Execution Net.
  • It employs agent-based scheduling and micro-JIT kernel generation to adaptively optimize performance across heterogeneous hardware.
  • Empirical evaluations demonstrate over 10x speedup against legacy methods on CPU-bound workloads, illustrating robust strong scaling.

Summary of "A Virtual Processor brings back the Free Lunch" (2605.30507)

The paper presents a self-optimizing Virtual Processor (VP) designed to dynamically and automatically parallelize sequential array codes, specifically targeting n-dimensional tensor workloads common in languages such as NumPy, MATLAB, and ILNumerics. The VP decentralizes the parallelization and scheduling process, eliminating the need for manual developer intervention or static compile-time analysis. Instead, it relies on a volatile, distributed runtime Execution Net (EN) that enables fine-grained parallel execution and load balancing across heterogeneous hardware resources. Strong empirical results demonstrate that this approach significantly outperforms traditional solutions, including hand-optimized FORTRAN, legacy ILNumerics, and NumPy, particularly in CPU-bound scenarios.

System Architecture and Execution Net

The VP model centers on fully preserving sequential program semantics while achieving automatic, maximally efficient parallel execution. It does this by translating the incoming stream of array instructions into an Execution Net (EN)—a dynamic data structure whose nodes represent instructions or code fragments, linked by precise data dependencies. Each node in the EN acts autonomously, making run-time scheduling and placement decisions based on local information about data readiness, hardware state, and cost metrics.

This decentralized, agent-based execution paradigm removes both the need for a central scheduler or global dependency analysis and the classic bottleneck of static parallel region annotation. The EN structure, formed at runtime, captures parallelism across arbitrary code regions—function boundaries, conditionals, and complex dataflow patterns—frequently missed by traditional static or semi-automatic parallelization approaches.

Nodes decide when to execute, on which (sub-)device, and handle kernel preparation and data movements. Their actions are triggered by changes in data readiness, leveraging a temporal interpretation of dependencies—an instruction whose inputs are fully configured is immediately eligible for execution, maximizing task concurrency wherever hardware resources permit.

Runtime Optimization and Scheduling Strategies

Detecting Parallelism

Parallel potential is detected at runtime as nodes are incorporated into the EN. The EN supports fine- to coarse-grained parallelism, exploiting independence at the granularity of array instruction streams spanning multiple program regions. Instructions with independent input data are processed concurrently, while instructions with unresolved dependencies wait, thus enabling temporal locality and dataflow-driven scheduling. This method circumvents the pitfalls of static dependency analysis and maintains correct sequential semantics.

Autonomous Workload Scheduling

Each EN node actively selects among available processing units (e.g., CPU cores, GPU, accelerators), dynamically assessing device-specific cost models and utilization states. The "cost ahead" metric, normalized across devices by their raw cycles and effective clock rates, enables the VP to minimize waiting and migration overhead by early commitment to optimal devices. This local, fine-grained cost-aware scheduling decisively reduces workload imbalance and context switching penalties, particularly for non-trivial dependency graphs and variable problem sizes.

Kernel Generation via Micro-JITs

The processing of each node culminates in an optimized kernel, produced via a specialized micro-JIT compiler. Each micro-JIT is tailored to a specific instruction subtree, dynamically adapting low-level code to current hardware and data properties. Aggressive specialization and staging are coupled with loop fusion, pipelining, cache-aware blocking, and SIMD vectorization. A staged approach to kernel specialization enables low JIT latency on first execution and progressive optimization based on runtime statistics, amortizing compilation costs and adapting to workload variations.

Memory Management

The VP adopts advanced memory strategies including transparent array views, copy-on-write semantics, and pooled storage. Array renaming techniques reminiscent of register renaming resolve potential write-after-read (WAR) conflicts in concurrent read/write scenarios, ensuring correctness without global synchronization. Multi-location storage and dynamic data migration between devices are handled seamlessly, hiding most transfer and allocation latencies through aggressive prefetching and pipelining of operations as far upstream as possible.

Array Pipelining

The VP subdivides array processing into partial completion stages—size computed, device configured, result computed—allowing dependent nodes to begin processing as soon as partial input information is available. This enables pipeline parallelism over dependency chains and reduces end-to-end latency by overlapping kernel compilation, memory movement, and computation.

Empirical Evaluation

Microbenchmarks: Parallel Array Expressions

Benchmarks comparing the VP against NumPy (plus Numba) and FORTRAN (Intel ifx) showed the VP outperformed FORTRAN with all optimizations by a factor exceeding 10x for non-toy array expressions on a 12-core Intel i7-12700K system. The VP completed evaluations in ~0.06 ms per call, compared to ~2.2 ms (NumPy), ~1.2 ms (NumPy+Numba), ~0.7 ms (non-optimized ILNumerics), and ~0.1 ms (FORTRAN /fast). These results were achieved using only multicore CPUs; GPU integration would likely further increase the gap.

Loop Parallelization

Unlike methods dependent on parallelizing independent loop iterations via constructs such as Parallel.For, the VP automatically detects and exploits parallelism in both vectorized expressions and loop-based code without user guidance. In scenarios with full iteration independence, the VP outperformed manual parallelization and maintained similar speedups even in presence of moderate data dependencies (write-after-read), automatically preserving correctness by restricting only the critical path and parallelizing all other independent operations.

Full Application: K-Means

For the canonical K-Means clustering benchmark, the VP achieved approximately an order of magnitude lower runtime compared to unoptimized ILNumerics, NumPy, and optimized FORTRAN. Notably, no code modifications or parallel annotations were required—the VP automatically exploited parallelism in both dominant loops and smaller code fragments, yielding an end-to-end improvement in program execution.

Implications and Theoretical Considerations

The introduction of an autonomous, agent-driven Execution Net as a runtime abstraction significantly extends the scope of hardware-agnostic, fully automated parallelization in array and tensor codes. By shifting dependency analysis and load balancing to runtime and decentralizing scheduling, the VP model successfully resolves the long-standing trade-off between performance portability and code maintainability. Unlike approaches that are limited to statically analyzable loop bodies or require intrusive refactoring (e.g., JAX, Numba, Dask, Legion/Legate), the VP enables robust strong scaling on single-node, heterogeneous hardware without developer involvement, legacy code rewrites, or reliance on static compiler technology.

The avoidance of a centralized scheduler reduces contention and eliminates bottlenecks associated with global task dependencies. Autonomous nodes, fine-grained state tracking, and multiple stages of kernel and memory pipeline parallelism allow the system to dynamically adapt to diverse workload shapes, data sizes, and rapidly fluctuating hardware resource states—paving the way for broader applicability to future architectures.

Limitations and Future Work

The current implementation is limited to array/tensor-centric programming models found in numerical DSLs. While this covers a substantial portion of scientific and engineering workloads, its direct applicability to side-effect-laden, irregular, or pointer-based code regions is unproven. The scalability of volatile data structures and memory consumption on highly concurrent, resource-constrained hardware demands ongoing engineering solutions.

Future developments should address extending the VP abstraction to broader DSLs, integrating advanced cost models for device selection in the presence of multiple accelerators, and refining micro-JIT strategies for superlinear speedups in mixed-precision or non-uniform memory access (NUMA) systems. There is also potential for exporting these concepts to distributed systems, although network-induced latencies and global memory coherence would present additional challenges.

Conclusion

The paper's Virtual Processor demonstrates a robust engineering solution to fully automated, optimal parallelization for sequential array codes. By adopting a decentralized, runtime-driven Execution Net and deferring all critical scheduling, placement, and optimization decisions to autonomous agent-like nodes, the VP achieves hardware-agnostic strong scaling and consistently outperforms both legacy and modern manual or semi-automatic methods. This work offers a significant advance in the practical realization of the "free lunch" of automatic parallelism once promised by single-core generations, with profound implications for future high-performance programming models and runtime systems.

Paper to Video (Beta)

No one has generated a video about this paper yet.

Whiteboard

No one has generated a whiteboard explanation for this paper yet.

Open Problems

We haven't generated a list of open problems mentioned in this paper yet.

Collections

Sign up for free to add this paper to one or more collections.

HackerNews