加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何使用MPI_Isend发送多维,动态和增长的数组

发布时间:2020-12-16 07:13:34 所属栏目:百科 来源:网络整理
导读:我创建了一个数组,我想用MPI发送它.第一部分运作良好(我认为?)但我的第二部分有问题.我想这是接收部分以及我如何malloc数组? 请看一下: if (myrank 1){ //first part int rows = 5; int cols = 4; int realcount = 0; int (*sendarray)[cols] = malloc(si
我创建了一个数组,我想用MPI发送它.第一部分运作良好(我认为?)但我的第二部分有问题.我想这是接收部分以及我如何malloc数组?
请看一下:

if (myrank > 1)
{
    //first part
    int rows = 5;
    int cols = 4;
    int realcount = 0;
    int (*sendarray)[cols] = malloc(sizeof *sendarray * rows);
    for (int j = 0; j < 100; ++j)
    {
        for (int k = 0; k < 100; ++k)
        {
            for (int l = 0; l < 100; ++l)
            {
                if(realcount==rows){
                    int newnum = (rows + 2) * 2;
                    int (*newptr)[cols] = realloc(sendarray,sizeof *newptr * newnum);
                    rows = newnum;
                    sendarray = newptr;
                }
                /*
                    other stuff and checks
                */
                if(checks)
                {
                    sendarray[realcount][0] = j;
                    sendarray[realcount][1] = k;
                    sendarray[realcount][2] = l;
                    sendarray[realcount][3] = max;
                    ++realcount;
                }
            }
        }
    }
    //Send array
    MPI_Request req;
    MPI_Isend(sendarray,realcount,MPI_INT,1,MPI_COMM_WORLD,&req);
    MPI_Wait(&req,MPI_STATUS_IGNORE);
}else if(myrank == 1){
    //second part
    //for-loop: check incomming data for each task > 1
    for () {
        i = task thats going to send data
        int amount = 0;
        int cols = 4;
        MPI_Status status;
        MPI_Probe(i,&status);
        MPI_Get_count(&status,&amount);
        int (*recv_buf)[cols] = malloc(sizeof *recv_buf * amount);
        MPI_Recv(recv_buf,amount,i,MPI_STATUS_IGNORE);
        for (int var = 0; var < amount; ++var) {
            //wrong data here
            fprintf(fp,"{ "x": %d,"y": %d,"z": %d,"value": %d },",recv_buf[var][0],recv_buf[var][1],recv_buf[var][2],recv_buf[var][3]);
        }
        free(recv_buf);
    }
}

非常感谢您的帮助.
我看了一下https://stackoverflow.com/a/13535563/2521647和https://stackoverflow.com/a/14051503/2521647

解决方法

你告诉MPI发送和接收realcount许多MPI_INT,但你的数据实际上是4 MPI_INT.

我不知道这是否是唯一的问题,但这可以解释为什么你得到的阵列不同于你预期的填充.

编辑:在您的情况下,您需要执行以下操作:

MPI_Isend(sendarray,realcount*cols,&req);

int (*recv_buf)[cols] = malloc(sizeof *recv_buf * amount/4);
     ...
     for (int var = 0; var < amount/4; ++var) {

或使用derived datatype来描述您要发送的4个整数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读