  Nowadays, GPU accelerators are commonly used to speed up general-purpose
computing tasks on a variety of hardware. However, due to the diversity of GPU
architectures and processed data, optimization of codes for a particular type
of hardware and specific data characteristics can be extremely challenging. The
autotuning of performance-relevant source-code parameters allows for automatic
optimization of applications and keeps their performance portable. Although the
autotuning process typically results in code speed-up, searching the tuning
space can bring unacceptable overhead if (i) the tuning space is vast and full
of poorly-performing implementations, or (ii) the autotuning process has to be
repeated frequently because of changes in processed data or migration to
different hardware.
  In this paper, we introduce a novel method for searching tuning spaces. The
method takes advantage of collecting hardware performance counters (also known
as profiling counters) during empirical tuning. Those counters are used to
navigate the searching process towards faster implementations. The method
requires the tuning space to be sampled on any GPU. It builds a
problem-specific model, which can be used during autotuning on various, even
previously unseen inputs or GPUs. Using a set of five benchmarks, we
experimentally demonstrate that our method can speed up autotuning when an
application needs to be ported to different hardware or when it needs to
process data with different characteristics. We also compared our method to
state of the art and show that our method is superior in terms of the number of
searching steps and typically outperforms other searches in terms of
convergence time.
