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

📄 same_op.c

📁 mpi并行计算的c++代码 可用vc或gcc编译通过 可以用来搭建并行计算试验环境
💻 C
字号:
/*   (C) 2004 by Argonne National Laboratory.       See COPYRIGHT in top-level directory.*/#include "collchk.h" static char* CollChk_get_op_string(MPI_Op op);static char* CollChk_get_op_string(MPI_Op op){    if ( op == MPI_MAX )        return "MPI_MAX";    else if ( op == MPI_MIN )        return "MPI_MIN";    else if ( op == MPI_SUM )        return "MPI_SUM";    else if ( op == MPI_PROD )        return "MPI_PROD";    else if ( op == MPI_LAND )        return "MPI_LAND";    else if ( op == MPI_BAND )        return "MPI_BAND";    else if ( op == MPI_LOR )        return "MPI_LOR";    else if ( op == MPI_BOR )        return "MPI_BOR";    else if ( op == MPI_LXOR )        return "MPI_LXOR";    else if ( op == MPI_BXOR )        return "MPI_BXOR";    else if ( op == MPI_MAXLOC )        return "MPI_MAXLOC";    else if ( op == MPI_MINLOC )        return "MPI_MINLOC";    else        return "USER_OP\0";}int CollChk_same_op(MPI_Comm comm, MPI_Op op, char* call){    int r, s, i, go, ok;    /* rank, size, counter, go flag, ok flag */    char buff[COLLCHK_SM_STRLEN];          /* temp communication buffer */    char op_str[15];        /* the operation name in string format */    char err_str[COLLCHK_STD_STRLEN];      /* error string */    int tag=0;              /* needed for communication */    MPI_Status st;    /* get rank and size */    MPI_Comm_rank(comm, &r);    MPI_Comm_size(comm, &s);    sprintf(err_str, COLLCHK_NO_ERROR_STR);    sprintf(op_str, CollChk_get_op_string(op));    if (r == 0) {        /* send the name of the op to the other processes */        strcpy(buff, op_str);        PMPI_Bcast(buff, 15, MPI_CHAR, 0, comm);        /* ask the other processes if they are ok to continue */        go = 1;     /* sets the go flag */        for(i=1; i<s; i++) {            MPI_Recv(&ok, 1, MPI_INT, i, tag, comm, &st);            /* if a process has made a bad call unset the go flag */            if (ok != 1)               go = 0;        }        /* broadcast to the go flag */        PMPI_Bcast(&go, 1, MPI_INT, 0, comm);    }    else {        /* recieve 0's op name */        PMPI_Bcast(buff, 15, MPI_CHAR, 0, comm);        /* check it against the local op name */        if (strcmp(buff, op_str) != 0) {            /* at this point the op is not consistant */            /* print an error message and send a unset ok flag to 0 */            ok = 0;            sprintf(err_str, "Inconsistent operation (%s) to "                             "Rank 0's operation(%s).", op_str, buff);            MPI_Send(&ok, 1, MPI_INT, 0, tag, comm);        }        else {            /* at this point the op is consistant */            /* send an set ok flag to 0 */            ok = 1;            MPI_Send(&ok, 1, MPI_INT, 0, tag, comm);        }        /* get the go flag from 0 */        PMPI_Bcast(&go, 1, MPI_INT, 0, comm);    }    /* if the go flag is not set exit else return */    if (go != 1) {        return CollChk_err_han(err_str, COLLCHK_ERR_OP, call, comm);    }    return MPI_SUCCESS;}

⌨️ 快捷键说明

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