aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cachelab-handout/trans.c21
-rw-r--r--cachelab-handout/trans.h19
2 files changed, 24 insertions, 16 deletions
diff --git a/cachelab-handout/trans.c b/cachelab-handout/trans.c
index 8f347aa..6972f87 100644
--- a/cachelab-handout/trans.c
+++ b/cachelab-handout/trans.c
@@ -25,6 +25,7 @@ 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.h"
#include "trans_64.h"
#include "trans_32.h"
@@ -133,15 +134,9 @@ void transpose_submit(int M, int N, int A[N][M], int B[M][N])
j2 = 4, t4 = 0;
for (i2 = 0; i2 < CASE_64_64_BLOCK_SIZE; i2++)
{
- t0 = B[j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + i2]
- [i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + 0];
- t1 = B[j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + i2]
- [i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + 1];
- t2 = B[j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + i2]
- [i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + 2];
- t3 = B[j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + i2]
- [i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + 3];
+ LOAD_ROW_4(B, j*8 + 0*4 + i2, i*8 + 1*4);
+
B[j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + i2]
[i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + 0] =
A[i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + 0]
@@ -162,14 +157,8 @@ void transpose_submit(int M, int N, int A[N][M], int B[M][N])
A[i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + 3]
[j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + i2];
- B[j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2]
- [i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 0] = t0;
- B[j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2]
- [i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 1] = t1;
- B[j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2]
- [i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 2] = t2;
- B[j * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + j2 + i2]
- [i * CASE_64_64_MAGIC_NUMBER * CASE_64_64_BLOCK_SIZE + t4 + 3] = t3;
+
+ STORE_ROW_4(B, j*8 + 1*4 + i2, i*8 + 0*4);
}
// A11 -> B11
diff --git a/cachelab-handout/trans.h b/cachelab-handout/trans.h
new file mode 100644
index 0000000..1e1add0
--- /dev/null
+++ b/cachelab-handout/trans.h
@@ -0,0 +1,19 @@
+#pragma once
+
+#define LOAD_ROW_4(src, base_i, base_j) \
+do \
+{ \
+t0 = src[base_i][base_j + 0]; \
+t1 = src[base_i][base_j + 1]; \
+t2 = src[base_i][base_j + 2]; \
+t3 = src[base_i][base_j + 3]; \
+} while (0)
+
+#define STORE_ROW_4(dst, base_i, base_j) \
+do \
+{ \
+dst[base_i][base_j + 0] = t0; \
+dst[base_i][base_j + 1] = t1; \
+dst[base_i][base_j + 2] = t2; \
+dst[base_i][base_j + 3] = t3; \
+} while (0)