Goal | Implementing the Covariance application for Xilinx FPGA |

Approach | OpenCL for SDAccel |

Benefits | Learning how to describe an application in Xilinx OpenCL |

Credit | This work has been done under the ENPOWER project (funded by EPSRC) at University of Bristol. |

# Covariance

The description of the covariance is taken from [1][2].

Covariance is one of the operator in statistics and data mining. It takes an input data as a 2D matrix and calculate the covariance of each two column. Therefore, the output is a symmetric matrix.

**data**: is an matrix that contains the input data

**cove** : is an matrix that contains the results.

where

This description can be divided into three kernels [2]: **k_mean**, **k_reduce** and **k_covar** as shown in the following figure.

There are three memory objects shares the data between kernels and host program: **d_data**, **d_mean** and **d_covar**

The **k_mean **kernel calculates the mean value of each column in the **d_data** 2D matrix. The **k_mean** kernel subtract the corresponding mean from each element in the **d_data**. Finally, **d_covar** calculate the covariance.

The three kernels are running sequentially one after another as shown in the figure.

The corresponding unoptimised code can be found at here.

References

[1] Tomofumi Yuki, Louis-Noel Pouchet, “PolyBench 4.2.1 (pre-release),” May 20, 2016, [online] http://web.cse.ohio-state.edu/~pouchet/software/polybench/

[2] S. Grauer-Gray, L. Xu, R. Searles, S. Ayalasomayajula and J. Cavazos, “Auto-tuning a high-level language targeted to GPU codes,” *Innovative Parallel Computing (InPar), 2012*, San Jose, CA, 2012, pp. 1-10. [online] https://cavazos-lab.github.io/PolyBench-ACC/