MPI IO-MPI#U文件#U写入进程#1覆盖共享文件中的进程#2

MPI IO-MPI#U文件#U写入进程#1覆盖共享文件中的进程#2,mpi,overwrite,Mpi,Overwrite,我试图将2个或更多进程中的数据写入单个文件。 平凡的helloworld exmaple工作得很棒; 即 以幻灯片8为例 我试图在我的代码中做完全相同的事情。她是主要功能的障碍。我只是不明白出了什么问题,我想我们今天一直在解决这个洞的问题。在底部的printf输出中,一切看起来都很好,但当我写入文件时,只会写入来自一个进程的数据..arg: void * charbuffer = malloc(MAX_BUFF); if (charbuffer == NULL) { exit(1); }

我试图将2个或更多进程中的数据写入单个文件。 平凡的helloworld exmaple工作得很棒; 即 以幻灯片8为例

我试图在我的代码中做完全相同的事情。她是主要功能的障碍。我只是不明白出了什么问题,我想我们今天一直在解决这个洞的问题。在底部的printf输出中,一切看起来都很好,但当我写入文件时,只会写入来自一个进程的数据..arg:

void * charbuffer = malloc(MAX_BUFF);
if (charbuffer == NULL) {
    exit(1);
}

int written_chars = 0;
int written_chars_accumulator = 0;
int n = number_of_points; 
MPI_File file;
MPI_Offset offset;
MPI_File_open(MPI_COMM_WORLD,"test_write.txt",
        MPI_MODE_CREATE|MPI_MODE_WRONLY,
        MPI_INFO_NULL, &file);
//------------------------------------
int msgsize = (n/num_procs);

written_chars = snprintf((char *)charbuffer, MAX_BUFF, "%d %d %d %d-------------------------------------------------------------------------\n", n, context->BOX_SIDE, context->MAX_X, context->MAX_Y);
if (written_chars < 0){ exit(1); }
written_chars_accumulator += written_chars;


int my_start = my_rank*(n/num_procs);
int my_end = (my_rank+1)*(n/num_procs);

int i,j;
for(i=my_start;i<my_end;i++){   //dersom root skal skrive ut, hopper over egen del...
    //d("i=%d,proc=%d\n",i,my_rank);
    written_chars = snprintf((char *)charbuffer+written_chars_accumulator, (MAX_BUFF - written_chars_accumulator), "%d %d %d ", i, context->x[i], context->y[i]);     
    if (written_chars < 0){ exit(1); }
    written_chars_accumulator += written_chars;


    for(j=0;j<context->allNBfrom[i];j++){

    //d("m=%d,proc=%d\n",j,my_rank);
        written_chars = snprintf((char *)charbuffer+written_chars_accumulator, (MAX_BUFF - written_chars_accumulator), "%d ", context->delaunayEdges[i][j]);    
        if (written_chars < 0){ exit(1); }
        written_chars_accumulator += written_chars;

    }
    written_chars = snprintf((char *)charbuffer+written_chars_accumulator, (MAX_BUFF - written_chars_accumulator), "\n");     
    if (written_chars < 0){ exit(1); }
    written_chars_accumulator += written_chars;
}
offset = (n/num_procs)*my_rank;
MPI_File_seek(file,offset,MPI_SEEK_SET);
MPI_File_write(file,charbuffer,MAX_BUFF,MPI_CHAR,&status); //Til senere...
printf("proc=%d:\n%s",my_rank,charbuffer);
MPI_File_close(&file);  
void*charbuffer=malloc(最大BUFF);
if(charbuffer==NULL){
出口(1);
}
int writed_chars=0;
int writed_chars_累加器=0;
int n=点的数量;
MPI_文件;
MPI_偏移量;
MPI文件打开(MPI通信世界,“test\u write.txt”,
MPI_模式|仅创建| MPI_模式|,
MPI\u信息\u NULL和文件);
//------------------------------------
int msgsize=(n/num_procs);
writed_chars=snprintf((char*)charbuffer,MAX_BUFF,“%d%d%d---------------------------------------------------------------------------------------------------\n”,n,上下文->框边,上下文->最大值X,上下文->最大值Y);
如果(写入字符<0){exit(1);}
写入字符累加器+=写入字符;
int my_start=my_rank*(n/num_procs);
int my_end=(my_排名+1)*(n/num进程);
int i,j;
对于(i=my_start;ix[i],context->y[i]);
如果(写入字符<0){exit(1);}
写入字符累加器+=写入字符;
对于(j=0;jallNBfrom[i];j++){
//d(“m=%d,proc=%d\n”,j,我的排名);
writed_chars=snprintf((char*)charbuffer+writed_chars_累加器,(MAX_BUFF-writed_chars_累加器),“%d”,context->delaunayEdges[i][j]);
如果(写入字符<0){exit(1);}
写入字符累加器+=写入字符;
}
writed_chars=snprintf((char*)charbuffer+writed_chars_累加器,(MAX_BUFF-writed_chars_累加器),“\n”);
如果(写入字符<0){exit(1);}
写入字符累加器+=写入字符;
}
偏移量=(n/num_procs)*我的排名;
MPI_文件搜索(文件、偏移、MPI_搜索集);
MPI文件写入(文件、字符缓冲区、最大缓冲区、MPI字符和状态)//直到塞内尔。。。
printf(“proc=%d:\n%s”,我的秩,charbuffer);
MPI\u文件\u关闭(&文件);

也许您可以尝试将偏移量计算为
offset=my_rank*MAX_BUFF
。我不确定它应该是
MAX\u BUFF
还是
MAX\u BUFF-1

祝你好运