请看一下:
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_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个整数.
总结以上是内存溢出为你收集整理的如何使用MPI_Isend发送多维,动态和增长的数组全部内容,希望文章能够帮你解决如何使用MPI_Isend发送多维,动态和增长的数组所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)