conv2d.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include <stdio.h>
  2. #include "ImC/imc_kernel.h"
  3. #include "ImC/imc_extension.h"
  4. #define INPUT_SIZE 20
  5. #define KERNEL_SIZE 6
  6. #define OUTPUT_SIZE (INPUT_SIZE - KERNEL_SIZE + 1)
  7. static int input[INPUT_SIZE][INPUT_SIZE] = {
  8. [0 ... INPUT_SIZE - 1] = {[0 ... INPUT_SIZE - 1] = 2}};
  9. static int kernel[KERNEL_SIZE][KERNEL_SIZE] = {
  10. [0 ... KERNEL_SIZE - 1] = {[0 ... KERNEL_SIZE - 1] = 2}};
  11. void vConv2d()
  12. {
  13. // int IMC_REPEAT = 100;
  14. int IMC_REPEAT = imcBENCH_REPEAT_COUNT;
  15. int output[OUTPUT_SIZE * OUTPUT_SIZE];
  16. IMC_UNROLL(8)
  17. for (int imc_repeat = 0; imc_repeat < IMC_REPEAT; imc_repeat++)
  18. {
  19. for (int _i = 0; _i < OUTPUT_SIZE * OUTPUT_SIZE; _i++)
  20. {
  21. int i = _i / OUTPUT_SIZE;
  22. int j = _i % OUTPUT_SIZE;
  23. int sum = 0;
  24. IMC_UNROLL(KERNEL_SIZE)
  25. for (int ii = 0; ii < KERNEL_SIZE; ii++)
  26. {
  27. IMC_UNROLL(KERNEL_SIZE)
  28. for (int jj = 0; jj < KERNEL_SIZE; jj++)
  29. {
  30. int input_i = i + ii;
  31. int input_j = j + jj;
  32. sum += input[input_i][input_j] * kernel[ii][jj];
  33. }
  34. }
  35. // output[i * OUTPUT_SIZE + j] = sum;
  36. output[_i] = sum;
  37. }
  38. // }
  39. }
  40. int sum = 0;
  41. // #pragma clang loop unroll(disable)
  42. for (int _i = 0; _i < OUTPUT_SIZE * OUTPUT_SIZE; _i++)
  43. {
  44. printf("%d ", output[_i]);
  45. if (_i % OUTPUT_SIZE == OUTPUT_SIZE - 1)
  46. {
  47. printf("\r\n");
  48. }
  49. sum += output[_i];
  50. }
  51. printf("\r\n");
  52. printf("(OUT) sum: %d\r\n", sum);
  53. }