  Iterative memory-bound solvers commonly occur in HPC codes. Typical GPU
implementations have a loop on the host side that invokes the GPU kernel as
much as time/algorithm steps there are. The termination of each kernel
implicitly acts the barrier required after advancing the solution every time
step. We propose an execution model for running memory-bound iterative GPU
kernels: PERsistent KernelS (PERKS). In this model, the time loop is moved
inside persistent kernel, and device-wide barriers are used for
synchronization. We then reduce the traffic to device memory by caching subset
of the output in each time step in the unused registers and shared memory.
PERKS can be generalized to any iterative solver: they largely independent of
the solver's implementation. We explain the design principle of PERKS and
demonstrate effectiveness of PERKS for a wide range of iterative 2D/3D stencil
benchmarks (geomean speedup of $2.12$x for 2D stencils and $1.24$x for 3D
stencils over state-of-art libraries), and a Krylov subspace conjugate gradient
solver (geomean speedup of $4.86$x in smaller SpMV datasets from SuiteSparse
and $1.43$x in larger SpMV datasets over a state-of-art library). All
PERKS-based implementations available at: https://github.com/neozhang307/PERKS.
