ascat.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 static char const Id[] = "$Id: ascat.c 2681 2009-07-31 04:30:53Z scholz $\n\n";
00025 static char const Td[] = "$Today: " __FILE__ " " __DATE__ " " __TIME__ " $\n\n";
00026
00027 #include "util.h"
00028
00029
00030 int ascat(int **aindata,int n_items,int s_item,int *newproc,int insize,int send)
00031 {
00032 MagparFunctionInfoBegin;
00033
00034 int rank,size;
00035 ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
00036 ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
00037
00038 assert(insize>=1);
00039
00040
00041
00042
00043 if (!rank) {
00044 assert(n_items>0);
00045 }
00046 else {
00047 assert(n_items==0);
00048 }
00049
00050 int *ta_n_items;
00051 ierr = PetscMalloc(insize*sizeof(int),&ta_n_items);CHKERRQ(ierr);
00052
00053 int *ta_cnt;
00054 ierr = PetscMalloc(insize*sizeof(int),&ta_cnt);CHKERRQ(ierr);
00055
00056 int *ta_getn_items;
00057 ierr = PetscMalloc(insize*sizeof(int),&ta_getn_items);CHKERRQ(ierr);
00058
00059 int **ta_procdata;
00060 ierr = PetscMalloc(insize*sizeof(int*),&ta_procdata);CHKERRQ(ierr);
00061
00062 int *indata;
00063 indata=*aindata;
00064
00065
00066
00067
00068 int *t_data;
00069 ierr = PetscMalloc(n_items*s_item*sizeof(int)+1,&t_data);CHKERRQ(ierr);
00070
00071
00072 for (int i=0; i<insize; i++)
00073 {
00074 ta_n_items[i]=0;
00075 ta_cnt[i]=0;
00076 }
00077
00078
00079 for (int i=0; i<n_items; i++)
00080 {
00081 assert(newproc[i]>=0 && newproc[i]<insize);
00082 ta_n_items[newproc[i]]++;
00083 }
00084
00085
00086 ta_procdata[0]=t_data;
00087 for (int i=1; i<insize; i++)
00088 {
00089 ta_procdata[i] = ta_procdata[i-1] + s_item*ta_n_items[i-1];
00090 }
00091
00092
00093 assert(ta_procdata[insize-1]+s_item*ta_n_items[insize-1]==t_data+n_items*s_item);
00094
00095
00096
00097 for (int i=0; i<n_items; i++)
00098 {
00099 for (int j=0; j<s_item; j++)
00100 {
00101 *(ta_procdata[newproc[i]]+ta_cnt[newproc[i]]*s_item+j)=indata[i*s_item+j];
00102 }
00103 ta_cnt[newproc[i]]++;
00104 }
00105
00106 if (!send) {
00107 ierr = PetscFree(*aindata);CHKERRQ(ierr);
00108 *aindata=t_data;
00109
00110 ierr = PetscFree(ta_procdata);CHKERRQ(ierr);
00111 ierr = PetscFree(ta_n_items);CHKERRQ(ierr);
00112 ierr = PetscFree(ta_cnt);CHKERRQ(ierr);
00113 ierr = PetscFree(ta_getn_items);CHKERRQ(ierr);
00114
00115 MagparFunctionInfoReturn(0);
00116 }
00117
00118
00119 int t_gettot=0;
00120 for (int i=0; i < insize-1; i++) {
00121 int pto,pfrom;
00122 pto = (rank+i+1+insize) % insize;
00123 pfrom = (rank-i-1+insize) % insize;
00124
00125 #ifndef UNIPROC
00126 MPI_Status status;
00127 MPI_Sendrecv(&ta_n_items[pto],1,MPI_INT,pto,0,
00128 &ta_getn_items[pfrom],1,MPI_INT,pfrom,0,PETSC_COMM_WORLD,&status);
00129 #endif
00130
00131 t_gettot += ta_getn_items[pfrom];
00132 }
00133
00134
00135
00136
00137 int *t_fdata;
00138 ierr = PetscMalloc(s_item*(t_gettot+ta_n_items[rank])*sizeof(int)+1,&t_fdata);CHKERRQ(ierr);
00139
00140 ta_procdata[rank]=t_fdata;
00141
00142
00143 for (int i=0; i<n_items; i++)
00144 {
00145
00146 assert(rank==0);
00147 if (newproc[i]==rank) {
00148 for (int j=0; j<s_item; j++)
00149 {
00150 *ta_procdata[rank]=indata[i*s_item+j];
00151 ta_procdata[rank]++;
00152 }
00153 }
00154 }
00155
00156
00157 assert(ta_procdata[rank]-t_fdata==s_item*ta_n_items[rank]);
00158
00159
00160 for (int i=0; i < insize-1; i++) {
00161 int pto,pfrom;
00162 pto = (rank+i+1+insize) % insize;
00163 pfrom = (rank-i-1+insize) % insize;
00164
00165 #ifndef UNIPROC
00166 MPI_Status status;
00167 MPI_Sendrecv(ta_procdata[pto],s_item*ta_n_items[pto],MPI_INT,pto,1,
00168 ta_procdata[rank],s_item*ta_getn_items[pfrom],MPI_INT,pfrom,1,PETSC_COMM_WORLD,&status);
00169 #endif
00170
00171 ta_procdata[rank] += s_item*ta_getn_items[pfrom];
00172 }
00173
00174
00175 assert(ta_procdata[rank]-t_fdata==s_item*(t_gettot+ta_n_items[rank]));
00176
00177 ierr = PetscFree(t_data);CHKERRQ(ierr);
00178 if (n_items>0) {
00179 ierr = PetscFree(*aindata);CHKERRQ(ierr);
00180 }
00181 *aindata=t_fdata;
00182
00183 t_gettot += ta_n_items[rank];
00184
00185 ierr = PetscFree(ta_procdata);CHKERRQ(ierr);
00186 ierr = PetscFree(ta_n_items);CHKERRQ(ierr);
00187 ierr = PetscFree(ta_cnt);CHKERRQ(ierr);
00188 ierr = PetscFree(ta_getn_items);CHKERRQ(ierr);
00189
00190 MagparFunctionInfoReturn(t_gettot);
00191 }
00192