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] --- .../DG/3rdParty/ParMetis-3.1/ParMETISLib/util.c | 983 +++++++++++++++++++++ 1 file changed, 983 insertions(+) create mode 100644 benchmarks/CUDA/DG/3rdParty/ParMetis-3.1/ParMETISLib/util.c (limited to 'benchmarks/CUDA/DG/3rdParty/ParMetis-3.1/ParMETISLib/util.c') diff --git a/benchmarks/CUDA/DG/3rdParty/ParMetis-3.1/ParMETISLib/util.c b/benchmarks/CUDA/DG/3rdParty/ParMetis-3.1/ParMETISLib/util.c new file mode 100644 index 0000000..34c657d --- /dev/null +++ b/benchmarks/CUDA/DG/3rdParty/ParMetis-3.1/ParMETISLib/util.c @@ -0,0 +1,983 @@ +/* + * Copyright 1997, Regents of the University of Minnesota + * + * util.c + * + * This function contains various utility routines + * + * Started 9/28/95 + * George + * + * $Id: util.c,v 1.2 2003/07/21 17:18:54 karypis Exp $ + */ + +#include + + +/************************************************************************* +* This function prints an error message and exits +**************************************************************************/ +void errexit(char *f_str,...) +{ + va_list argp; + char out1[256], out2[256]; + + va_start(argp, f_str); + vsprintf(out1, f_str, argp); + va_end(argp); + + sprintf(out2, "Error! %s", out1); + + fprintf(stdout, out2); + fflush(stdout); + + abort(); +} + + +/************************************************************************* +* This function prints an error message and exits +**************************************************************************/ +void myprintf(CtrlType *ctrl, char *f_str,...) +{ + va_list argp; + char out1[256], out2[256]; + + va_start(argp, f_str); + vsprintf(out1, f_str, argp); + va_end(argp); + + sprintf(out2, "[%2d] %s", ctrl->mype, out1); + + fprintf(stdout, out2); + fflush(stdout); + +} + + + +/************************************************************************* +* This function prints an error message and exits +**************************************************************************/ +void rprintf(CtrlType *ctrl, char *f_str,...) +{ + va_list argp; + + if (ctrl->mype == 0) { + va_start(argp, f_str); + vfprintf(stdout, f_str, argp); + va_end(argp); + } + + fflush(stdout); + + MPI_Barrier(ctrl->comm); + +} + + +#ifndef DMALLOC +/************************************************************************* +* The following function allocates an array of integers +**************************************************************************/ +int *imalloc(int n, char *msg) +{ + if (n == 0) + return NULL; + + return (int *)GKmalloc(sizeof(int)*n, msg); +} + + +/************************************************************************* +* The following function allocates an array of integers +**************************************************************************/ +idxtype *idxmalloc(int n, char *msg) +{ + if (n == 0) + return NULL; + + return (idxtype *)GKmalloc(sizeof(idxtype)*n, msg); +} + + +/************************************************************************* +* The following function allocates an array of float +**************************************************************************/ +float *fmalloc(int n, char *msg) +{ + if (n == 0) + return NULL; + + return (float *)GKmalloc(sizeof(float)*n, msg); +} + + +/************************************************************************* +* The follwoing function allocates an array of integers +**************************************************************************/ +int *ismalloc(int n, int ival, char *msg) +{ + if (n == 0) + return NULL; + + return iset(n, ival, (int *)GKmalloc(sizeof(int)*n, msg)); +} + + + +/************************************************************************* +* The follwoing function allocates an array of integers +**************************************************************************/ +idxtype *idxsmalloc(int n, idxtype ival, char *msg) +{ + if (n == 0) + return NULL; + + return idxset(n, ival, (idxtype *)GKmalloc(sizeof(idxtype)*n, msg)); +} + + +/************************************************************************* +* This function is my wrapper around malloc +**************************************************************************/ +void *GKmalloc(int nbytes, char *msg) +{ + void *ptr; + + if (nbytes == 0) + return NULL; + + ptr = (void *)malloc(nbytes); + if (ptr == NULL) + errexit("***Memory allocation failed for %s. Requested size: %d bytes", msg, nbytes); + + return ptr; +} +#endif + +/************************************************************************* +* This function is my wrapper around free, allows multiple pointers +**************************************************************************/ +void GKfree(void **ptr1,...) +{ + va_list plist; + void **ptr; + + if (*ptr1 != NULL) + free(*ptr1); + *ptr1 = NULL; + + va_start(plist, ptr1); + + while ((ptr = va_arg(plist, void **)) != LTERM) { + if (*ptr != NULL) + free(*ptr); + *ptr = NULL; + } + + va_end(plist); +} + + +/************************************************************************* +* These functions set the values of a vector +**************************************************************************/ +int *iset(int n, int val, int *x) +{ + int i; + + for (i=0; i x[max] ? i : max); + + return max; +} + + +/************************************************************************* +* These functions return the index of the minimum element in a vector +**************************************************************************/ +int idxamin(int n, idxtype *x) +{ + int i, min=0; + + for (i=1; ikey != n2->key ? n1->key - n2->key : n1->val - n2->val); +} + + + +/************************************************************************* +* This function sorts an array of type KeyValueType in increasing order +**************************************************************************/ +void dkeyvalsort(int n, KeyValueType *nodes) +{ + qsort((void *)nodes, (size_t)n, (size_t)sizeof(KeyValueType), DecKeyValueCmp); +} + + +/************************************************************************* +* This function compares 2 KeyValueType variables for sorting in inc order +**************************************************************************/ +int DecKeyValueCmp(const void *v1, const void *v2) +{ + KeyValueType *n1, *n2; + + n1 = (KeyValueType *)v1; + n2 = (KeyValueType *)v2; + + return n2->key - n1->key; + +} + + + +/************************************************************************* +* This function does a binary search on an array for a key and returns +* the index +**************************************************************************/ +int BSearch(int n, idxtype *array, int key) +{ + int a=0, b=n, c; + + while (b-a > 8) { + c = (a+b)>>1; + if (array[c] > key) + b = c; + else + a = c; + } + + for (c=a; c>1); + return (a > 1 ? 0 : 1); +} + +/************************************************************************* +* This function returns the log2(x) +**************************************************************************/ +int log2Int(int a) +{ + int i; + + for (i=1; a > 1; i++, a = a>>1); + return i-1; +} + + +/************************************************************************* +* These functions set the values of a vector +**************************************************************************/ +float *sset(int n, float val, float *x) +{ + int i; + + for (i=0; i x[max] ? i : max); + + return max; +} + + +/************************************************************************* +* These functions return the index of the maximum element in a vector +**************************************************************************/ +int samax_strd(int n, float *x, int incx) +{ + int i; + int max=0; + + n *= incx; + for (i=incx; i x[max] ? i : max); + + return max/incx; +} + + +/************************************************************************* +* These functions return the index of the maximum element in a vector +**************************************************************************/ +int sfamax(int n, float *x) +{ + int i; + int max=0; + + for (i=1; i fabs(x[max]) ? i : max); + + return max; +} + + + +/************************************************************************* +* These functions return the index of the maximum element in a vector +**************************************************************************/ +int samin_strd(int n, float *x, int incx) +{ + int i; + int min=0; + + n *= incx; + for (i=incx; i x[max] ? i : max); + + return max/incx; +} + + +/************************************************************************* +* These functions return the index of the maximum element in a vector +**************************************************************************/ +int idxamin_strd(int n, idxtype *x, int incx) +{ + int i, min=0; + + n *= incx; + for (i=incx; i x[max] ? i : max); + + return max; +} + + +/************************************************************************* +* These functions return the index of the maximum element in a vector +**************************************************************************/ +int sfavg(int n, float *x) +{ + int i; + float total = 0.0; + + if (n == 0) + return 0.0; + + for (i=0; i x[1]) { + max1 = 0; + max2 = 1; + } + else { + max1 = 1; + max2 = 0; + } + + for (i=2; i x[max1]) { + max2 = max1; + max1 = i; + } + else if (x[i] > x[max2]) + max2 = i; + } + + return max2; +} + + +/************************************************************************* +* These functions return the index of the minimum element in a vector +**************************************************************************/ +int samin(int n, float *x) +{ + int i, min=0; + + for (i=1; i=0; n--) + y[n] += x[n]; +} + + +/************************************************************************* +* This function sums the entries in an array +**************************************************************************/ +float ssum(int n, float *x) +{ + int i; + float sum = 0.0; + + for (i=0; i m11) + return 0; + if (m22 < m12) + return 1; + if (m22 > m12) + return 0; + + return sm2 < sm1; +} + +/************************************************************************* +* This is a comparison function +**************************************************************************/ +int myvalkeycompare(const void *fptr, const void *sptr) +{ + KVType *first, *second; + + first = (KVType *)(fptr); + second = (KVType *)(sptr); + + if (first->val > second->val) + return 1; + + if (first->val < second->val) + return -1; + + return 0; +} + +/************************************************************************* +* This is the inverse comparison function +**************************************************************************/ +int imyvalkeycompare(const void *fptr, const void *sptr) +{ + KVType *first, *second; + + first = (KVType *)(fptr); + second = (KVType *)(sptr); + + if (first->val > second->val) + return -1; + + if (first->val < second->val) + return 1; + + return 0; +} + + +/************************************************************************* +* The following function allocates and sets an array of floats +**************************************************************************/ +float *fsmalloc(int n, float fval, char *msg) +{ + if (n == 0) + return NULL; + + return sset(n, fval, (float *)GKmalloc(sizeof(float)*n, msg)); +} + + +/************************************************************************* +* This function computes a 2-norm +**************************************************************************/ +void saxpy2(int n, float alpha, float *x, int incx, float *y, int incy) +{ + int i; + + for (i=0; i x[*first]) { + *third = *second; + *second = *first; + *first = i; + continue; + } + + if (*second == -1 || x[i] > x[*second]) { + *third = *second; + *second = i; + continue; + } + + if (*third == -1 || x[i] > x[*third]) + *third = i; + } + + return; +} -- cgit v1.3