From 45b30cfcd4c5c133ab16fa0338e0f38f75b37751 Mon Sep 17 00:00:00 2001 From: _ov4 Date: Mon, 9 Nov 2026 10:54:59 +0000 Subject: simplify with macro --- cachelab-handout/trans.c | 27 +++-------------- cachelab-handout/trans.h | 72 ------------------------------------------- cachelab-handout/trans_32.h | 29 ++++++++++++++++++ cachelab-handout/trans_64.h | 74 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 108 insertions(+), 94 deletions(-) delete mode 100644 cachelab-handout/trans.h create mode 100644 cachelab-handout/trans_32.h create mode 100644 cachelab-handout/trans_64.h diff --git a/cachelab-handout/trans.c b/cachelab-handout/trans.c index 833e44f..8ce61ac 100644 --- a/cachelab-handout/trans.c +++ b/cachelab-handout/trans.c @@ -10,8 +10,6 @@ #include #include "cachelab.h" -#include "trans.h" - int is_transpose(int M, int N, int A[N][M], int B[M][N]); /* @@ -27,6 +25,9 @@ int is_transpose(int M, int N, int A[N][M], int B[M][N]); #define CASE_64_64_BLOCK_SIZE 4 #define CASE_64_64_MAGIC_NUMBER 2 +#include "trans_64.h" +#include "trans_32.h" + char transpose_submit_desc[] = "Transpose submission"; void transpose_submit(int M, int N, int A[N][M], int B[M][N]) { @@ -64,6 +65,7 @@ void transpose_submit(int M, int N, int A[N][M], int B[M][N]) for (j = 0; j < M; j+=CASE_32_32_BLOCK_SIZE) { // wtf magic? + // diagonal if (i == j && i != 24) { for (i2 = 0; i2 < CASE_32_32_BLOCK_SIZE; i2++) @@ -85,26 +87,7 @@ void transpose_submit(int M, int N, int A[N][M], int B[M][N]) continue; } - - for (i2 = 0; i2 < CASE_32_32_BLOCK_SIZE; i2++) - { - t0 = A[i+i2][j+0]; - t1 = A[i+i2][j+1]; - t2 = A[i+i2][j+2]; - t3 = A[i+i2][j+3]; - t4 = A[i+i2][j+4]; - t5 = A[i+i2][j+5]; - t6 = A[i+i2][j+6]; - t7 = A[i+i2][j+7]; - B[j+0][i+i2] = t0; - B[j+1][i+i2] = t1; - B[j+2][i+i2] = t2; - B[j+3][i+i2] = t3; - B[j+4][i+i2] = t4; - B[j+5][i+i2] = t5; - B[j+6][i+i2] = t6; - B[j+7][i+i2] = t7; - } + B_32_8_BY_8_TRANSPOSE(i, j, i2); } } } diff --git a/cachelab-handout/trans.h b/cachelab-handout/trans.h deleted file mode 100644 index 0d89704..0000000 --- a/cachelab-handout/trans.h +++ /dev/null @@ -1,72 +0,0 @@ -#define CP_4_BY_8(base_i, base_j, tmp) \ -do \ -{ \ -for (tmp = 0; tmp < 4; tmp++) \ -{ \ - t0 = A[base_i + tmp][base_j + 0]; \ - t1 = A[base_i + tmp][base_j + 1]; \ - t2 = A[base_i + tmp][base_j + 2]; \ - t3 = A[base_i + tmp][base_j + 3]; \ - t4 = A[base_i + tmp][base_j + 4]; \ - t5 = A[base_i + tmp][base_j + 5]; \ - t6 = A[base_i + tmp][base_j + 6]; \ - t7 = A[base_i + tmp][base_j + 7]; \ - B[base_i + tmp][base_j + 0] = t0; \ - B[base_i + tmp][base_j + 1] = t1; \ - B[base_i + tmp][base_j + 2] = t2; \ - B[base_i + tmp][base_j + 3] = t3; \ - B[base_i + tmp][base_j + 4] = t4; \ - B[base_i + tmp][base_j + 5] = t5; \ - B[base_i + tmp][base_j + 6] = t6; \ - B[base_i + tmp][base_j + 7] = t7; \ -} \ -} while (0) - - -#define SWAP(x, y, tmp) \ -do \ -{ \ -tmp = x; x = y; y = tmp; \ -} while (0) - - -#define B_SMALL_TRANSPOSE(base_i, base_j, tmp) \ -do \ -{ \ -SWAP(B[base_i + 0][base_j + 1], B[base_i + 1][base_j + 0], tmp); \ -SWAP(B[base_i + 0][base_j + 2], B[base_i + 2][base_j + 0], tmp); \ -SWAP(B[base_i + 0][base_j + 3], B[base_i + 3][base_j + 0], tmp); \ - \ -SWAP(B[base_i + 1][base_j + 2], B[base_i + 2][base_j + 1], tmp); \ -SWAP(B[base_i + 1][base_j + 3], B[base_i + 3][base_j + 1], tmp); \ - \ -SWAP(B[base_i + 2][base_j + 3], B[base_i + 3][base_j + 2], tmp); \ -} while (0) - - -#define B_SWAP_4_BY_4(i1, j1, i2, j2, tmp) \ -do \ -{ \ -for (tmp = 0; tmp < 4; tmp++) \ -{ \ - t0 = B[i1 + tmp][j1 + 0]; \ - t1 = B[i1 + tmp][j1 + 1]; \ - t2 = B[i1 + tmp][j1 + 2]; \ - t3 = B[i1 + tmp][j1 + 3]; \ - \ - t4 = B[i2 + tmp][j2 + 0]; \ - t5 = B[i2 + tmp][j2 + 1]; \ - t6 = B[i2 + tmp][j2 + 2]; \ - t7 = B[i2 + tmp][j2 + 3]; \ - \ - B[i2 + tmp][j2 + 0] = t0; \ - B[i2 + tmp][j2 + 1] = t1; \ - B[i2 + tmp][j2 + 2] = t2; \ - B[i2 + tmp][j2 + 3] = t3; \ - \ - B[i1 + tmp][j1 + 0] = t4; \ - B[i1 + tmp][j1 + 1] = t5; \ - B[i1 + tmp][j1 + 2] = t6; \ - B[i1 + tmp][j1 + 3] = t7; \ -} \ -} while (0) diff --git a/cachelab-handout/trans_32.h b/cachelab-handout/trans_32.h new file mode 100644 index 0000000..879a55b --- /dev/null +++ b/cachelab-handout/trans_32.h @@ -0,0 +1,29 @@ +#pragma once + +#ifndef CASE_32_32_BLOCK_SIZE +#define CASE_32_32_BLOCK_SIZE 8 +#endif + +#define B_32_8_BY_8_TRANSPOSE(base_i, base_j, tmp) \ +do \ +{ \ +for (tmp = 0; tmp < CASE_32_32_BLOCK_SIZE; tmp++) \ +{ \ + t0 = A[base_i + tmp][base_j + 0]; \ + t1 = A[base_i + tmp][base_j + 1]; \ + t2 = A[base_i + tmp][base_j + 2]; \ + t3 = A[base_i + tmp][base_j + 3]; \ + t4 = A[base_i + tmp][base_j + 4]; \ + t5 = A[base_i + tmp][base_j + 5]; \ + t6 = A[base_i + tmp][base_j + 6]; \ + t7 = A[base_i + tmp][base_j + 7]; \ + B[base_j + 0][base_i + tmp] = t0; \ + B[base_j + 1][base_i + tmp] = t1; \ + B[base_j + 2][base_i + tmp] = t2; \ + B[base_j + 3][base_i + tmp] = t3; \ + B[base_j + 4][base_i + tmp] = t4; \ + B[base_j + 5][base_i + tmp] = t5; \ + B[base_j + 6][base_i + tmp] = t6; \ + B[base_j + 7][base_i + tmp] = t7; \ +} \ +} while (0) diff --git a/cachelab-handout/trans_64.h b/cachelab-handout/trans_64.h new file mode 100644 index 0000000..542866e --- /dev/null +++ b/cachelab-handout/trans_64.h @@ -0,0 +1,74 @@ +#pragma once + +#define CP_4_BY_8(base_i, base_j, tmp) \ +do \ +{ \ +for (tmp = 0; tmp < 4; tmp++) \ +{ \ + t0 = A[base_i + tmp][base_j + 0]; \ + t1 = A[base_i + tmp][base_j + 1]; \ + t2 = A[base_i + tmp][base_j + 2]; \ + t3 = A[base_i + tmp][base_j + 3]; \ + t4 = A[base_i + tmp][base_j + 4]; \ + t5 = A[base_i + tmp][base_j + 5]; \ + t6 = A[base_i + tmp][base_j + 6]; \ + t7 = A[base_i + tmp][base_j + 7]; \ + B[base_i + tmp][base_j + 0] = t0; \ + B[base_i + tmp][base_j + 1] = t1; \ + B[base_i + tmp][base_j + 2] = t2; \ + B[base_i + tmp][base_j + 3] = t3; \ + B[base_i + tmp][base_j + 4] = t4; \ + B[base_i + tmp][base_j + 5] = t5; \ + B[base_i + tmp][base_j + 6] = t6; \ + B[base_i + tmp][base_j + 7] = t7; \ +} \ +} while (0) + + +#define SWAP(x, y, tmp) \ +do \ +{ \ +tmp = x; x = y; y = tmp; \ +} while (0) + + +#define B_SMALL_TRANSPOSE(base_i, base_j, tmp) \ +do \ +{ \ +SWAP(B[base_i + 0][base_j + 1], B[base_i + 1][base_j + 0], tmp); \ +SWAP(B[base_i + 0][base_j + 2], B[base_i + 2][base_j + 0], tmp); \ +SWAP(B[base_i + 0][base_j + 3], B[base_i + 3][base_j + 0], tmp); \ + \ +SWAP(B[base_i + 1][base_j + 2], B[base_i + 2][base_j + 1], tmp); \ +SWAP(B[base_i + 1][base_j + 3], B[base_i + 3][base_j + 1], tmp); \ + \ +SWAP(B[base_i + 2][base_j + 3], B[base_i + 3][base_j + 2], tmp); \ +} while (0) + + +#define B_SWAP_4_BY_4(i1, j1, i2, j2, tmp) \ +do \ +{ \ +for (tmp = 0; tmp < 4; tmp++) \ +{ \ + t0 = B[i1 + tmp][j1 + 0]; \ + t1 = B[i1 + tmp][j1 + 1]; \ + t2 = B[i1 + tmp][j1 + 2]; \ + t3 = B[i1 + tmp][j1 + 3]; \ + \ + t4 = B[i2 + tmp][j2 + 0]; \ + t5 = B[i2 + tmp][j2 + 1]; \ + t6 = B[i2 + tmp][j2 + 2]; \ + t7 = B[i2 + tmp][j2 + 3]; \ + \ + B[i2 + tmp][j2 + 0] = t0; \ + B[i2 + tmp][j2 + 1] = t1; \ + B[i2 + tmp][j2 + 2] = t2; \ + B[i2 + tmp][j2 + 3] = t3; \ + \ + B[i1 + tmp][j1 + 0] = t4; \ + B[i1 + tmp][j1 + 1] = t5; \ + B[i1 + tmp][j1 + 2] = t6; \ + B[i1 + tmp][j1 + 3] = t7; \ +} \ +} while (0) -- cgit v1.3.1-4-g156e