#include <stdint.h>
#include <stdio.h>
 
/* C7x hardware cycle counter */
extern volatile __cregister unsigned long __TSC;
 
#define MATRIX_SIZE 256 /* 256x256 x 4B = 256 KB, fits in C7120 L2SRAM */
 
static float matrix[MATRIX_SIZE][MATRIX_SIZE];
 
/* Prevents compiler from optimizing away the compute loop */
void useMatrix(float mat[MATRIX_SIZE][MATRIX_SIZE]) {
  volatile float sink = mat[0][0];
  (void)sink;
}
 
int32_t matrixInit(void) {
  int i, j;
  unsigned long start_time_cn, stop_time_cn;
 
  start_time_cn = __TSC;
  for (i = 0; i < MATRIX_SIZE; i++)
    for (j = 0; j < MATRIX_SIZE; j++)
      matrix[i][j] = (float)(i + j);
  stop_time_cn = __TSC;
 
  printf("\nNumber of clock cycles elapsed in cn= %lu",
         stop_time_cn - start_time_cn);
  return 0;
}
 
void testOptimization(void) {
  int i, j;
  float val;
  unsigned long start_time_ci, stop_time_ci;
 
  start_time_ci = __TSC;
  for (i = MATRIX_SIZE - 1; i >= 0; i--) {
    for (j = MATRIX_SIZE - 1; j >= 0; j--) {
      val = matrix[i][j];
      val = val * 1.2345f + 0.9876f;
      val = val * val - 0.4321f;
      matrix[i][j] = val;
    }
  }
  stop_time_ci = __TSC;
 
  printf("\nNumber of clock cycles elapsed in ci= %lu",
         stop_time_ci - start_time_ci);
  useMatrix(matrix);
}
 
int main(void) {
  printf("\n=== Matrix Benchmark ===\n");
  matrixInit();
  testOptimization();
  printf("\n=== Done ===\n");
  return 0;
}
 
