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; }