A language for hierarchical data parallel design-space exploration on GPUs
Journal article, 2016

Graphics Processing Units (GPUs) offer potential for very high performance; they are also rapidly evolving. Obsidian is an embedded language (in Haskell) for implementing high performance kernels to be run on GPUs. We would like to have our cake and eat it too; we want to raise the level of abstraction beyond CUDA code and still give the programmer control over the details relevant to kernel performance. To that end, Obsidian provides array representations that guarantee elimination of intermediate arrays while also using the type system to model the hierarchy of the GPU. Operations are compiled very differently depending on what level of the GPU they target, and as a result, the user is gently constrained to write code that matches the capabilities of the GPU. Thus, we implement not Nested Data Parallelism, but a more limited form that we call Hierarchical Data Parallelism. We walk through case-studies that demonstrate how to use Obsidian for rapid design exploration or auto-tuning, resulting in performance that compares well to the hand-tuned kernels used in Accelerate and NVIDIA Thrust.

Performance

GPU

Embedded Languages

EDSL

Author

Joel Bo Svensson

Software Engineering and Technology (Chalmers)

Mary Sheeran

Software Engineering and Technology (Chalmers)

Ryan R. Newton

Indiana University

Journal of Functional Programming

0956-7968 (ISSN) 1469-7653 (eISSN)

Vol. 26

Subject Categories

Computer Science

DOI

10.1017/S0956796816000046

More information

Latest update

1/17/2020