2016-12-06 36 views
1
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写入失败; aio_write()错误:无效参数

+0

答案1已完成,问题已解决, – BatiCode

回答

0

MPI_File_iwrite()是一个非阻塞操作。因此,它可以在被调用后立即返回,并在返回后阅读str个世纪的内容。以下是一些后果:

  • 在调用MPI_File_iwrite()后立即修改缓冲区str不是一个好主意。事实上,在修改缓冲区str之前,必须检查写入操作的完成!
  • MPI_File_iwrite()连续调用可能会导致炒文件:写操作的顺序可能是类似调用的顺序...
  • 改写请求每次MPI_File_iwrite(...,&request)被称为是确保一个很好的方式所有的写操作完成将永远不会被检查...

两个解决方案:

  • 玉碎MPI_File_write()或每次调用后立即打电话。这样,写入操作的顺序将与其中一个调用相同。
  • 如果行的顺序并不重要,下面的代码可能做的伎俩:

    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对MPI_File_iwrite()MPI_File_write()状态的文档是:

It is erroneous to call this function if MPI_MODE_SEQUENTIAL mode was specified when the file was opened.

+0

我已经切换到MPI_File_write; – BatiCode