OpenMP meta-lowering improves parallel code portably and modularly

OpenMP Meta-Lowering: A Declarative Approach to Performance Portable Parallel Code Generation

Programming LanguagesDistributed, Parallel, and Cluster Computing

Summary

Different types of computer hardware can make it hard to write fast parallel programs that work everywhere. The authors introduce a new way to transform OpenMP programs into efficient code by separating the translation step into a customizable process. This lets developers easily adapt how code is generated for different machines or software systems without changing the whole compiler. Their method keeps the program’s parallel structure for longer, allowing better optimizations. Tests show it matches quality of existing compilers while using simpler and smaller code.

What this means in practice

  • For parallel software developers: Generate efficient parallel code for diverse hardware by customizing how OpenMP constructs are translated without changing compiler internals.
  • For embedded systems engineers: Rapidly support new runtimes on embedded multicore platforms through compact specifications for OpenMP code generation.

Authors

Luca Parigi, Giuseppe Tagliavini

Abstract

The increasing diversity of parallel hardware challenges existing compilation flows. While OpenMP provides a portable abstraction for shared-memory parallelism, existing compilers tightly couple the frontend semantics with fixed lowering strategies. This design limits performance portability across different runtimes and architectures. In this paper, we present a modular approach to parallel code generation based on the Multi-Level Intermediate Representation (MLIR) framework. Our approach combines an OpenMP frontend with a domain-specific language (DSL) that specifies how OpenMP constructs are lowered for a target. We call this approach OpenMP meta-lowering, treating lowering as a programmable component rather than compiler-specific logic. This design provides explicit control over code outlining, data sharing, and runtime interfacing across diverse targets. We evaluate our approach on PolyBench/C-OMP across general-purpose and embedded multicore targets. Our results show that the proposed method matches the performance of state-of-the-art compiler toolchains with negligible code-size overhead (< 0.7%). Preserving OpenMP constructs until late lowering stages enables both general-purpose and OpenMP-specific MLIR optimizations. By decoupling lowering from compiler internals, our approach expresses the same OpenMP subset in 5,182 lines of code, ~32% fewer than the corresponding lowering code in Clang and ~76% fewer than in GCC, while supporting the pmsis runtime costs only a few specification lines, enabling rapid support for new runtimes without modifying the compiler.