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

}
示例#2
0
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;
}