  Unstructured-mesh based numerical algorithms such as finite volume and finite
element algorithms form an important class of applications for many scientific
and engineering domains. The key difficulty in achieving higher performance
from these applications is the indirect accesses that lead to data-races when
parallelized. Current methods for handling such data-races lead to reduced
parallelism and suboptimal performance. Particularly on modern many-core
architectures, such as GPUs, that has increasing core/thread counts, reducing
data movement and exploiting memory locality is vital for gaining good
performance.
  In this work we present novel locality-exploiting optimizations for the
efficient execution of unstructured-mesh algorithms on GPUs. Building on a
two-layered coloring strategy for handling data races, we introduce novel
reordering and partitioning techniques to further improve efficient execution.
The new optimizations are then applied to several well established
unstructured-mesh applications, investigating their performance on NVIDIA's
latest P100 and V100 GPUs. We demonstrate significant speedups
($1.1\text{--}1.75\times$) compared to the state-of-the-art. A range of
performance metrics are benchmarked including runtime, memory transactions,
achieved bandwidth performance, GPU occupancy and data reuse factors and are
used to understand and explain the key factors impacting performance. The
optimized algorithms are implemented as an open-source software library and we
illustrate its use for improving performance of existing or new
unstructured-mesh applications.
