aboutsummaryrefslogtreecommitdiff
path: root/cachelab-handout
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-07-22 13:39:41 +0000
committer_ov4 <ov4@ov4.org>2026-07-22 13:39:41 +0000
commitf357ad9f1797abace5f2e7e9065434d0d002c803 (patch)
tree9269616059ed4597bc18329cb500324dafd8964c /cachelab-handout
parentb99ad8c8769e63f3e3701a7ffa146c76969471a5 (diff)
improve
Diffstat (limited to 'cachelab-handout')
-rw-r--r--cachelab-handout/trans.c115
1 files changed, 102 insertions, 13 deletions
diff --git a/cachelab-handout/trans.c b/cachelab-handout/trans.c
index 584ecf8..1483dab 100644
--- a/cachelab-handout/trans.c
+++ b/cachelab-handout/trans.c
@@ -23,31 +23,120 @@ char transpose_submit_desc[] = "Transpose submission";
void transpose_submit(int M, int N, int A[N][M], int B[M][N])
{
int i, j, i2;
- int t0, t1, t2, t3, currentGroupI, currentGroupJ;
+ int t0, t1, t2, t3, currentGroupI, currentGroupJ, tmpI = 7, tmpJ = 7;
const int blockSize = 4, larger = 2;
for (i = 0; i < N/(blockSize*larger); i++)
{
for (j = 0; j < M/(blockSize*larger); j++)
{
- for (currentGroupI = 0; currentGroupI < larger*blockSize; currentGroupI+=blockSize)
+ // for (currentGroupI = 0; currentGroupI < larger*blockSize; currentGroupI+=blockSize)
+ // {
+ // for (currentGroupJ = 0; currentGroupJ < larger*blockSize; currentGroupJ+=blockSize)
+ // {
+ // // move 4x4
+ // for (i2 = 0; i2 < blockSize; i2++)
+ // {
+ // t0 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 0];
+ // t1 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 1];
+ // t2 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 2];
+ // t3 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 3];
+
+ // B[j*larger*blockSize + currentGroupJ + 0][i*larger*blockSize + currentGroupI + i2] = t0;
+ // B[j*larger*blockSize + currentGroupJ + 1][i*larger*blockSize + currentGroupI + i2] = t1;
+ // B[j*larger*blockSize + currentGroupJ + 2][i*larger*blockSize + currentGroupI + i2] = t2;
+ // B[j*larger*blockSize + currentGroupJ + 3][i*larger*blockSize + currentGroupI + i2] = t3;
+ // }
+ // }
+ // }
+
+ if (i == 7 && j == 7)
{
- for (currentGroupJ = 0; currentGroupJ < larger*blockSize; currentGroupJ+=blockSize)
+ for (currentGroupI = 0; currentGroupI < larger*blockSize; currentGroupI+=blockSize)
{
- // move 4x4
- for (i2 = 0; i2 < blockSize; i2++)
+ for (currentGroupJ = 0; currentGroupJ < larger*blockSize; currentGroupJ+=blockSize)
{
- t0 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 0];
- t1 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 1];
- t2 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 2];
- t3 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 3];
+ // move 4x4
+ for (i2 = 0; i2 < blockSize; i2++)
+ {
+ t0 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 0];
+ t1 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 1];
+ t2 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 2];
+ t3 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 3];
- B[j*larger*blockSize + currentGroupJ + 0][i*larger*blockSize + currentGroupI + i2] = t0;
- B[j*larger*blockSize + currentGroupJ + 1][i*larger*blockSize + currentGroupI + i2] = t1;
- B[j*larger*blockSize + currentGroupJ + 2][i*larger*blockSize + currentGroupI + i2] = t2;
- B[j*larger*blockSize + currentGroupJ + 3][i*larger*blockSize + currentGroupI + i2] = t3;
+ B[j*larger*blockSize + currentGroupJ + 0][i*larger*blockSize + currentGroupI + i2] = t0;
+ B[j*larger*blockSize + currentGroupJ + 1][i*larger*blockSize + currentGroupI + i2] = t1;
+ B[j*larger*blockSize + currentGroupJ + 2][i*larger*blockSize + currentGroupI + i2] = t2;
+ B[j*larger*blockSize + currentGroupJ + 3][i*larger*blockSize + currentGroupI + i2] = t3;
+ }
}
}
+ continue;
+ }
+
+ // A00 -> B00
+ currentGroupI = 0; currentGroupJ = 0;
+ for (i2 = 0; i2 < blockSize; i2++) {
+ t0 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 0];
+ t1 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 1];
+ t2 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 2];
+ t3 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 3];
+ B[j*larger*blockSize + currentGroupJ + 0][i*larger*blockSize + currentGroupI + i2] = t0;
+ B[j*larger*blockSize + currentGroupJ + 1][i*larger*blockSize + currentGroupI + i2] = t1;
+ B[j*larger*blockSize + currentGroupJ + 2][i*larger*blockSize + currentGroupI + i2] = t2;
+ B[j*larger*blockSize + currentGroupJ + 3][i*larger*blockSize + currentGroupI + i2] = t3;
+ }
+
+ // A01 -> temp
+ currentGroupI = 0; currentGroupJ = 4;
+ for (i2 = 0; i2 < blockSize; i2++) {
+ t0 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 0];
+ t1 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 1];
+ t2 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 2];
+ t3 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 3];
+ B[tmpJ*larger*blockSize + 0 + 0][tmpI*larger*blockSize + 0 + i2] = t0;
+ B[tmpJ*larger*blockSize + 0 + 1][tmpI*larger*blockSize + 0 + i2] = t1;
+ B[tmpJ*larger*blockSize + 0 + 2][tmpI*larger*blockSize + 0 + i2] = t2;
+ B[tmpJ*larger*blockSize + 0 + 3][tmpI*larger*blockSize + 0 + i2] = t3;
+ }
+
+ // A10 -> B01
+ currentGroupI = 4; currentGroupJ = 0;
+ for (i2 = 0; i2 < blockSize; i2++) {
+ t0 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 0];
+ t1 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 1];
+ t2 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 2];
+ t3 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 3];
+ B[j*larger*blockSize + currentGroupJ + 0][i*larger*blockSize + currentGroupI + i2] = t0;
+ B[j*larger*blockSize + currentGroupJ + 1][i*larger*blockSize + currentGroupI + i2] = t1;
+ B[j*larger*blockSize + currentGroupJ + 2][i*larger*blockSize + currentGroupI + i2] = t2;
+ B[j*larger*blockSize + currentGroupJ + 3][i*larger*blockSize + currentGroupI + i2] = t3;
+ }
+
+ // temp -> B10
+ currentGroupI = 0; currentGroupJ = 4;
+ for (i2 = 0; i2 < blockSize; i2++) {
+ t0 = B[tmpJ*larger*blockSize + 0 + 0][tmpI*larger*blockSize + 0 + i2];
+ t1 = B[tmpJ*larger*blockSize + 0 + 1][tmpI*larger*blockSize + 0 + i2];
+ t2 = B[tmpJ*larger*blockSize + 0 + 2][tmpI*larger*blockSize + 0 + i2];
+ t3 = B[tmpJ*larger*blockSize + 0 + 3][tmpI*larger*blockSize + 0 + i2];
+ B[j*larger*blockSize + currentGroupJ + 0][i*larger*blockSize + currentGroupI + i2] = t0;
+ B[j*larger*blockSize + currentGroupJ + 1][i*larger*blockSize + currentGroupI + i2] = t1;
+ B[j*larger*blockSize + currentGroupJ + 2][i*larger*blockSize + currentGroupI + i2] = t2;
+ B[j*larger*blockSize + currentGroupJ + 3][i*larger*blockSize + currentGroupI + i2] = t3;
+ }
+
+ // A11 -> A11
+ currentGroupI = 4; currentGroupJ = 4;
+ for (i2 = 0; i2 < blockSize; i2++) {
+ t0 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 0];
+ t1 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 1];
+ t2 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 2];
+ t3 = A[i*larger*blockSize + currentGroupI + i2][j*larger*blockSize + currentGroupJ + 3];
+ B[j*larger*blockSize + currentGroupJ + 0][i*larger*blockSize + currentGroupI + i2] = t0;
+ B[j*larger*blockSize + currentGroupJ + 1][i*larger*blockSize + currentGroupI + i2] = t1;
+ B[j*larger*blockSize + currentGroupJ + 2][i*larger*blockSize + currentGroupI + i2] = t2;
+ B[j*larger*blockSize + currentGroupJ + 3][i*larger*blockSize + currentGroupI + i2] = t3;
}
}
}