首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用scatter发送2维数组

使用scatter发送2维数组
EN

Stack Overflow用户
提问于 2010-05-20 05:57:11
回答 2查看 2.1K关注 0票数 0

我是一个MPI的初学者,我正在使用C语言和处理器模拟器(MPICH2),我写了下面的代码来发送一个2D数组,使2个处理器从它取一条线,但它产生错误时运行MPICH2,代码是:

代码语言:javascript
复制
#include <stdio.h>  
#include <stdlib.h>  
#include "mpi.h"

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

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD,&commsize);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    char** name=malloc(2*sizeof(char*));
    int i;

    for(i=0;i<2;i++){
        name[i]=malloc(15*sizeof(char));
    }
    name[0]="name";
    name[1]="age";
    /////////////////////
    if(rank==0) {
        char** mArray=malloc(2*sizeof(char*));
        MPI_Scatter(&name,1,MPI_CHAR,&mArray,1,MPI_CHAR,0,MPI_COMM_WORLD);//send
    }
    else {
        char** mArray=malloc(2*sizeof(char*));
        int k;

        for(k=0;k<2;k++){
            mArray[k]=malloc(15*sizeof(char));
        }
        MPI_Scatter(&mArray,1,MPI_CHAR,&mArray,1,MPI_CHAR,0,MPI_COMM_WORLD);//receive       
        printf("line is %s \n",mArray[rank-1]);
    }
    MPI_Finalize();
}
EN

回答 2

Stack Overflow用户

发布于 2010-05-20 06:21:15

代码语言:javascript
复制
  name[0]="name";

  name[1]="age";

这不是字符串副本。嗯,可能不像你想的那样。您错误地分配了空格,并将其分配给name和name1,然后用指向文字字符串"name“和”name1“的指针覆盖这些指针。您错误定位的char15数组已丢失(内存泄漏)。

然后,当您尝试使用MPI_Scatter发送它时,您实际上是在发送name所指向的内容,这是一个指针,而不是字符串。(低于-->表示指向)

代码语言:javascript
复制
name --> [0x4321, 0x2348]
0x4321 --> "name"
0x2348 --> "age"

但是你分散了(至少一部分) [0x4321, 0x2348],甚至更多。

我以前没有使用过MPI库(据我所知),但我怀疑你对MPI_Scatter的其他参数也是不正确的,因为对字符串(字符数组)和指针的误解。

我认为如果你这样做了:

代码语言:javascript
复制
char name[2][15] = {"name", "age"};

在代码的散布部分忘记了malloc,你会更轻松,尽管很多时候尝试使用2dC数组也会把你搞得一团糟。这里的许多问题都是由于人们误解了指向数组的指针数组和二维数组之间的差异。

票数 3
EN

Stack Overflow用户

发布于 2010-05-21 02:51:01

正如nategoose所指出的,你的字符串定义都是错误的。先解决这些问题,在你可以printf()它们之前,不要费心去处理MPI调用。此外,只有当age字符串直接跟随内存中的name字符串时,Scatter才会起作用:否则,它将用垃圾填充消息的第二部分(或者直接在您身上填充segfault )。我不确定是否

代码语言:javascript
复制
char name[2][15] = {"name", "age"};

会将两个字符串放在一起,或者只是将两个指针放在内存中的任意位置。如果是前者,那么就使用这个。否则,我建议您根本不使用2d数组,而是像这样声明字符串:

代码语言:javascript
复制
char[2*15] name = "name";
sprintf(name+15, "age");

你的散布参数也是错误的。第一个参数应该是name,而不是&name:Scatter需要一个指针,传递&name将导致它尝试发送name的内存地址而不是其内容。

第二个和第五个参数也不正确:您希望发送30个字符(因为它是一个2*15的数组),而不仅仅是1个字符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2869747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档