conv2d.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. // #pragma clang loop unroll(disable)
  17. for (int imc_repeat = 0; imc_repeat < IMC_REPEAT; imc_repeat++)
  18. {
  19. // #pragma clang loop unroll(disable)
  20. // for(int i=0; i<OUTPUT_SIZE; i++) {
  21. // #pragma clang loop unroll(disable)
  22. // for(int j=0; j<OUTPUT_SIZE; j++) {
  23. // #pragma clang loop unroll(disable)
  24. for (int _i = 0; _i < OUTPUT_SIZE * OUTPUT_SIZE; _i++)
  25. {
  26. int i = _i / OUTPUT_SIZE;
  27. int j = _i % OUTPUT_SIZE;
  28. int sum = 0;
  29. // #pragma clang loop unroll(disable)
  30. for (int ii = 0; ii < KERNEL_SIZE; ii++)
  31. {
  32. // #pragma clang loop unroll(disable)
  33. for (int jj = 0; jj < KERNEL_SIZE; jj++)
  34. {
  35. int input_i = i + ii;
  36. int input_j = j + jj;
  37. sum += input[input_i][input_j] * kernel[ii][jj];
  38. }
  39. }
  40. // output[i * OUTPUT_SIZE + j] = sum;
  41. output[_i] = sum;
  42. }
  43. // }
  44. }
  45. int sum = 0;
  46. #pragma clang loop unroll(disable)
  47. for (int _i = 0; _i < OUTPUT_SIZE * OUTPUT_SIZE; _i++)
  48. {
  49. printf("%d ", output[_i]);
  50. if (_i % OUTPUT_SIZE == OUTPUT_SIZE - 1)
  51. {
  52. printf("\r\n");
  53. }
  54. sum += output[_i];
  55. }
  56. printf("\r\n");
  57. printf("(OUT) sum: %d\r\n", sum);
  58. }