00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <parmetislib.h>
00012
00013
00014
00015
00016
00017
00018 void CommInterfaceData(CtrlType *ctrl, GraphType *graph, idxtype *data,
00019 idxtype *sendvector, idxtype *recvvector)
00020 {
00021 int i, k, nnbrs, firstvtx;
00022 idxtype *peind, *sendptr, *sendind, *recvptr, *recvind;
00023
00024 firstvtx = graph->vtxdist[ctrl->mype];
00025 nnbrs = graph->nnbrs;
00026 peind = graph->peind;
00027 sendptr = graph->sendptr;
00028 sendind = graph->sendind;
00029 recvptr = graph->recvptr;
00030 recvind = graph->recvind;
00031
00032
00033 for (i=0; i<nnbrs; i++) {
00034 MPI_Irecv((void *)(recvvector+recvptr[i]), recvptr[i+1]-recvptr[i], IDX_DATATYPE,
00035 peind[i], 1, ctrl->comm, ctrl->rreq+i);
00036 }
00037
00038
00039 k = sendptr[nnbrs];
00040 for (i=0; i<k; i++)
00041 sendvector[i] = data[sendind[i]-firstvtx];
00042
00043 for (i=0; i<nnbrs; i++) {
00044 MPI_Isend((void *)(sendvector+sendptr[i]), sendptr[i+1]-sendptr[i], IDX_DATATYPE,
00045 peind[i], 1, ctrl->comm, ctrl->sreq+i);
00046 }
00047
00048
00049 MPI_Waitall(nnbrs, ctrl->rreq, ctrl->statuses);
00050 MPI_Waitall(nnbrs, ctrl->sreq, ctrl->statuses);
00051
00052 }
00053
00054
00055
00056
00057
00058
00059 void CommChangedInterfaceData(CtrlType *ctrl, GraphType *graph,
00060 int nchanged, idxtype *changed, idxtype *data,
00061 KeyValueType *sendpairs, KeyValueType *recvpairs, idxtype *psendptr)
00062 {
00063 int i, j, k, n, penum, nnbrs, firstvtx, nrecv;
00064 idxtype *peind, *sendptr, *recvptr, *recvind, *pexadj, *peadjncy, *peadjloc;
00065 KeyValueType *pairs;
00066
00067 firstvtx = graph->vtxdist[ctrl->mype];
00068 nnbrs = graph->nnbrs;
00069 nrecv = graph->nrecv;
00070 peind = graph->peind;
00071 sendptr = graph->sendptr;
00072 recvptr = graph->recvptr;
00073 recvind = graph->recvind;
00074 pexadj = graph->pexadj;
00075 peadjncy = graph->peadjncy;
00076 peadjloc = graph->peadjloc;
00077
00078
00079 for (i=0; i<nnbrs; i++) {
00080 MPI_Irecv((void *)(recvpairs+recvptr[i]), 2*(recvptr[i+1]-recvptr[i]), IDX_DATATYPE,
00081 peind[i], 1, ctrl->comm, ctrl->rreq+i);
00082 }
00083
00084 if (nchanged != 0) {
00085 idxcopy(ctrl->npes, sendptr, psendptr);
00086
00087
00088 for (i=0; i<nchanged; i++) {
00089 j = changed[i];
00090 for (k=pexadj[j]; k<pexadj[j+1]; k++) {
00091 penum = peadjncy[k];
00092 sendpairs[psendptr[penum]].key = peadjloc[k];
00093 sendpairs[psendptr[penum]].val = data[j];
00094 psendptr[penum]++;
00095 }
00096 }
00097
00098 for (i=0; i<nnbrs; i++) {
00099 MPI_Isend((void *)(sendpairs+sendptr[i]), 2*(psendptr[i]-sendptr[i]), IDX_DATATYPE,
00100 peind[i], 1, ctrl->comm, ctrl->sreq+i);
00101 }
00102 }
00103 else {
00104 for (i=0; i<nnbrs; i++)
00105 MPI_Isend((void *)(sendpairs), 0, IDX_DATATYPE, peind[i], 1, ctrl->comm, ctrl->sreq+i);
00106 }
00107
00108
00109 for (i=0; i<nnbrs; i++) {
00110 MPI_Wait(ctrl->rreq+i, &(ctrl->status));
00111 MPI_Get_count(&ctrl->status, IDX_DATATYPE, &n);
00112 if (n != 0) {
00113 n = n/2;
00114 pairs = recvpairs+graph->recvptr[i];
00115 for (k=0; k<n; k++)
00116 data[pairs[k].key] = pairs[k].val;
00117 }
00118 }
00119
00120 MPI_Waitall(nnbrs, ctrl->sreq, ctrl->statuses);
00121 }
00122
00123
00124
00125
00126
00127
00128 int GlobalSEMax(CtrlType *ctrl, int value)
00129 {
00130 int max;
00131
00132 MPI_Allreduce((void *)&value, (void *)&max, 1, MPI_INT, MPI_MAX, ctrl->comm);
00133
00134 return max;
00135 }
00136
00137
00138
00139
00140 double GlobalSEMaxDouble(CtrlType *ctrl, double value)
00141 {
00142 double max;
00143
00144 MPI_Allreduce((void *)&value, (void *)&max, 1, MPI_DOUBLE, MPI_MAX, ctrl->comm);
00145
00146 return max;
00147 }
00148
00149
00150
00151
00152
00153
00154 int GlobalSEMin(CtrlType *ctrl, int value)
00155 {
00156 int min;
00157
00158 MPI_Allreduce((void *)&value, (void *)&min, 1, MPI_INT, MPI_MIN, ctrl->comm);
00159
00160 return min;
00161 }
00162
00163
00164
00165
00166 int GlobalSESum(CtrlType *ctrl, int value)
00167 {
00168 int sum;
00169
00170 MPI_Allreduce((void *)&value, (void *)&sum, 1, MPI_INT, MPI_SUM, ctrl->comm);
00171
00172 return sum;
00173 }
00174
00175
00176
00177
00178
00179 floattype GlobalSEMaxFloat(CtrlType *ctrl, floattype value)
00180 {
00181 floattype max;
00182
00183 MPI_Allreduce((void *)&value, (void *)&max, 1, MPI_DOUBLE, MPI_MAX, ctrl->comm);
00184
00185 return max;
00186 }
00187
00188
00189
00190
00191
00192
00193 floattype GlobalSEMinFloat(CtrlType *ctrl, floattype value)
00194 {
00195 floattype min;
00196
00197 MPI_Allreduce((void *)&value, (void *)&min, 1, MPI_DOUBLE, MPI_MIN, ctrl->comm);
00198
00199 return min;
00200 }
00201
00202
00203
00204
00205 floattype GlobalSESumFloat(CtrlType *ctrl, floattype value)
00206 {
00207 floattype sum;
00208
00209 MPI_Allreduce((void *)&value, (void *)&sum, 1, MPI_DOUBLE, MPI_SUM, ctrl->comm);
00210
00211 return sum;
00212 }
00213