Skip to content
Andreas Klöckner edited this page Aug 16, 2023 · 3 revisions

MIRGE stands for Math + Intermediate Representation + Code Generation + Execution. It is how MIRGE-Com separates numerical and modeling concerns from the necessary technology to target modern, massively parallel processors such as GPUs.

Collectively, MIRGE consists of the following technologies:

  • Pytato, a bit like JAX/Tensorflow. Captures a computation expressed in terms of (a subset of) numpy and builds an array-valued data flow graph. This graph represents an array expression that does not specify "time and space", so e.g., loop structures, memory layouts, and use of temporaries. Includes support for distributed computation based on send/receive. After array-level transformations, pytato can emit a program to evaluate the expression in Loopy. Pytato is responsible for Mathematical representation and the array-level Intermediate Representation.
  • Loopy, a program transformation tool loosely based on the polyhedral model. Allows loop and data structure transformations and emits CPU and GPU code, in OpenCL, CUDA, OpenMP, ISPC, and more. Loopy provides the loop-level Intermediate Representation as well as Code Generation and Execution on various hardware.
  • Array context augments numpy with some verbs (freeze, thaw, compile) to influence the granularity of code generation. It allows user code to seamlessly switch which implementation of numpy is actually in use: numpy itself, various GPU arrays, or lazy evaluation based on Pytato or Jax. Arraycontext helps with the Mathematical representation and the execution parts of MIRGE.
Clone this wiki locally