conv2d.c 1.8 KB

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