Data movement  is a major bottleneck in parallel data-intensive applications. In response to this problem , researchers have proposed new runtimes and intermediate representations (IRs) that apply optimizations such as loop fusion under existing library APIs . Even though these runtimes generally do no require changes to user code , they require intrusive changes to the library itself: often, all the library functions need to be rewritten for a new IR or virtual machine . In this paper, we propose a new abstraction called splitability annotations (SAs) that enables key data movement optimizations on black-box library functions. SAs only require that users add an annotation for existing, unmodified functions and implement a small API to split data values in the library. Together, this interface describes how to partition values that are passed among functions to enable data pipelining and automatic parallelization while respecting each library 's correctness constraints. We implement  SAs in a system called Mozart. Without modifying any library function, on workloads using NumPy and Pandas in Python and Intel MKL in C, Mozart provides performance competitive with intrusive solutions that require rewriting libraries in many cases, can sometimes improve performance over past systems by up to 2x , and accelerates workloads by up to 30x .
Data movement between main memory and the CPU is a major bottleneck in parallel data-intensive applications. In response , researchers have proposed using compilers and intermediate representations (IRs) that apply optimizations such as loop fusion under existing high-level APIs such as NumPy and TensorFlow . Even though these techniques generally do not require changes to user applications , they require intrusive changes to the library itself: often, library developers must rewrite each function using a new IR . In this paper, we propose a new technique called split annotations (SAs) that enables key data movement optimizations over unmodified library functions. SAs only require developers to annotate functions and implement an API that specifies how to partition data in the library. The annotation and API describe how to enable cross-function data pipelining and parallelization, while respecting each function 's correctness constraints. We implement a parallel runtime for SAs in a system called Mozart. We show that Mozart can accelerate workloads in libraries such as Intel MKL and Pandas by up to 15x, with no library modifications. Mozart also provides performance gains competitive with solutions that require rewriting libraries , and can sometimes outperform these systems by up to 2x by leveraging existing hand-optimized code .
A
between main memory and the CPU
D
to this problem
R
new runtimes
using compilers
R
library APIs
high-level APIs such as NumPy and TensorFlow
R
runtimes generally do no
techniques generally do not
R
code
applications
R
all the library functions need to be rewritten for
library developers must rewrite each function using
D
or virtual machine
R
abstraction called splitability
technique called split
R
on black-box
over unmodified
R
that users add an annotation for existing, unmodified
developers to annotate
R
a small API to split data values
an API that specifies how to partition data
R
Together, this interface describes how to partition values that are passed among functions to enable
The annotation and API describe how to enable cross-function
R
automatic parallelization
parallelization,
R
library
function
A
a parallel runtime for
R
Without modifying any library function, on workloads using NumPy and Pandas in Python and Intel MKL in C, Mozart provides performance competitive with intrusive
We show that Mozart can accelerate workloads in libraries such as Intel MKL and Pandas by up to 15x, with no library modifications. Mozart also provides performance gains competitive with
R
in many cases, can sometimes improve performance over past
, and can sometimes outperform these
R
, and accelerates workloads by up to 30x
by leveraging existing hand-optimized code