  To achieve high performance on modern computers, it is vital to map
algorithmic parallelism to that inherent in the hardware. From an application
developer's perspective, it is also important that code can be maintained in a
portable manner across a range of hardware. Here we present targetDP (target
Data Parallel), a lightweight programming layer that allows the abstraction of
data parallelism for applications that employ structured grids. A single source
code may be used to target both thread level parallelism (TLP) and instruction
level parallelism (ILP) on either SIMD multi-core CPUs or GPU-accelerated
platforms. targetDP is implemented via standard C preprocessor macros and
library functions, can be added to existing applications incrementally, and can
be combined with higher-level paradigms such as MPI. We present CPU and GPU
performance results for a benchmark taken from the lattice Boltzmann
application that motivated this work. These demonstrate not only performance
portability, but also the optimisation resulting from the intelligent exposure
of ILP.
