如何使用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); } } 非常感谢您的帮助. 解决方法
你告诉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个整数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |