From 69f2911e04ffb1b19eef1fafb8c040af271f656e Mon Sep 17 00:00:00 2001 From: Tor Aamodt Date: Thu, 15 Jul 2010 18:09:46 -0800 Subject: creating branch for adding support for CUDA 3.x and Fermi [git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 6829] --- .../ParMetis-3.1/ParMETISLib/balancemylink.c | 342 +++++++++++++++++++++ 1 file changed, 342 insertions(+) create mode 100644 benchmarks/CUDA/DG/3rdParty/ParMetis-3.1/ParMETISLib/balancemylink.c (limited to 'benchmarks/CUDA/DG/3rdParty/ParMetis-3.1/ParMETISLib/balancemylink.c') diff --git a/benchmarks/CUDA/DG/3rdParty/ParMetis-3.1/ParMETISLib/balancemylink.c b/benchmarks/CUDA/DG/3rdParty/ParMetis-3.1/ParMETISLib/balancemylink.c new file mode 100644 index 0000000..dd944d1 --- /dev/null +++ b/benchmarks/CUDA/DG/3rdParty/ParMetis-3.1/ParMETISLib/balancemylink.c @@ -0,0 +1,342 @@ +/* + * Copyright 1997, Regents of the University of Minnesota + * + * balancemylink.c + * + * This file contains code that implements the edge-based FM refinement + * + * Started 7/23/97 + * George + * + * $Id: balancemylink.c,v 1.2 2003/07/21 17:18:48 karypis Exp $ + */ + +#include +#define PE 0 + +/************************************************************************* +* This function performs an edge-based FM refinement +**************************************************************************/ +int BalanceMyLink(CtrlType *ctrl, GraphType *graph, idxtype *home, int me, + int you, float *flows, float maxdiff, float *diff_cost, float *diff_lbavg, + float avgvwgt) +{ + int h, i, ii, j, k; + int nvtxs, ncon; + int nqueues, minval, maxval, higain, vtx, edge, totalv; + int from, to, qnum, index, nchanges, cut, tmp; + int pass, nswaps, nmoves, multiplier; + idxtype *xadj, *vsize, *adjncy, *adjwgt, *where, *ed, *id; + idxtype *hval, *nvpq, *inq, *map, *rmap, *ptr, *myqueue, *changes; + float *nvwgt, lbvec[MAXNCON], pwgts[MAXNCON*2], tpwgts[MAXNCON*2], my_wgt[MAXNCON]; + float newgain, oldgain = 0.0; + float lbavg, bestflow, mycost; + float ipc_factor, redist_factor, ftmp; + FPQueueType *queues; +int mype; +MPI_Comm_rank(MPI_COMM_WORLD, &mype); + + nvtxs = graph->nvtxs; + ncon = graph->ncon; + xadj = graph->xadj; + nvwgt = graph->nvwgt; + vsize = graph->vsize; + adjncy = graph->adjncy; + adjwgt = graph->adjwgt; + where = graph->where; + ipc_factor = ctrl->ipc_factor; + redist_factor = ctrl->redist_factor; + + hval = idxmalloc(nvtxs*7, "hval"); + id = hval + nvtxs; + ed = hval + nvtxs*2; + map = hval + nvtxs*3; + rmap = hval + nvtxs*4; + myqueue = hval + nvtxs*5; + changes = hval + nvtxs*6; + + sset(ncon*2, 0.0, pwgts); + for (h=0; h0; i--) + ptr[i] = ptr[i-1]; + ptr[0] = 0; + + /* initialize queues */ + for (i=0; i 0) { + FPQueueInit(queues+i, nvpq[i]); + FPQueueInit(queues+i+nqueues, nvpq[i]); + } + + /* compute internal/external degrees */ + idxset(nvtxs, 0, id); + idxset(nvtxs, 0, ed); + for (j=0; j fabs(flows[j])) j = h; + bestflow = fabs(flows[j]); + + nchanges = nmoves = 0; + for (ii=0; ii avgvwgt) + break; + } + else { + for (j=0; j fabs(flows[j])) j = h; + ftmp = fabs(flows[j]); + + if (ftmp < bestflow) { + bestflow = ftmp; + nchanges = 0; + } + else { + changes[nchanges++] = vtx; + } + + SWAP(id[vtx], ed[vtx], tmp); + + for (j=xadj[vtx]; j 0) { + FPQueueReset(queues+i); + FPQueueReset(queues+i+nqueues); + } + } + + if (nmoves == 0) + break; + } + + /***************************/ + /* compute 2-way imbalance */ + /***************************/ + sset(ncon, 0.0, my_wgt); + for (i=0; i 0) { + FPQueueFree(queues+i); + FPQueueFree(queues+i+nqueues); + } + + GKfree((void **)&hval, (void **)&nvpq, (void **)&ptr, (void **)&inq, (void **)&queues, LTERM); + return nswaps; +} + -- cgit v1.3