c - MPI_Bcast 动态二维结构数组

标签 c mpi

我按照 Jonathan 的代码从这里 ( MPI_Bcast a dynamic 2d array ) 到 MPI_Bcast 动态分配的二维结构数组。结构如下:

typedef struct {
   char num[MAX];
   int neg;
} bignum; 

由于这不是 native 数据类型,因此我使用 MPI_Type_create_struct 来提交此数据类型。 我在这里省略了代码,因为它适用于我正在做的另一个项目。

我用来动态创建(“连续?”)数组的方法是通过调用:

 bignum **matrix = creatematrix(DIMMAX,DIMMAX);

其实现为:

 bignum ** creatematrix (int num_rows, int num_cols){
   int i;
   bignum *one_d = (bignum*)malloc (num_rows * num_cols * sizeof (bignum));
   bignum **two_d = (bignum**)malloc (num_rows * sizeof (bignum *));

   for (i = 0; i < num_rows; i++)
   two_d[i] = &(one_d[i*num_cols]);//one_d + (i * num_cols);

   return two_d;
 }

现在我将获取输入并将其存储在矩阵中,并将 MPI_Bcast 调用为:

MPI_Bcast(&(matrix[0][0]), DIMMAX*DIMMAX, Bignum, 0, MPI_COMM_WORLD);

似乎没有段错误,但问题是仅广播第一行(matrix[0])。除根之外的所有其他排名仅具有第一行的数据。其他行保持不变。

看起来不仅仅是分配连续的内存块。是不是我遗漏了什么导致广播不成功?

编辑:

我摸索出了一个奇怪的解决方法,使用嵌套结构。谁能解释为什么这种方法有效而上面的方法无效?

typedef struct {
   char num[MAX];
   int neg;
} bignum;

typedef struct {
   bignum elements[DIMMAX];
} row;

int main(/*int argc,char *argv[]*/){
  int dim, my_rank, comm_sz;
  int i,j,k; //iterators
  bignum global_sum = {{0},0};
  row *matrix = (row*)malloc(sizeof(row)*DIMMAX);
  row *tempmatrix = (row*)malloc(sizeof(row)*DIMMAX);
  MPI_Init(NULL,NULL);
  MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
  MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

  //CREATE DERIVED DATATYPE Bignum
  MPI_Datatype Bignum;  
  MPI_Datatype type[4] = {MPI_LB, MPI_CHAR, MPI_INT, MPI_UB};
  int blocklen[4] = {1,MAX,1,1};
  MPI_Aint disp[4];
  //get offsets 
  MPI_Get_address(&global_sum, disp);
  MPI_Get_address(&global_sum.num, disp+1); 
  MPI_Get_address(&global_sum.neg, disp+2);
  //MPI_Get_address(&local_sum+1, disp+3);
  int base;
  base = disp[0];
  for (i=0;i<3;i++){
      disp[i] -= base;  
  }
  disp[3] = disp[2]+4;  //int
  MPI_Type_create_struct(4,blocklen,disp,type,&Bignum);
  MPI_Type_commit(&Bignum);

  //CREATE DERIVED DATATYPE BignumRow
  MPI_Datatype BignumRow;   
  MPI_Datatype type2[3] = {MPI_LB, Bignum, MPI_UB};
  int blocklen2[3] = {1,DIMMAX,1};  
  MPI_Aint disp2[3] = {0,0,DIMMAX*(MAX+4)};
  MPI_Type_create_struct(3,blocklen2,disp2,type2,&BignumRow);
  MPI_Type_commit(&BignumRow);

  MPI_Bcast(&dim, 1, MPI_INTEGER, 0, MPI_COMM_WORLD);
  MPI_Bcast(matrix, dim, BignumRow, 0, MPI_COMM_WORLD);

最佳答案

这似乎出现了很多:如果您在 C 中使用 MPI 传递多维数组,您就必须将多维数组视为数组的数组。我认为在你的第一个例子中,你很幸运,矩阵[0][0](由于连续的malloc?)位于一大块内存的开头(因此,没有段错误)。

在第二个(工作)示例中,您不仅描述了内存区域(matrix[0][0])开头的内存地址,还描述了所有内部指针。

关于c - MPI_Bcast 动态二维结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7971199/

相关文章:

c - printf 函数如何处理整数?

c - 为什么输出是 15 15 而不是 15 20?

c++ - GCC#pragma 消息被忽略

c - gtk2中的gtk_idle_add()和gtk_main_context_invoke()有什么区别?

c - 如何使用 MPI 和 OpenMP 运行并行循环

performance - tau_exec 无法启动, "error no matching binding for ' mpi'"

c - MPI 发送和接收(多对多)

c - 通过引用将结构体成员传递给函数

c - MPI_Gather 似乎不起作用

c++ - 学习 MPI 和 Pthread