diff options
| author | _ov4 <ov4@ov4.org> | 2026-07-22 13:39:41 +0000 |
|---|---|---|
| committer | _ov4 <ov4@ov4.org> | 2026-07-22 13:39:41 +0000 |
| commit | f357ad9f1797abace5f2e7e9065434d0d002c803 (patch) | |
| tree | 9269616059ed4597bc18329cb500324dafd8964c | |
| parent | b99ad8c8769e63f3e3701a7ffa146c76969471a5 (diff) | |
improve
| -rw-r--r-- | cachelab-handout/trans.c | 115 |
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; } } } |
