int main(int argc, char **argv) { int opt, exp = -1, var = -1; bool err = false; while ((opt = getopt(argc, argv, "n:v:")) != -1) { if (opt == 'n') exp = atoi(optarg); else if (opt == 'v') var = atoi(optarg); else err = true; } if (err || exp < 0 || var < 0 || var >= 2) { fprintf(stderr, "Usage: %s -n log2(size) -v variant\n", argv[0]); return 1; } int n = 1 << exp; size_t size = n * n * sizeof(int); int *src = NULL, *dst = NULL; posix_memalign((void **)&src, getpagesize(), size); posix_memalign((void **)&dst, getpagesize(), size); printf("Generate matrix %d x %d (%ld KiB)\n", n, n, size >> 10); fill(src, n); bzero(dst, size); flush_cache(); printf("Performing matrix transposition.\n"); _timer_t timer; timer_reset(&timer); timer_start(&timer); if (var == 0) transpose1(dst, src, n); else transpose2(dst, src, n); timer_stop(&timer); timer_print(&timer); free(src); free(dst); return 0; }
void rotate (void *iadr, XLONG **oadr, int type, int nx, int ny, int dir) { int nelem; static int first_time = 1, sv_nx=0, sv_ny=0;; static ulong *bufl = (ulong *) NULL; static ushort *bufs = (ushort *) NULL; static uchar *bufc = (uchar *) NULL; if ((nx*ny) != (sv_nx*sv_ny)) { if (type == 1 && bufc) free ((uchar *)bufc); if (type == 2 && bufs) free ((ushort *)bufs); if (type == 4 && bufl) free ((ulong *)bufl); sv_nx = nx; sv_ny = ny; first_time = 1; } nelem = nx * ny; switch (type) { case (1): /* uchar */ ubip = (uchar *) iadr; if (first_time) { ubop = bufc = (uchar *) calloc (1, nelem * sizeof(uchar)); *oadr = (XLONG *) ubop; first_time = 0; } else { ubop = (uchar *)bufc; *oadr = (XLONG *) bufc; } break; case (2): /* ushort */ usip = (ushort *) iadr; if (first_time) { usop = bufs = (ushort *) calloc (1, nelem * sizeof(ushort)); *oadr = (XLONG *) usop; first_time = 0; } else { usop = (ushort *)bufs; *oadr = (XLONG *) bufs; } break; case (4): /* ulong */ ulip = (ulong *) iadr; if (first_time) { ulop = bufl = (ulong *) calloc (1, nelem * sizeof(ulong)); *oadr = (XLONG *) ulop; first_time = 0; } else { ulop = (ulong *)bufl; *oadr = (XLONG *) bufl; } break; default: ; break; } switch (dir) { case (1): /* flip x axis */ flipx(type, nx, ny); break; case (2): /* flip y axis */ flipy(type, nx, ny); break; case (3): /* transpose 1st diag */ transpose1(type, nx, ny); break; case (4): /* transpose 2nd diag */ transpose2(type, nx, ny); break; default: break; } }