Esempio n. 1
0
int test_trsm_lower_right (int m, int n, int offset, const char *description){
  printf("lower_right: %s  m: %4d n: %4d offset: %4d ... ",description, m, n, offset);
  mzd_t* Lbase = mzd_init (2048,2048);
  mzd_t* Bbase = mzd_init (2048,2048);
  mzd_randomize (Lbase);
  mzd_randomize (Bbase);
  mzd_t* Bbasecopy = mzd_copy (NULL, Bbase);

  mzd_t* L = mzd_init_window (Lbase, 0, offset, n, offset + n);
  mzd_t* B = mzd_init_window (Bbase, 0, offset, m, offset + n);
  mzd_t* W = mzd_copy (NULL, B);

  size_t i,j;
  for (i=0; i<n; ++i){
    for (j=i+1; j<n;++j)
      mzd_write_bit(L,i,j, 0);
    mzd_write_bit(L,i,i, 1);
  }
  mzd_trsm_lower_right (L, B, 2048);

  mzd_addmul(W, B, L, 2048);

  int status = 0;
  for ( i=0; i<m; ++i)
    for ( j=0; j<n; ++j){
      if (mzd_read_bit (W,i,j)){
	status = 1;
      }
    }

  // Verifiying that nothing has been changed around the submatrices
  mzd_addmul(W, B, L, 2048);
  mzd_copy (B, W);

  for ( i=0; i<2048; ++i)
    for ( j=0; j<2048/RADIX; ++j){
      if (Bbase->rows[i][j] != Bbasecopy->rows[i][j]){
	status = 1;
      }
    }
  mzd_free_window (L);
  mzd_free_window (B);
  mzd_free (W);
  mzd_free(Lbase);
  mzd_free(Bbase);
  mzd_free(Bbasecopy);

  if (!status)
    printf("passed\n");
  else
    printf("FAILED\n");
  return status;
}
int run(void *_p, unsigned long long *data, int *data_len) {
  struct trsm_params *p = (struct trsm_params *)_p;
  *data_len = 2;

  mzd_t *B = mzd_init(p->m, p->n);
  mzd_t *L = mzd_init(p->n, p->n);
  mzd_randomize(B);
  mzd_randomize(L);
  for (rci_t i = 0; i < p->n; ++i){
    for (rci_t j = i + 1; j < p->n; ++j)
      mzd_write_bit(L,i,j, 0);
    mzd_write_bit(L,i,i, 1);
  }

  data[0] = walltime(0);
  data[1] = cpucycles();
  mzd_trsm_lower_right(L, B, 2048);
  data[0] = walltime(data[0]);
  data[1] = cpucycles() - data[1];

  mzd_free(B);
  mzd_free(L);
  return 0;
}