Advertisement
Guest User

Untitled

a guest
Apr 24th, 2015
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.34 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <cstring>
  3.  
  4. #define LOC(m, i, j, row_size) m[(i) * (row_size) + (j)]
  5.  
  6. void matrix_mul1(int* a, int* b, int* c, int size)
  7. {
  8. int res = 0, i, j, k;
  9. for (i = 0; i < size; ++i)
  10. {
  11. for (j = 0; j < size; ++j)
  12. {
  13. res = 0;
  14. for (k = 0; k < size; ++k)
  15. {
  16. res += LOC(a, i, k, size) * LOC(b, k, j, size);
  17. }
  18. LOC(c, i, j, size) = res;
  19. }
  20. }
  21. }
  22.  
  23. void matrix_mul2(int* a, int* b, int* c, int size)
  24. {
  25. int tmp = 0, i, j, k;
  26. for (j = 0; j < size; ++j)
  27. {
  28. for (k = 0; k < size; ++k)
  29. {
  30. tmp = LOC(b, k, j, size);
  31. for (i = 0; i < size; ++i)
  32. {
  33. LOC(c, i, j, size) += LOC(a, i, k, size) * tmp;
  34. }
  35. }
  36. }
  37. }
  38.  
  39. // This is the one with least cache miss
  40. void matrix_mul3(int* a, int* b, int* c, int size)
  41. {
  42. int tmp = 0, i, j, k;
  43. for (k = 0; k < size; ++k)
  44. {
  45. for (i = 0; i < size; ++i)
  46. {
  47. tmp = LOC(a, i, k, size);
  48. for (j = 0; j < size; ++j)
  49. {
  50. LOC(c, i, j, size) += tmp * LOC(b, k, j, size);
  51. }
  52. }
  53. }
  54. }
  55.  
  56.  
  57. int main(int argc, char** argv)
  58. {
  59. int size = 2;
  60. int times = 100000;
  61. int which = 1;
  62. if (argc > 1)
  63. {
  64. size = atoi(argv[1]);
  65. if (size < 2)
  66. {
  67. size = 2;
  68. }
  69. }
  70. if (argc > 2)
  71. {
  72. times = atoi(argv[2]);
  73. if (times <= 0)
  74. {
  75. times = 100000;
  76. }
  77. }
  78. if (argc > 3)
  79. {
  80. which = atoi(argv[3]);
  81. if (which < 1 || which > 3)
  82. {
  83. which = 1;
  84. }
  85. }
  86.  
  87. int* a = new int[size * size];
  88. int* b = new int[size * size];
  89. int* c = new int[size * size];
  90. bzero(a, size * size * sizeof(int));
  91. bzero(b, size * size * sizeof(int));
  92. bzero(c, size * size * sizeof(int));
  93.  
  94. switch (which)
  95. {
  96. case 1:
  97. for (int i = 0; i < times; ++i)
  98. {
  99. matrix_mul1(a, b, c, size);
  100. }
  101. break;
  102. case 2:
  103. for (int i = 0; i < times; ++i)
  104. {
  105. matrix_mul2(a, b, c, size);
  106. }
  107. break;
  108. case 3:
  109. for (int i = 0; i < times; ++i)
  110. {
  111. matrix_mul3(a, b, c, size);
  112. }
  113. break;
  114. default:
  115. break;
  116. }
  117.  
  118. return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement