  Heterogeneity has become a mainstream architecture design choice for building
High Performance Computing systems. However, heterogeneity poses significant
challenges for achieving performance portability of execution. Adapting a
program to a new heterogeneous platform is laborious and requires developers to
manually explore a vast space of execution parameters. To address those
challenges, this paper proposes new extensions to OpenMP for autonomous,
machine learning-driven adaptation.
  Our solution includes a set of novel language constructs, compiler
transformations, and runtime support. We propose a producer-consumer pattern to
flexibly define multiple, different variants of OpenMP code regions to enable
adaptation. Those regions are transparently profiled at runtime to autonomously
learn optimizing machine learning models that dynamically select the fastest
variant. Our approach significantly reduces users' efforts of programming
adaptive applications on heterogeneous architectures by leveraging machine
learning techniques and code generation capabilities of OpenMP compilation.
Using a complete reference implementation in Clang/LLVM we evaluate three
use-cases of adaptive CPU-GPU execution. Experiments with HPC proxy
applications and benchmarks demonstrate that the proposed adaptive OpenMP
extensions automatically choose the best performing code variants for various
adaptation possibilities, in several different heterogeneous platforms of CPUs
and GPUs.
