Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdlib>
- #include <cstring>
- #define LOC(m, i, j, row_size) m[(i) * (row_size) + (j)]
- void matrix_mul1(int* a, int* b, int* c, int size)
- {
- int res = 0, i, j, k;
- for (i = 0; i < size; ++i)
- {
- for (j = 0; j < size; ++j)
- {
- res = 0;
- for (k = 0; k < size; ++k)
- {
- res += LOC(a, i, k, size) * LOC(b, k, j, size);
- }
- LOC(c, i, j, size) = res;
- }
- }
- }
- void matrix_mul2(int* a, int* b, int* c, int size)
- {
- int tmp = 0, i, j, k;
- for (j = 0; j < size; ++j)
- {
- for (k = 0; k < size; ++k)
- {
- tmp = LOC(b, k, j, size);
- for (i = 0; i < size; ++i)
- {
- LOC(c, i, j, size) += LOC(a, i, k, size) * tmp;
- }
- }
- }
- }
- // This is the one with least cache miss
- void matrix_mul3(int* a, int* b, int* c, int size)
- {
- int tmp = 0, i, j, k;
- for (k = 0; k < size; ++k)
- {
- for (i = 0; i < size; ++i)
- {
- tmp = LOC(a, i, k, size);
- for (j = 0; j < size; ++j)
- {
- LOC(c, i, j, size) += tmp * LOC(b, k, j, size);
- }
- }
- }
- }
- int main(int argc, char** argv)
- {
- int size = 2;
- int times = 100000;
- int which = 1;
- if (argc > 1)
- {
- size = atoi(argv[1]);
- if (size < 2)
- {
- size = 2;
- }
- }
- if (argc > 2)
- {
- times = atoi(argv[2]);
- if (times <= 0)
- {
- times = 100000;
- }
- }
- if (argc > 3)
- {
- which = atoi(argv[3]);
- if (which < 1 || which > 3)
- {
- which = 1;
- }
- }
- int* a = new int[size * size];
- int* b = new int[size * size];
- int* c = new int[size * size];
- bzero(a, size * size * sizeof(int));
- bzero(b, size * size * sizeof(int));
- bzero(c, size * size * sizeof(int));
- switch (which)
- {
- case 1:
- for (int i = 0; i < times; ++i)
- {
- matrix_mul1(a, b, c, size);
- }
- break;
- case 2:
- for (int i = 0; i < times; ++i)
- {
- matrix_mul2(a, b, c, size);
- }
- break;
- case 3:
- for (int i = 0; i < times; ++i)
- {
- matrix_mul3(a, b, c, size);
- }
- break;
- default:
- break;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement