summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-11-09 11:08:15 +0000
committer_ov4 <ov4@ov4.org>2026-11-09 11:08:15 +0000
commit121033e4a69e29a6b375993d445cba018ee4975c (patch)
treeb3793282c5eb0edc1d0e6f7ad09251d1a6626a2c
parent45b30cfcd4c5c133ab16fa0338e0f38f75b37751 (diff)
macro
-rw-r--r--cachelab-handout/trans.c47
-rw-r--r--cachelab-handout/trans_64.h16
2 files changed, 24 insertions, 39 deletions
diff --git a/cachelab-handout/trans.c b/cachelab-handout/trans.c
index 8ce61ac..8f347aa 100644
--- a/cachelab-handout/trans.c
+++ b/cachelab-handout/trans.c
@@ -120,34 +120,14 @@ void transpose_submit(int M, int N, int A[N][M], int B[M][N])
}
// A00 -> B00
- j2 = 0;
- t4 = 0;
- for (i2 = 0; i2 < CASE_64_64_BLOCK_SIZE; i2++)
- {
- t0 = A[i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2][j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 0];
- t1 = A[i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2][j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 1];
- t2 = A[i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2][j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 2];
- t3 = A[i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2][j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 3];
- B[j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 0][i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2] = t0;
- B[j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 1][i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2] = t1;
- B[j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 2][i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2] = t2;
- B[j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 3][i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2] = t3;
- }
+ TRANSPOSE_4_BY_4(i*8 + 0*4, j*8 + 0*4,
+ j*8 + 0*4, i*8 + 0*4, i2);
+
// A01 -> temp B01
- j2 = 0;
- t4 = 4;
- for (i2 = 0; i2 < CASE_64_64_BLOCK_SIZE; i2++)
- {
- t0 = A[i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2][j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 0];
- t1 = A[i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2][j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 1];
- t2 = A[i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2][j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 2];
- t3 = A[i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2][j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 3];
- B[j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + 0][i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + i2] = t0;
- B[j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + 1][i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + i2] = t1;
- B[j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + 2][i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + i2] = t2;
- B[j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + 3][i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + i2] = t3;
- }
+ TRANSPOSE_4_BY_4(i*8 + 0*4, j*8 + 1*4,
+ j*8 + 0*4, i*8 + 1*4, i2);
+
// B01 -> temp var, A10 -> B01, temp var -> B10
j2 = 4, t4 = 0;
@@ -193,19 +173,8 @@ void transpose_submit(int M, int N, int A[N][M], int B[M][N])
}
// A11 -> B11
- j2 = 4;
- t4 = 4;
- for (i2 = 0; i2 < CASE_64_64_BLOCK_SIZE; i2++)
- {
- t0 = A[i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2][j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 0];
- t1 = A[i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2][j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 1];
- t2 = A[i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2][j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 2];
- t3 = A[i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2][j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 3];
- B[j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 0][i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2] = t0;
- B[j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 1][i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2] = t1;
- B[j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 2][i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2] = t2;
- B[j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 3][i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2] = t3;
- }
+ TRANSPOSE_4_BY_4(i*8 + 1*4, j*8 + 1*4,
+ j*8 + 1*4, i*8 + 1*4, i2);
}
}
}
diff --git a/cachelab-handout/trans_64.h b/cachelab-handout/trans_64.h
index 542866e..1f6fed5 100644
--- a/cachelab-handout/trans_64.h
+++ b/cachelab-handout/trans_64.h
@@ -1,5 +1,21 @@
#pragma once
+#define TRANSPOSE_4_BY_4(base_i_A, base_j_A, base_i_B, base_j_B, tmp) \
+do \
+{ \
+for (tmp = 0; tmp < 4; tmp++) \
+{ \
+ t0 = A[base_i_A + tmp][base_j_A + 0]; \
+ t1 = A[base_i_A + tmp][base_j_A + 1]; \
+ t2 = A[base_i_A + tmp][base_j_A + 2]; \
+ t3 = A[base_i_A + tmp][base_j_A + 3]; \
+ B[base_i_B + 0][base_j_B + tmp] = t0; \
+ B[base_i_B + 1][base_j_B + tmp] = t1; \
+ B[base_i_B + 2][base_j_B + tmp] = t2; \
+ B[base_i_B + 3][base_j_B + tmp] = t3; \
+} \
+} while (0)
+
#define CP_4_BY_8(base_i, base_j, tmp) \
do \
{ \