  Acceleration of graph applications on GPUs has found large interest due to
the ubiquitous use of graph processing in various domains. The inherent
\textit{irregularity} in graph applications leads to several challenges for
parallelization. A key challenge, which we address in this paper, is that of
load-imbalance. If the work-assignment to threads uses node-based graph
partitioning, it can result in skewed task-distribution, leading to poor
load-balance. In contrast, if the work-assignment uses edge-based graph
partitioning, the load-balancing is better, but the memory requirement is
relatively higher. This makes it unsuitable for large graphs. In this work, we
propose three techniques for improved load-balancing of graph applications on
GPUs. Each technique brings in unique advantages, and a user may have to employ
a specific technique based on the requirement. Using Breadth First Search and
Single Source Shortest Paths as our processing kernels, we illustrate the
effectiveness of each of the proposed techniques in comparison to the existing
node-based and edge-based mechanisms.
