  Graphs model several real-world phenomena. With the growth of unstructured
and semi-structured data, parallelization of graph algorithms is inevitable.
Unfortunately, due to inherent irregularity of computation, memory access, and
communication, graph algorithms are traditionally challenging to parallelize.
To tame this challenge, several libraries, frameworks, and domain-specific
languages (DSLs) have been proposed to reduce the parallel programming burden
of the users, who are often domain experts. However, existing frameworks to
model graph algorithms typically target a single architecture. In this paper,
we present a graph DSL, named StarPlat, that allows programmers to specify
graph algorithms in a high-level format, but generates code for three different
backends from the same algorithmic specification. In particular, the DSL
compiler generates OpenMP for multi-core, MPI for distributed, and CUDA for
many-core GPUs. Since these three are completely different parallel programming
paradigms, binding them together under the same language is challenging. We
share our experience with the language design. Central to our compiler is an
intermediate representation which allows a common representation of the
high-level program, from which individual backend code generations begin. We
demonstrate the expressiveness of StarPlat by specifying four graph algorithms:
betweenness centrality computation, page rank computation, single-source
shortest paths, and triangle counting. We illustrate the effectiveness of our
approach by comparing the performance of the generated codes with that obtained
with hand-crafted library codes. We find that the generated code is competitive
to library-based codes in many cases. More importantly, we show the feasibility
to generate efficient codes for different target architectures from the same
algorithmic specification of graph algorithms.
