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

MIRGE stands for Math + Intermediate Representation + Code GEneration. 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.
  • 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.
  • 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.
Clone this wiki locally