在MPI

时间:2017-06-25 19:29:38

标签: c++ mpi dynamic-arrays

我正在开发一个项目,我将使用MPI进行并行编程,我将使用点对点(发送/接收)通信和集体通信(MPI_Gatherv,...), 我将本地数组分配为连续的2d数组,我需要将数组的边列发送到另一个,我尝试了如下面的代码所示。 现在,下面的代码产生几乎正确的结果,除了接收数组中元素的奇怪变化,如下所示

2 3 3 3 3
2 3 3 3 3
2 3 3 3 3
2 3 3 3 3
2 0 3 3 3

元素b[4][1] = 0 !!是问题,我不明白为什么这个元素被修改,虽然它不在数据类型g_col的范围内,我使用MPI_Get_count检查了接收消息,它显示接收到5个元素(这是正确的),那么这个元素如何变化? 我正在使用下面显示的方法分配数组,以便在MPI_Gatherv中使用,因为我创建了一个子数组并使用调整大小的数据类型来收集全局数组中的本地数组

我正在使用4核运行代码。

提前致谢。

    #include <iostream>
    #include <mpi.h>
    #include <cmath>
    #include <cstdlib>

    using namespace std;

    // Allocate a contiguous  2d array 
    int** crt_arr_2d(int im, int jm){
    int** arr;
    arr = (int**)calloc(im, sizeof(int*));
    arr[0] = (int*)calloc(im*jm, sizeof(int));
    for (int i = 0; i < im; i++){
        arr[i] = arr[0] + i*jm;
    }
    return arr;
}

    // De-allocate 2d array
    void dstr_arr_2d(int** ar, int im){
    free(ar[0]);
    free(ar);
}

int main(int argc, char* argv[]){

    MPI_Init(&argc, &argv);
    MPI_Comm World;
    World = MPI_COMM_WORLD;
    int proc, nprocs;
    MPI_Comm_rank(World, &proc);
    MPI_Comm_size(World, &nprocs);

    int im_local = 5; // Number of rows in local array
    int jm_local = 5; // Number of columns in local array

    int** a = crt_arr_2d(im_local, jm_local);
    int** b = crt_arr_2d(im_local, jm_local);

    // Initialize data
    if (proc == 0){
        for (int i = 0; i < im_local; i++){
            for (int j = 0; j < jm_local; j++){
                a[i][j] = 2;
            }
        }
    }
    if (proc == 1){
        for (int i = 0; i < im_local; i++){
            for (int j = 0; j < jm_local; j++){
                b[i][j] = 3;
            }
        }
    }

    MPI_Datatype g_col;
    MPI_Type_vector(im_local, 1, jm_local, MPI_INT, &g_col);
    MPI_Type_commit(&g_col);

    if (proc == 0){
        MPI_Send(&a[0][4], im_local, g_col, 1, 1, World);
    }

    if (proc == 1){
        MPI_Recv(&b[0][0], im_local, g_col, 0, 1, World, MPI_STATUSES_IGNORE);
        for (int i = 0; i < im_local; i++){
            for (int j = 0; j < jm_local; j++){
                cout << b[i][j] << " ";
            }
            cout << endl;
        }
    }

    MPI_Barrier(World);

    //MPI_Type_free(&g_col);
    //dstr_arr_2d(a,im_local);
    //dstr_arr_2d(b,im_local);

    MPI_Finalize();
    return 0;
}

1 个答案:

答案 0 :(得分:0)

如果我正确理解您要实现的目标,那么您应该使用MPI_Send()而不是MPI_Recv()调用count=1count=im_local