Parallel processing Mpi_文件_iwrite写入失败;aio_write()错误:参数无效 if(我的排名==0) { sprintf(str,“\n”); MPI_文件iwrite(fp、str、strlen(str)、MPI_字符和请求); a=a+strlen(str); sprintf(str,“\n”); MPI_文件iwrite(fp、str、strlen(str)、MPI_字符和请求); a=a+strlen(str); sprintf(str,“\n”); MPI_文件iwrite(fp、str、strlen(str)、MPI_字符和请求); a=a+strlen(str); }

Parallel processing Mpi_文件_iwrite写入失败;aio_write()错误:参数无效 if(我的排名==0) { sprintf(str,“\n”); MPI_文件iwrite(fp、str、strlen(str)、MPI_字符和请求); a=a+strlen(str); sprintf(str,“\n”); MPI_文件iwrite(fp、str、strlen(str)、MPI_字符和请求); a=a+strlen(str); sprintf(str,“\n”); MPI_文件iwrite(fp、str、strlen(str)、MPI_字符和请求); a=a+strlen(str); },parallel-processing,mpi,fwrite,openmpi,Parallel Processing,Mpi,Fwrite,Openmpi,aio_write()错误:参数无效; 在关闭文件之前,我还有一个等待命令。 在使用openmpi/2.0.1的集群上使用时会发生此错误 在使用openmpi/1.10.1的本地计算机上,它工作正常是一种非阻塞操作。因此,它可以在被调用后立即返回,并在返回后读取str的内容。以下是几个后果: 在调用MPI\u File\u iwrite()之后立即修改缓冲区str不是一个好主意。实际上,在修改缓冲区str之前,必须检查写入操作的完成情况 连续调用MPI\u File\u iwrite()会导致

aio_write()错误:参数无效; 在关闭文件之前,我还有一个等待命令。 在使用openmpi/2.0.1的集群上使用时会发生此错误 在使用openmpi/1.10.1的本地计算机上,它工作正常

是一种非阻塞操作。因此,它可以在被调用后立即返回,并在返回后读取
str
的内容。以下是几个后果:

  • 在调用
    MPI\u File\u iwrite()
    之后立即修改缓冲区
    str
    不是一个好主意。实际上,在修改缓冲区
    str
    之前,必须检查写入操作的完成情况
  • 连续调用
    MPI\u File\u iwrite()
    会导致文件被置乱:写入操作的顺序可能与调用的顺序不同
  • 每次调用
    MPI\u File\u iwrite(…,&request)
    时覆盖请求是一种很好的方法,可以确保永远不会检查所有写入操作的完成情况
两种解决方案:

  • 坚持或调用
    MPI\u Wait(&request,MPI\u STATUS\u IGNORE)MPI\u File\u iwrite()
    后立即执行code>。这样,写操作的顺序将与其中一个调用相同
  • 如果行的顺序无关紧要,则以下代码可能会起作用:

     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);
       }
    
    if(我的排名==0)
    {
    char-str[142];
    char-str2[142];
    char-str3[142];
    MPI_请求请求[3];
    snprintf(str,142,“\n”);
    MPI_文件iwrite(fp、str、strlen(str)、MPI_字符和请求[0]);
    a=a+strlen(str);
    snprintf(STR2142,“\n”);
    MPI_文件iwrite(fp、str2、strlen(str2)、MPI_字符和请求[1]);
    a=a+strlen(str2);
    snprintf(STR3142,“\n”);
    MPI_文件iwrite(fp、str3、strlen(str3)、MPI_字符和请求[2]);
    a=a+strlen(str3);
    MPI_Waitall(3,请求,MPI_状态\u忽略);
    }
    
最后,关于和的Open MPI文档说明:

如果在打开文件时指定了MPI_MODE_SEQUENTIAL MODE,则调用此函数是错误的


答案1已完成,问题已解决,
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);
}