Mpi_File_iwrite无法写入; aio_write()错误:参数无效

时间:2016-12-06 16:41:35

标签: parallel-processing mpi fwrite openmpi

 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它可以正常工作

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模式,则调用此函数是错误的。