32x32 matrix now with <300 misses
parent
8e9a49a0c8
commit
f1ab745063
33
src/trans.c
33
src/trans.c
|
@ -29,14 +29,23 @@ void transpose_submit(int M, int N, int A[N][M], int B[M][N])
|
||||||
{
|
{
|
||||||
//343 misses (goal: <300; 0 points if >600)
|
//343 misses (goal: <300; 0 points if >600)
|
||||||
if(N == 32){
|
if(N == 32){
|
||||||
int n, m, nn, mm;
|
int n, m, nn, mm, diag_pos, diag_value;
|
||||||
|
|
||||||
for (n=0; n<N;n+=8){
|
for (n=0; n<N;n+=8){
|
||||||
for (m=0;m<M; m+=8){
|
for (m=0;m<M; m+=8){
|
||||||
|
|
||||||
for(nn=n; nn<n+8;nn++){
|
for(nn=n; nn<n+8;nn++){
|
||||||
for(mm=m; mm<m+8;mm++){
|
for(mm=m; mm<m+8;mm++){
|
||||||
B[mm][nn] = A[nn][mm];
|
|
||||||
|
if(nn!=mm){
|
||||||
|
B[mm][nn] = A[nn][mm];
|
||||||
|
}else{
|
||||||
|
diag_pos = nn;
|
||||||
|
diag_value = A[nn][mm];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(n==m){
|
||||||
|
B[diag_pos][diag_pos]= diag_value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,7 +53,27 @@ void transpose_submit(int M, int N, int A[N][M], int B[M][N])
|
||||||
|
|
||||||
}
|
}
|
||||||
if(N == 64){
|
if(N == 64){
|
||||||
|
int n, m, nn, mm, diag_pos, diag_value;
|
||||||
|
|
||||||
|
for (n=0; n<N;n+=4){
|
||||||
|
for (m=0;m<M; m+=4){
|
||||||
|
|
||||||
|
for(nn=n; nn<n+4;nn++){
|
||||||
|
for(mm=m; mm<m+4;mm++){
|
||||||
|
|
||||||
|
if(nn!=mm){
|
||||||
|
B[mm][nn] = A[nn][mm];
|
||||||
|
}else{
|
||||||
|
diag_pos = nn;
|
||||||
|
diag_value = A[nn][mm];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(n==m){
|
||||||
|
B[diag_pos][diag_pos]= diag_value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue