  The performance bottlenecks of graph applications depend not only on the
algorithm and the underlying hardware, but also on the size and structure of
the input graph. Programmers must try different combinations of a large set of
techniques to develop the best implementation for a specific algorithm and type
of graph. Existing graph frameworks lack flexibility, supporting only a limited
set of optimizations.
  This paper introduces GraphIt, a new DSL for graph computations that
generates fast implementations for algorithms with different performance
characteristics running on graphs with different sizes and structures. GraphIt
separates what is computed (algorithm) from how it is computed (schedule).
Programmers specify the algorithm using an algorithm language, and performance
optimizations are specified using a scheduling language. The algorithm language
simplifies expressing the algorithms. We formulate graph optimizations,
including edge traversal direction, data layout, parallelization, cache, NUMA,
and kernel fusion optimizations, as tradeoffs among locality, parallelism, and
work-efficiency. The scheduling language enables programmers to easily search
through this complicated tradeoff space by composing together optimizations. We
also built an autotuner to automatically find high-performance schedules. The
compiler uses a new scheduling representation, the graph iteration space, to
model, compose, and ensure the validity of the large number of optimizations.
GraphIt outperforms the next fastest of six state-of-the-art shared-memory
frameworks (Ligra, Green-Marl, GraphMat, Galois, Gemini, and Grazelle) on 24
out of 32 experiments by up to 4.8$\times$, and is never more than 43% slower
than the fastest framework on the other experiments. GraphIt also reduces the
lines of code by up to an order of magnitude compared to the next fastest
framework.
