MPI IO - MPI_File_write 进程 #1 覆盖我共享文件中的进程 #2
MPI IO - MPI_File_write process #1 overwrites process #2 in my shared file
我正在尝试将来自 2 个或更多进程的数据写入单个文件。
简单的 helloworld exmaple 很好用;
即 https://wiki.scinet.utoronto.ca/wiki/images/8/88/Parallel_io_course_mpi_io.pdf
以幻灯片 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);
也许您可以尝试将偏移量计算为 offset = my_rank * MAX_BUFF
。我不确定它应该是 MAX_BUFF
还是 MAX_BUFF - 1
.
祝你好运。
我正在尝试将来自 2 个或更多进程的数据写入单个文件。 简单的 helloworld exmaple 很好用; 即 https://wiki.scinet.utoronto.ca/wiki/images/8/88/Parallel_io_course_mpi_io.pdf 以幻灯片 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);
也许您可以尝试将偏移量计算为 offset = my_rank * MAX_BUFF
。我不确定它应该是 MAX_BUFF
还是 MAX_BUFF - 1
.
祝你好运。