  Image convolution is widely used for sharpening, blurring and edge detection.
In this paper, we review two common algorithms for convolving a 2D image by a
separable kernel (filter). After optimising the naive codes using loop
unrolling and SIMD vectorisation, we choose the algorithm with better
performance as the baseline for parallelisation. We then compare the parallel
performance of the optimised code using OpenMP, OpenCL and GPRM implementations
on the Intel Xeon Phi. We also measure the effects of optimisation techniques
and demonstrate how they affect both sequential and parallel performance. Apart
from comparing the code complexity as well as the performance of the chosen
parallel programming models, we investigate the impact of a parallelisation
technique, task agglomeration in GPRM.
