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

📄 opmin.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"/*  * In MPI-1, this operation is valid only for  C integer, Fortran integer, * and floating point data items (4.9.2 Predefined reduce operations) */void MPIR_MINF ( 	void *invec, 	void *inoutvec, 	int *Len, 	MPI_Datatype *type ){    static const char FCNAME[] = "MPIR_MINF";    int i, len = *Len;        switch (*type) {    case MPI_INT: {        int * restrict a = (int *)inoutvec;         int * restrict b = (int *)invec;        for ( i=0; i<len; i++ )            a[i] = MPIR_MIN(a[i],b[i]);        break;    }#ifdef HAVE_FORTRAN_BINDING    case MPI_INTEGER: {        MPI_Fint * restrict a = (MPI_Fint *)inoutvec;         MPI_Fint * restrict b = (MPI_Fint *)invec;        for ( i=0; i<len; i++ )            a[i] = MPIR_MIN(a[i],b[i]);        break;    }#endif#ifdef MPIR_INTEGER1_CTYPE    case MPI_INTEGER1: {        MPIR_INTEGER1_CTYPE * restrict a = (MPIR_INTEGER1_CTYPE *)inoutvec;         MPIR_INTEGER1_CTYPE * restrict b = (MPIR_INTEGER1_CTYPE *)invec;        for ( i=0; i<len; i++ )            a[i] = MPIR_MIN(a[i],b[i]);        break;    }#endif#ifdef MPIR_INTEGER2_CTYPE    case MPI_INTEGER2: {        MPIR_INTEGER2_CTYPE * restrict a = (MPIR_INTEGER2_CTYPE *)inoutvec;         MPIR_INTEGER2_CTYPE * restrict b = (MPIR_INTEGER2_CTYPE *)invec;        for ( i=0; i<len; i++ )            a[i] = MPIR_MIN(a[i],b[i]);        break;    }#endif#ifdef MPIR_INTEGER4_CTYPE    case MPI_INTEGER4: {        MPIR_INTEGER4_CTYPE * restrict a = (MPIR_INTEGER4_CTYPE *)inoutvec;         MPIR_INTEGER4_CTYPE * restrict b = (MPIR_INTEGER4_CTYPE *)invec;        for ( i=0; i<len; i++ )            a[i] = MPIR_MIN(a[i],b[i]);        break;    }#endif#ifdef MPIR_INTEGER8_CTYPE    case MPI_INTEGER8: {        MPIR_INTEGER8_CTYPE * restrict a = (MPIR_INTEGER8_CTYPE *)inoutvec;         MPIR_INTEGER8_CTYPE * restrict b = (MPIR_INTEGER8_CTYPE *)invec;        for ( i=0; i<len; i++ )            a[i] = MPIR_MIN(a[i],b[i]);        break;    }#endif#ifdef MPIR_INTEGER16_CTYPE    case MPI_INTEGER16: {        MPIR_INTEGER16_CTYPE * restrict a = (MPIR_INTEGER16_CTYPE *)inoutvec;         MPIR_INTEGER16_CTYPE * restrict b = (MPIR_INTEGER16_CTYPE *)invec;        for ( i=0; i<len; i++ )            a[i] = MPIR_MIN(a[i],b[i]);        break;    }#endif#ifdef MPIR_REAL4_CTYPE    case MPI_REAL4: {        MPIR_REAL4_CTYPE * restrict a = (MPIR_REAL4_CTYPE *)inoutvec;         MPIR_REAL4_CTYPE * restrict b = (MPIR_REAL4_CTYPE *)invec;        for ( i=0; i<len; i++ )            a[i] = MPIR_MIN(a[i],b[i]);        break;    }#endif#ifdef MPIR_REAL8_CTYPE    case MPI_REAL8: {        MPIR_REAL8_CTYPE * restrict a = (MPIR_REAL8_CTYPE *)inoutvec;         MPIR_REAL8_CTYPE * restrict b = (MPIR_REAL8_CTYPE *)invec;        for ( i=0; i<len; i++ )            a[i] = MPIR_MIN(a[i],b[i]);        break;    }#endif#ifdef MPIR_REAL16_CTYPE    case MPI_REAL16: {        MPIR_REAL16_CTYPE * restrict a = (MPIR_REAL16_CTYPE *)inoutvec;         MPIR_REAL16_CTYPE * restrict b = (MPIR_REAL16_CTYPE *)invec;        for ( i=0; i<len; i++ )            a[i] = MPIR_MIN(a[i],b[i]);        break;    }#endif    case MPI_UNSIGNED: {        unsigned * restrict a = (unsigned *)inoutvec;         unsigned * restrict b = (unsigned *)invec;        for ( i=0; i<len; i++ )            a[i] = MPIR_MIN(a[i],b[i]);        break;    }    case MPI_LONG: {        long * restrict a = (long *)inoutvec;         long * restrict b = (long *)invec;        for ( i=0; i<len; i++ )            a[i] = MPIR_MIN(a[i],b[i]);        break;    }#if defined(HAVE_LONG_LONG_INT)    case MPI_LONG_LONG: {	/* case MPI_LONG_LONG_INT: defined to be the same as long_long */        long long * restrict a = (long long *)inoutvec;         long long * restrict b = (long long *)invec;        for ( i=0; i<len; i++ )            a[i] = MPIR_MIN(a[i],b[i]);        break;    }#endif    case MPI_UNSIGNED_LONG: {        unsigned long * restrict a = (unsigned long *)inoutvec;         unsigned long * restrict b = (unsigned long *)invec;        for ( i=0; i<len; i++ )            a[i] = MPIR_MIN(a[i],b[i]);        break;    }    case MPI_SHORT: {        short * restrict a = (short *)inoutvec;         short * restrict b = (short *)invec;        for ( i=0; i<len; i++ )            a[i] = MPIR_MIN(a[i],b[i]);        break;    }    case MPI_UNSIGNED_SHORT: {        unsigned short * restrict a = (unsigned short *)inoutvec;         unsigned short * restrict b = (unsigned short *)invec;        for ( i=0; i<len; i++ )            a[i] = MPIR_MIN(a[i],b[i]);        break;    }    case MPI_CHAR: #ifdef HAVE_FORTRAN_BINDING    case MPI_CHARACTER: #endif    {        char * restrict a = (char *)inoutvec;         char * restrict b = (char *)invec;        for ( i=0; i<len; i++ )            a[i] = MPIR_MIN(a[i],b[i]);        break;    }    case MPI_UNSIGNED_CHAR: {        unsigned char * restrict a = (unsigned char *)inoutvec;         unsigned char * restrict b = (unsigned char *)invec;        for ( i=0; i<len; i++ )            a[i] = MPIR_MIN(a[i],b[i]);        break;    }    case MPI_FLOAT: #ifdef HAVE_FORTRAN_BINDING    case MPI_REAL: 	/* FIXME: This assumes C float = Fortran real */#endif    {        float * restrict a = (float *)inoutvec;         float * restrict b = (float *)invec;        for ( i=0; i<len; i++ )            a[i] = MPIR_MIN(a[i],b[i]);        break;    }    case MPI_DOUBLE: #ifdef HAVE_FORTRAN_BINDING    case MPI_DOUBLE_PRECISION: 	/* FIXME: This assumes C double = Fortran double precision */#endif    {        double * restrict a = (double *)inoutvec;         double * restrict b = (double *)invec;        for ( i=0; i<len; i++ )            a[i] = MPIR_MIN(a[i],b[i]);        break;    }#if defined(HAVE_LONG_DOUBLE)    case MPI_LONG_DOUBLE: {        long double * restrict a = (long double *)inoutvec;         long double * restrict b = (long double *)invec;        for ( i=0; i<len; i++ )            a[i] = MPIR_MIN(a[i],b[i]);        break;    }#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_MIN" );        break;    }	/* --END ERROR HANDLING-- */    }}int MPIR_MINF_check_dtype ( MPI_Datatype type ){    static const char FCNAME[] = "MPIR_MINF_check_dtype";        switch (type) {    case MPI_INT: #ifdef HAVE_FORTRAN_BINDING    case MPI_INTEGER: #endif    case MPI_UNSIGNED:     case MPI_LONG: #if defined(HAVE_LONG_LONG_INT)    case MPI_LONG_LONG: #endif    case MPI_UNSIGNED_LONG:     case MPI_SHORT:     case MPI_UNSIGNED_SHORT:     case MPI_CHAR: #ifdef HAVE_FORTRAN_BINDING    case MPI_CHARACTER: #endif    case MPI_UNSIGNED_CHAR:     case MPI_FLOAT: #ifdef HAVE_FORTRAN_BINDING    case MPI_REAL: #endif    case MPI_DOUBLE: #ifdef HAVE_FORTRAN_BINDING    case MPI_DOUBLE_PRECISION: #endif#if defined(HAVE_LONG_DOUBLE)    case MPI_LONG_DOUBLE: #endif/* The length type can be provided without Fortran, so we do so */#ifdef MPIR_INTEGER1_CTYPE    case MPI_INTEGER1:#endif#ifdef MPIR_INTEGER2_CTYPE    case MPI_INTEGER2:#endif#ifdef MPIR_INTEGER4_CTYPE    case MPI_INTEGER4:#endif#ifdef MPIR_INTEGER8_CTYPE    case MPI_INTEGER8:#endif#ifdef MPIR_INTEGER16_CTYPE    case MPI_INTEGER16:#endif#ifdef MPIR_REAL4_CTYPE    case MPI_REAL4:#endif#ifdef MPIR_REAL8_CTYPE    case MPI_REAL8:#endif#ifdef MPIR_REAL16_CTYPE    case MPI_REAL16:#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_MIN" );	/* --END ERROR HANDLING-- */    }}

⌨️ 快捷键说明

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