2016-12-06 77 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

相關問題