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.