aboutsummaryrefslogtreecommitdiff
path: root/benchmarks/CUDA/DG/3rdParty/ParMetis-3.1/ParMETISLib/comm.c
diff options
context:
space:
mode:
authorTor Aamodt <[email protected]>2010-07-15 18:09:46 -0800
committerTor Aamodt <[email protected]>2010-07-15 18:09:46 -0800
commit69f2911e04ffb1b19eef1fafb8c040af271f656e (patch)
tree231d3b6bdc3a202f7c255bfcf7bf2c36e32cee9e /benchmarks/CUDA/DG/3rdParty/ParMetis-3.1/ParMETISLib/comm.c
creating branch for adding support for CUDA 3.x and Fermi
[git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 6829]
Diffstat (limited to 'benchmarks/CUDA/DG/3rdParty/ParMetis-3.1/ParMETISLib/comm.c')
-rw-r--r--benchmarks/CUDA/DG/3rdParty/ParMetis-3.1/ParMETISLib/comm.c213
1 files changed, 213 insertions, 0 deletions
diff --git a/benchmarks/CUDA/DG/3rdParty/ParMetis-3.1/ParMETISLib/comm.c b/benchmarks/CUDA/DG/3rdParty/ParMetis-3.1/ParMETISLib/comm.c
new file mode 100644
index 0000000..fb18789
--- /dev/null
+++ b/benchmarks/CUDA/DG/3rdParty/ParMetis-3.1/ParMETISLib/comm.c
@@ -0,0 +1,213 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * comm.c
+ *
+ * This function provides various high level communication functions
+ *
+ * $Id: comm.c,v 1.2 2003/07/21 17:18:48 karypis Exp $
+ */
+
+#include <parmetislib.h>
+
+
+
+/*************************************************************************
+* This function performs the gather/scatter for the boundary vertices
+**************************************************************************/
+void CommInterfaceData(CtrlType *ctrl, GraphType *graph, idxtype *data,
+ idxtype *sendvector, idxtype *recvvector)
+{
+ int i, k, nnbrs, firstvtx;
+ idxtype *peind, *sendptr, *sendind, *recvptr, *recvind;
+
+ firstvtx = graph->vtxdist[ctrl->mype];
+ nnbrs = graph->nnbrs;
+ peind = graph->peind;
+ sendptr = graph->sendptr;
+ sendind = graph->sendind;
+ recvptr = graph->recvptr;
+ recvind = graph->recvind;
+
+ /* Issue the receives first */
+ for (i=0; i<nnbrs; i++) {
+ MPI_Irecv((void *)(recvvector+recvptr[i]), recvptr[i+1]-recvptr[i], IDX_DATATYPE,
+ peind[i], 1, ctrl->comm, ctrl->rreq+i);
+ }
+
+ /* Issue the sends next */
+ k = sendptr[nnbrs];
+ for (i=0; i<k; i++)
+ sendvector[i] = data[sendind[i]-firstvtx];
+
+ for (i=0; i<nnbrs; i++) {
+ MPI_Isend((void *)(sendvector+sendptr[i]), sendptr[i+1]-sendptr[i], IDX_DATATYPE,
+ peind[i], 1, ctrl->comm, ctrl->sreq+i);
+ }
+
+ /* OK, now get into the loop waiting for the operations to finish */
+ MPI_Waitall(nnbrs, ctrl->rreq, ctrl->statuses);
+ MPI_Waitall(nnbrs, ctrl->sreq, ctrl->statuses);
+
+}
+
+
+
+/*************************************************************************
+* This function performs the gather/scatter for the boundary vertices
+**************************************************************************/
+void CommChangedInterfaceData(CtrlType *ctrl, GraphType *graph,
+ int nchanged, idxtype *changed, idxtype *data,
+ KeyValueType *sendpairs, KeyValueType *recvpairs, idxtype *psendptr)
+{
+ int i, j, k, n, penum, nnbrs, firstvtx, nrecv;
+ idxtype *peind, *sendptr, *recvptr, *recvind, *pexadj, *peadjncy, *peadjloc;
+ KeyValueType *pairs;
+
+ firstvtx = graph->vtxdist[ctrl->mype];
+ nnbrs = graph->nnbrs;
+ nrecv = graph->nrecv;
+ peind = graph->peind;
+ sendptr = graph->sendptr;
+ recvptr = graph->recvptr;
+ recvind = graph->recvind;
+ pexadj = graph->pexadj;
+ peadjncy = graph->peadjncy;
+ peadjloc = graph->peadjloc;
+
+ /* Issue the receives first */
+ for (i=0; i<nnbrs; i++) {
+ MPI_Irecv((void *)(recvpairs+recvptr[i]), 2*(recvptr[i+1]-recvptr[i]), IDX_DATATYPE,
+ peind[i], 1, ctrl->comm, ctrl->rreq+i);
+ }
+
+ if (nchanged != 0) {
+ idxcopy(ctrl->npes, sendptr, psendptr);
+
+ /* Copy the changed values into the sendvector */
+ for (i=0; i<nchanged; i++) {
+ j = changed[i];
+ for (k=pexadj[j]; k<pexadj[j+1]; k++) {
+ penum = peadjncy[k];
+ sendpairs[psendptr[penum]].key = peadjloc[k];
+ sendpairs[psendptr[penum]].val = data[j];
+ psendptr[penum]++;
+ }
+ }
+
+ for (i=0; i<nnbrs; i++) {
+ MPI_Isend((void *)(sendpairs+sendptr[i]), 2*(psendptr[i]-sendptr[i]), IDX_DATATYPE,
+ peind[i], 1, ctrl->comm, ctrl->sreq+i);
+ }
+ }
+ else {
+ for (i=0; i<nnbrs; i++)
+ MPI_Isend((void *)(sendpairs), 0, IDX_DATATYPE, peind[i], 1, ctrl->comm, ctrl->sreq+i);
+ }
+
+ /* OK, now get into the loop waiting for the operations to finish */
+ for (i=0; i<nnbrs; i++) {
+ MPI_Wait(ctrl->rreq+i, &(ctrl->status));
+ MPI_Get_count(&ctrl->status, IDX_DATATYPE, &n);
+ if (n != 0) {
+ n = n/2;
+ pairs = recvpairs+graph->recvptr[i];
+ for (k=0; k<n; k++)
+ data[pairs[k].key] = pairs[k].val;
+ }
+ }
+
+ MPI_Waitall(nnbrs, ctrl->sreq, ctrl->statuses);
+}
+
+
+
+/*************************************************************************
+* This function computes the max of a single element
+**************************************************************************/
+int GlobalSEMax(CtrlType *ctrl, int value)
+{
+ int max;
+
+ MPI_Allreduce((void *)&value, (void *)&max, 1, MPI_INT, MPI_MAX, ctrl->comm);
+
+ return max;
+}
+
+/*************************************************************************
+* This function computes the max of a single element
+**************************************************************************/
+double GlobalSEMaxDouble(CtrlType *ctrl, double value)
+{
+ double max;
+
+ MPI_Allreduce((void *)&value, (void *)&max, 1, MPI_DOUBLE, MPI_MAX, ctrl->comm);
+
+ return max;
+}
+
+
+
+/*************************************************************************
+* This function computes the max of a single element
+**************************************************************************/
+int GlobalSEMin(CtrlType *ctrl, int value)
+{
+ int min;
+
+ MPI_Allreduce((void *)&value, (void *)&min, 1, MPI_INT, MPI_MIN, ctrl->comm);
+
+ return min;
+}
+
+/*************************************************************************
+* This function computes the max of a single element
+**************************************************************************/
+int GlobalSESum(CtrlType *ctrl, int value)
+{
+ int sum;
+
+ MPI_Allreduce((void *)&value, (void *)&sum, 1, MPI_INT, MPI_SUM, ctrl->comm);
+
+ return sum;
+}
+
+
+/*************************************************************************
+* This function computes the max of a single element
+**************************************************************************/
+float GlobalSEMaxFloat(CtrlType *ctrl, float value)
+{
+ float max;
+
+ MPI_Allreduce((void *)&value, (void *)&max, 1, MPI_FLOAT, MPI_MAX, ctrl->comm);
+
+ return max;
+}
+
+
+
+/*************************************************************************
+* This function computes the max of a single element
+**************************************************************************/
+float GlobalSEMinFloat(CtrlType *ctrl, float value)
+{
+ float min;
+
+ MPI_Allreduce((void *)&value, (void *)&min, 1, MPI_FLOAT, MPI_MIN, ctrl->comm);
+
+ return min;
+}
+
+/*************************************************************************
+* This function computes the max of a single element
+**************************************************************************/
+float GlobalSESumFloat(CtrlType *ctrl, float value)
+{
+ float sum;
+
+ MPI_Allreduce((void *)&value, (void *)&sum, 1, MPI_FLOAT, MPI_SUM, ctrl->comm);
+
+ return sum;
+}
+