⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opminloc.c

📁 mpi并行计算的c++代码 可用vc或gcc编译通过 可以用来搭建并行计算试验环境
💻 C
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* * *  (C) 2001 by Argonne National Laboratory. *      See COPYRIGHT in top-level directory. */#include "mpiimpl.h"/* MINLOC and MAXLOC structures */typedef struct MPIR_2int_loctype {  int  value;  int  loc;} MPIR_2int_loctype;typedef struct MPIR_floatint_loctype {  float  value;  int    loc;} MPIR_floatint_loctype;typedef struct MPIR_longint_loctype {  long  value;  int    loc;} MPIR_longint_loctype;typedef struct MPIR_shortint_loctype {  short  value;  int    loc;} MPIR_shortint_loctype;typedef struct MPIR_doubleint_loctype {  double  value;  int     loc;} MPIR_doubleint_loctype;#if defined(HAVE_LONG_DOUBLE)typedef struct MPIR_longdoubleint_loctype {  long double   value;  int           loc;} MPIR_longdoubleint_loctype;#endifvoid MPIR_MINLOC( 	void *invec, 	void *inoutvec, 	int *Len, 	MPI_Datatype *type ){    static const char FCNAME[] = "MPIR_MINLOC";    int i, len = *Len, flen;    flen = len * 2; /* used for Fortran types */    switch (*type) {    /* first the C types */    case MPI_2INT: {        MPIR_2int_loctype *a = (MPIR_2int_loctype *)inoutvec;        MPIR_2int_loctype *b = (MPIR_2int_loctype *)invec;        for (i=0; i<len; i++) {            if (a[i].value == b[i].value)                a[i].loc = MPIR_MIN(a[i].loc,b[i].loc);            else if (a[i].value > b[i].value) {                a[i].value = b[i].value;                a[i].loc   = b[i].loc;            }        }        break;    }    case MPI_FLOAT_INT: {        MPIR_floatint_loctype *a = (MPIR_floatint_loctype *)inoutvec;        MPIR_floatint_loctype *b = (MPIR_floatint_loctype *)invec;        for (i=0; i<len; i++) {            if (a[i].value == b[i].value)                a[i].loc = MPIR_MIN(a[i].loc,b[i].loc);            else if (a[i].value > b[i].value) {                a[i].value = b[i].value;                a[i].loc   = b[i].loc;            }        }        break;    }    case MPI_LONG_INT: {        MPIR_longint_loctype *a = (MPIR_longint_loctype *)inoutvec;        MPIR_longint_loctype *b = (MPIR_longint_loctype *)invec;        for (i=0; i<len; i++) {            if (a[i].value == b[i].value)                a[i].loc = MPIR_MIN(a[i].loc,b[i].loc);            else if (a[i].value > b[i].value) {                a[i].value = b[i].value;                a[i].loc   = b[i].loc;            }        }        break;    }    case MPI_SHORT_INT: {        MPIR_shortint_loctype *a = (MPIR_shortint_loctype *)inoutvec;        MPIR_shortint_loctype *b = (MPIR_shortint_loctype *)invec;        for (i=0; i<len; i++) {            if (a[i].value == b[i].value)                a[i].loc = MPIR_MIN(a[i].loc,b[i].loc);            else if (a[i].value > b[i].value) {                a[i].value = b[i].value;                a[i].loc   = b[i].loc;            }        }        break;    }    case MPI_DOUBLE_INT: {        MPIR_doubleint_loctype *a = (MPIR_doubleint_loctype *)inoutvec;        MPIR_doubleint_loctype *b = (MPIR_doubleint_loctype *)invec;        for (i=0; i<len; i++) {            if (a[i].value == b[i].value)                a[i].loc = MPIR_MIN(a[i].loc,b[i].loc);            else if (a[i].value > b[i].value) {                a[i].value = b[i].value;                a[i].loc   = b[i].loc;            }        }        break;    }#if defined(HAVE_LONG_DOUBLE)    case MPI_LONG_DOUBLE_INT: {        MPIR_longdoubleint_loctype *a = (MPIR_longdoubleint_loctype *)inoutvec;        MPIR_longdoubleint_loctype *b = (MPIR_longdoubleint_loctype *)invec;        for (i=0; i<len; i++) {            if (a[i].value == b[i].value)                a[i].loc = MPIR_MIN(a[i].loc,b[i].loc);            else if (a[i].value > b[i].value) {                a[i].value = b[i].value;                a[i].loc   = b[i].loc;            }        }        break;    }#endif    /* now the Fortran types */#ifdef HAVE_FORTRAN_BINDING#ifndef HAVE_NO_FORTRAN_MPI_TYPES_IN_C    case MPI_2INTEGER: {        int *a = (int *)inoutvec; int *b = (int *)invec;        for ( i=0; i<flen; i+=2 ) {            if (a[i] == b[i])                a[i+1] = MPIR_MIN(a[i+1],b[i+1]);            else if (a[i] > b[i]) {                a[i]   = b[i];                a[i+1] = b[i+1];            }        }        break;    }    case MPI_2REAL: {        float *a = (float *)inoutvec; float *b = (float *)invec;        for ( i=0; i<flen; i+=2 ) {            if (a[i] == b[i])                a[i+1] = MPIR_MIN(a[i+1],b[i+1]);            else if (a[i] > b[i]) {                a[i]   = b[i];                a[i+1] = b[i+1];            }        }        break;    }    case MPI_2DOUBLE_PRECISION: {        double *a = (double *)inoutvec; double *b = (double *)invec;        for ( i=0; i<flen; i+=2 ) {            if (a[i] == b[i])                a[i+1] = MPIR_MIN(a[i+1],b[i+1]);            else if (a[i] > b[i]) {                a[i]   = b[i];                a[i+1] = b[i+1];            }        }        break;    }#endif#endif	/* --BEGIN ERROR HANDLING-- */    default: {        MPICH_PerThread_t *p;        MPIR_GetPerThread(&p);        p->op_errno = MPIR_Err_create_code( MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OP, "**opundefined","**opundefined %s", "MPI_MINLOC" );        break;    }	/* --END ERROR HANDLING-- */    }}int MPIR_MINLOC_check_dtype( MPI_Datatype type ){    static const char FCNAME[] = "MPIR_MINLOC_check_dtype";        switch (type) {    /* first the C types */    case MPI_2INT:     case MPI_FLOAT_INT:     case MPI_LONG_INT:     case MPI_SHORT_INT:     case MPI_DOUBLE_INT: #if defined(HAVE_LONG_DOUBLE)    case MPI_LONG_DOUBLE_INT: #endif   /* now the Fortran types */#ifdef HAVE_FORTRAN_BINDING#ifndef HAVE_NO_FORTRAN_MPI_TYPES_IN_C    case MPI_2INTEGER:     case MPI_2REAL:     case MPI_2DOUBLE_PRECISION: #endif#endif        return MPI_SUCCESS;	/* --BEGIN ERROR HANDLING-- */    default:         return MPIR_Err_create_code( MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OP, "**opundefined","**opundefined %s", "MPI_MINLOC" );	/* --END ERROR HANDLING-- */    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -