  Portability is critical to ensuring high productivity in developing and
maintaining scientific software as the diversity in on-node hardware
architectures increases. While several programming models provide portability
for diverse GPU platforms, they don't make any guarantees about performance
portability. In this work, we explore several programming models -- CUDA, HIP,
Kokkos, RAJA, OpenMP, OpenACC, and SYCL, to study if the performance of these
models is consistently good across NVIDIA and AMD GPUs. We use five proxy
applications from different scientific domains, create implementations where
missing, and use them to present a comprehensive comparative evaluation of the
programming models. We provide a Spack scripting-based methodology to ensure
reproducibility of experiments conducted in this work. Finally, we attempt to
answer the question -- to what extent does each programming model provide
performance portability for heterogeneous systems in real-world usage?
