conv2d.c 1.7 KB

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