Mpi_File_iwrite fails to write; aio_write() error: Invalid argument
Mpi_File_iwrite fails to write; aio_write() error: Invalid argument
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() 错误:参数无效;
在关闭文件之前,我还有一个等待命令。
当我在集群上使用 openmpi/2.0.1 时会发生此错误
在 openmpi/1.10.1 的本地机器上工作正常
MPI_File_iwrite()
是非阻塞操作。因此,它可以在被调用后立即 return 并在 return 编辑后阅读 str
世纪的内容。以下是一些后果:
- 在调用
MPI_File_iwrite()
之后立即修改缓冲区 str
不是一个好主意。的确,修改buffer前一定要检查写操作是否完成str
!
- 连续调用
MPI_File_iwrite()
会导致文件乱码:写入操作的顺序可能与调用的顺序不一样...
- 每次调用
MPI_File_iwrite(...,&request)
时覆盖请求是确保永远不会检查所有写入操作完成的好方法...
两种解决方案:
- 坚持
MPI_File_write()
或在每次调用 MPI_File_iwrite()
后立即调用 MPI_Wait(&request,MPI_STATUS_IGNORE);
。这样,写入操作的顺序将与其中一个调用的顺序相同。
如果行的顺序无关紧要,下面的代码可能会起作用:
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 文档指出:
It is erroneous to call this function if MPI_MODE_SEQUENTIAL mode was specified when the file was opened.
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() 错误:参数无效; 在关闭文件之前,我还有一个等待命令。 当我在集群上使用 openmpi/2.0.1 时会发生此错误 在 openmpi/1.10.1 的本地机器上工作正常
MPI_File_iwrite()
是非阻塞操作。因此,它可以在被调用后立即 return 并在 return 编辑后阅读 str
世纪的内容。以下是一些后果:
- 在调用
MPI_File_iwrite()
之后立即修改缓冲区str
不是一个好主意。的确,修改buffer前一定要检查写操作是否完成str
! - 连续调用
MPI_File_iwrite()
会导致文件乱码:写入操作的顺序可能与调用的顺序不一样... - 每次调用
MPI_File_iwrite(...,&request)
时覆盖请求是确保永远不会检查所有写入操作完成的好方法...
两种解决方案:
- 坚持
MPI_File_write()
或在每次调用MPI_File_iwrite()
后立即调用MPI_Wait(&request,MPI_STATUS_IGNORE);
。这样,写入操作的顺序将与其中一个调用的顺序相同。 如果行的顺序无关紧要,下面的代码可能会起作用:
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 文档指出:
It is erroneous to call this function if MPI_MODE_SEQUENTIAL mode was specified when the file was opened.