【问题标题】:Border exchange in cartesian topology mpi笛卡尔拓扑mpi中的边界交换
【发布时间】:2018-03-10 02:07:48
【问题描述】:

我想在我的 mpi 程序中执行边界交换。 我的结构看起来像这样:

cell** local_petri_A;

local_petri_A = calloc(p_local_petri_x_dim,sizeof(*local_petri_A));

for(int i = 0; i < p_local_petri_x_dim ; i ++){
        local_petri_A[i] = calloc(p_local_petri_y_dim,sizeof(**local_petri_A));
    }

单元格在哪里:

typedef struct {
  int color;
  int strength;
} cell;

我想有一个像这张照片一样的交换计划:

所以我把我的程序放在笛卡尔拓扑中,首先定义 mpi 类型来执行交换: 无效 create_types(){

////////////////////////////////
////////////////////////////////
// cell type
const int    nitems=2;
int          blocklengths[2] = {1,1};
MPI_Datatype types[2] = {MPI_INT, MPI_INT};
MPI_Aint     offsets[2];

offsets[0] = offsetof(cell, color);
offsets[1] = offsetof(cell, strength);

MPI_Type_create_struct(nitems, blocklengths, offsets, types, &mpi_cell_t);
MPI_Type_commit(&mpi_cell_t);
////////////////////////////////
///////////////////////////////

MPI_Type_vector ( x_inside , 1 , 1 , mpi_cell_t , & border_row_t );
MPI_Type_commit ( & border_row_t );
/*we put the stride to x_dim to get only one column*/
MPI_Type_vector ( y_inside  , 1 , p_local_petri_x_dim , MPI_DOUBLE , & border_col_t );
MPI_Type_commit ( & border_col_t );

}

然后最后尝试进行南北交换:

   /*send to the north receive from the south */
   MPI_Sendrecv ( & local_petri_A[0][1] , 1 , border_row_t , p_north , TAG_EXCHANGE ,& local_petri_A [0][ p_local_petri_y_dim  -1] , 1 , border_row_t , p_south , TAG_EXCHANGE ,cart_comm , MPI_STATUS_IGNORE );
   /*send to the south receive from the north */
   MPI_Sendrecv ( & local_petri_A[0][ p_local_petri_y_dim  -2] , 1 , border_row_t , p_south , TAG_EXCHANGE ,& local_petri_A [0][0] , 1 , border_row_t , p_north , TAG_EXCHANGE ,cart_comm , MPI_STATUS_IGNORE );

注意:在本节中,x_inside 和 y_inside 是数组的“内部”维度(没有幻影部分),p_local_petri_dim 是整个数组的维度。

然后我有这个错误:

是不是我做错了什么?

提前感谢您的帮助。

【问题讨论】:

    标签: mpi openmpi


    【解决方案1】:

    问题在于您分配二维数组的方式。 您分配了一个数组数组,因此在连续内存中不可能有两行。因此,您的列的 ddt 与您的 2D 数组布局不匹配。

    您可以参考MPI_Bcast a dynamic 2d array正确分配您的数组。

    顺便说一句,Fortran 没有这种问题,所以如果这是一个选项,那会让你的生活更轻松。

    【讨论】:

    • 好的,所以它不适用于列,但行呢?在这里我只尝试发送一些行,我仍然有一个错误,我的分配行在内存中是连续的,不是吗?
    • 行绝对是连续的。请使用Minimal, Complete, and Verifiable example 编辑您的问题,我会看看它
    • 我注意到你用&amp; local_petri_A [0][ p_local_petri_y_dim -1] 发送recv,应该改为&amp; local_petri_A [p_local_petri_y_dim -1][1] 吗?
    猜你喜欢
    • 2014-01-22
    • 2012-03-17
    • 2017-12-17
    • 2017-12-18
    • 2016-12-01
    • 2016-02-05
    • 2017-08-22
    • 2014-07-23
    • 2013-04-18
    相关资源
    最近更新 更多