Higher Order Flattening

Abstract
We extend the flattening transformation, which turns nested into flat
data parallelism, to the full higher-order case, including lambda
abstractions and data parallel arrays of functions. Our central observation
is that flattening needs to transform the closures used to represent
functional values. Thus, we use closure conversion before flattening and
introduce array closures to represent arrays of functional values.