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

📄 colcopy.c

📁 学校的CFD的模型 运用poisson equation 非常好的sequential programme
💻 C
字号:
#include <stdio.h>#include <mpi.h>#include "alloc.h"#define ROWS 9#define COLS 7 /* A sample program that demonstrates how to time an MPI program, and how to * send (parts of) the rows and columns in a two-dimensional array between * two processes using MPI. * In the matrix representation used here, columns are simple to copy, as * column elements are contiguous in memory. Row copying is more complex as * consecutive row elements are not contiguous in memory and require the * use of derived MPI_Datatypes to perform the copy. */void zeromatrix(float **matrix);void printmatrix(char *title, float **matrix);int main(int argc, char **argv){    double t;    int i, j, n, p;    MPI_Init(&argc, &argv);    MPI_Comm_size(MPI_COMM_WORLD, &n);    MPI_Comm_rank(MPI_COMM_WORLD, &p);    if (n != 2) {        printf("Must be run on exactly 2 processors.\n");        MPI_Finalize();        return 1;    }    t = MPI_Wtime();    /* Allocate an COLS * ROWS array. */    float **matrix = alloc_floatmatrix(COLS, ROWS);    /* Fill processor 1's matrix with numbers */    for (i = 0; i < COLS; i++) {        for ( j = 0; j < ROWS; j++) {            matrix[i][j] = (i * 10) + j;        }    }    /* Define two MPI_Datatypes for rows that we use later */    MPI_Datatype fullrowtype, partrowtype;    MPI_Type_vector(ROWS, 1, ROWS, MPI_FLOAT, &fullrowtype);    MPI_Type_commit(&fullrowtype);    MPI_Type_vector(3, 1, ROWS, MPI_FLOAT, &partrowtype);    MPI_Type_commit(&partrowtype);    if (p == 0) {        MPI_Status s;        zeromatrix(matrix);        MPI_Recv(matrix[4], ROWS, MPI_FLOAT, 1, 0, MPI_COMM_WORLD, &s);        printmatrix("After receiving column 4:", matrix);        zeromatrix(matrix);        MPI_Recv(&matrix[6][2], 4, MPI_FLOAT, 1, 0, MPI_COMM_WORLD, &s);        printmatrix("After receiving column 6, rows 3-5:", matrix);        zeromatrix(matrix);        MPI_Recv(matrix[3], ROWS*2, MPI_FLOAT, 1, 0, MPI_COMM_WORLD, &s);        printmatrix("After receiving column 3 and 4:", matrix);        zeromatrix(matrix);        MPI_Recv(matrix[0], ROWS*COLS, MPI_FLOAT, 1, 0, MPI_COMM_WORLD, &s);        printmatrix("After receiving all columns:", matrix);        zeromatrix(matrix);        MPI_Recv(&matrix[0][6], 1, fullrowtype, 1, 0, MPI_COMM_WORLD, &s);        printmatrix("After receiving row 6:", matrix);               zeromatrix(matrix);         MPI_Recv(&matrix[0][1], 1, partrowtype, 1, 0, MPI_COMM_WORLD, &s);        printmatrix("After receiving row 1 cols 0-2:", matrix);                zeromatrix(matrix);         MPI_Recv(&matrix[4][1], 1, partrowtype, 1, 0, MPI_COMM_WORLD, &s);        printmatrix("After receiving row 1 cols 4-6:", matrix);    } else {        /* Send all of column 4 to processor 0 */        MPI_Send(matrix[4], ROWS, MPI_FLOAT, 0, 0, MPI_COMM_WORLD);        /* Send column 6 rows 2-5 to processor 0 */        MPI_Send(&matrix[6][2], 4, MPI_FLOAT, 0, 0, MPI_COMM_WORLD);        /* Send columns 3 and 4 to processor 0 */        MPI_Send(matrix[3], ROWS*2, MPI_FLOAT, 0, 0, MPI_COMM_WORLD);        /* Send the entire matrix (ie all columns) to processor 0 */        MPI_Send(matrix[0], ROWS*COLS, MPI_FLOAT, 0, 0, MPI_COMM_WORLD);        /* Send row 6 to processor 0 */        MPI_Send(&matrix[0][6], 1, fullrowtype, 0, 0, MPI_COMM_WORLD);                /* Send row 1 cols 0-2 to processor 0 */        MPI_Send(&matrix[0][1], 1, partrowtype, 0, 0, MPI_COMM_WORLD);                /* Send row 1 cols 4-6 to processor 0 */        MPI_Send(&matrix[4][1], 1, partrowtype, 0, 0, MPI_COMM_WORLD);    }    if (p == 0) {        t = MPI_Wtime() - t;        printf("Program took %f secs to run.\n", t);    }    /* Free the matrix we allocated */    free_matrix(matrix);    /* Free the derived MPI_Datatypes */    MPI_Type_free(&fullrowtype);    MPI_Type_free(&partrowtype);    MPI_Finalize();    return 0;}void zeromatrix(float **matrix){    int i, j;    for ( j = 0; j < ROWS; j++) {        for ( i = 0; i < COLS; i++) {            matrix[i][j] = 0.0;        }    }}void printmatrix(char *title, float **matrix){    int i, j;    printf("%s\n", title);    for ( j = 0; j < ROWS; j++) {        for ( i = 0; i < COLS; i++) {            printf("%02g ", matrix[i][j]);        }        printf("\n");    }    printf("\n");}

⌨️ 快捷键说明

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