void ixmp_smumps_c(ixmp_smumps_struc_c *id){ int irn_size; int jcn_size; int a_size; void *jcn_laddr; void *irn_laddr; void *a_laddr; int ierr; if((id->mumps_par.icntl[17]==2 || id->mumps_par.icntl[17]==3) && (id->mumps_par.job==1 || id->mumps_par.job==2 || id->mumps_par.job==4 || id->mumps_par.job==5 || id->mumps_par.job==6)){ ierr = xmp_array_lsize(id->idesc,1,&irn_size); ierr = xmp_array_lsize(id->jdesc,1,&jcn_size); ierr = xmp_array_lsize(id->adesc,1,&a_size); if (irn_size == jcn_size && jcn_size == a_size) { id->mumps_par.nz_loc=irn_size; }else{ exit(1); } ierr=xmp_array_laddr(id->idesc, &irn_laddr); ierr=xmp_array_laddr(id->jdesc, &jcn_laddr); ierr=xmp_array_laddr(id->adesc, &a_laddr); id->mumps_par.irn_loc = (void *)irn_laddr; id->mumps_par.jcn_loc = (void *)jcn_laddr; id->mumps_par.a_loc = (void *)a_laddr; } smumps_c(&(id->mumps_par)); }
int xmp_array_lsize_(xmp_desc_t **d, int *dim, int *lsize){ return xmp_array_lsize(*d, *dim, lsize); }
int main(void) { int const n = 16; #pragma xmp template t[n][n] #pragma xmp distribute t[block][block] onto p int a[n][n]; #pragma xmp align a[j][i] with t[j][i] #pragma xmp shadow a[1][1] int *laddr_a, lsize1_a, lsize2_a; xmp_array_laddr(xmp_desc_of(a), (void **)&laddr_a); xmp_array_lsize(xmp_desc_of(a), 1, &lsize1_a); //includes shadow xmp_array_lsize(xmp_desc_of(a), 2, &lsize2_a); //includes shadow for(int i = 0; i < lsize1_a; i++){ for(int j = 0; j < lsize2_a; j++){ laddr_a[i * lsize2_a + j] = -1; } } #pragma xmp loop on t[j][i] for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ a[i][j] = 1; } } #pragma xmp reflect(a) int err = 0; #pragma xmp task on p[0][0] { for(int i = 0; i < lsize1_a; i++){ for(int j = 0; j < lsize2_a; j++){ int v = laddr_a[i * lsize2_a + j]; if(i >= 1 && j >= 1){ if(v != 1) err++; }else{ if(v != -1) err++; } } } } #pragma xmp task on p[0][1] { for(int i = 0; i < lsize1_a; i++){ for(int j = 0; j < lsize2_a; j++){ int v = laddr_a[i * lsize2_a + j]; if(i >= 1 && j <= lsize2_a-2){ if(v != 1) err++; }else{ if(v != -1) err++; } } } } #pragma xmp task on p[1][0] { for(int i = 0; i < lsize1_a; i++){ for(int j = 0; j < lsize2_a; j++){ int v = laddr_a[i * lsize2_a + j]; if(i <= lsize1_a-2 && j >= 1){ if(v != 1) err++; }else{ if(v != -1) err++; } } } } #pragma xmp task on p[1][1] { for(int i = 0; i < lsize1_a; i++){ for(int j = 0; j < lsize2_a; j++){ int v = laddr_a[i * lsize2_a + j]; if(i <= lsize1_a-2 && j <= lsize2_a-2){ if(v != 1) err++; }else{ if(v != -1) err++; } } } } #pragma xmp reduction(+:err) if(err > 0) return 1; #pragma xmp task on p[0][0] printf("PASS\n"); return 0; }