if(my_rank==0)
{
sprintf(str,"<?xml version=\"1.0\" ?>\n");
MPI_File_iwrite(fp,str,strlen(str), MPI_CHAR,&request);
a=a+strlen(str);
sprintf(str,"<!DOCTYPE Xdmf SYSTEM \"Xdmf.dtd\" []> \n");
MPI_File_iwrite(fp,str,strlen(str), MPI_CHAR,&request);
a=a+strlen(str);
sprintf(str,"<Xdmf Version=\"2.0\">\n");
MPI_File_iwrite(fp,str,strlen(str), MPI_CHAR,&request);
a=a+strlen(str);
}
aio_write()错误:参数无效; 在关闭文件之前我也有一个wait命令。 当我在openmpi / 2.0.1上使用群集时会发生此错误 在本地机器上使用openmpi / 1.10.1它可以正常工作
答案 0 :(得分:1)
MPI_File_iwrite()
是一种非阻塞操作。因此,它可以在被召唤后立即返回,并在返回后阅读str
个世纪的内容。以下是一些后果:
str
后立即修改缓冲区MPI_File_iwrite()
不是一个好主意。实际上,在修改缓冲区str
!MPI_File_iwrite()
的连续调用可能导致加密文件:编写操作的顺序可能与调用顺序不同... MPI_File_iwrite(...,&request)
时覆盖请求是确保永远不会检查所有写入操作完成的好方法...... 两种解决方案:
MPI_Wait(&request,MPI_STATUS_IGNORE);
后立即坚持MPI_File_write()
或致电MPI_File_iwrite()
。这样,写入操作的顺序将与其中一个调用相同。 如果行的顺序无关紧要,则以下代码可能会起作用:
if(my_rank==0)
{
char str[142];
char str2[142];
char str3[142];
MPI_Request requests[3];
snprintf(str,142,"<?xml version=\"1.0\" ?>\n");
MPI_File_iwrite(fp,str,strlen(str), MPI_CHAR,&request[0]);
a=a+strlen(str);
snprintf(str2,142,"<!DOCTYPE Xdmf SYSTEM \"Xdmf.dtd\" []> \n");
MPI_File_iwrite(fp,str2,strlen(str2), MPI_CHAR,&request[1]);
a=a+strlen(str2);
snprintf(str3,142,"<Xdmf Version=\"2.0\">\n");
MPI_File_iwrite(fp,str3,strlen(str3), MPI_CHAR,&request[2]);
a=a+strlen(str3);
MPI_Waitall(3,requests,MPI_STATUSES_IGNORE);
}
最后,MPI_File_iwrite()
和MPI_File_write()
上的Open MPI文档指出:
如果在打开文件时指定了MPI_MODE_SEQUENTIAL模式,则调用此函数是错误的。