コード例 #1
0
ファイル: transpose.c プロジェクト: Nerd911/University
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;
}
コード例 #2
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;
    }
}