2016-01-13 67 views
1

我是MPI和並行計算的新手。我在Fortran中編寫了簡單的MPI程序。但問題是MPI_FILE_READ_AT忽略並不讀取文件。MPI_FILE_READ_AT忽略文件(不讀取文件)

我的代碼是:

program O72 
    use mpi 
    !implicit none 
    INTEGER :: NINTS, DATATYPE, STATUS(MPI_STATUS_SIZE), mpierr, FH, i 
    integer :: taskid, no_tasks, FILESIZE, FILENO_2 
    INTEGER(KIND=MPI_OFFSET_KIND) :: OFFSET 
    INTEGER :: BUF(10) 
    character :: filename='ab.dat' 

    FILESIZE=10 
    BUF(:)=0 

    call MPI_INIT(mpierr) 
    call MPI_COMM_SIZE(MPI_COMM_WORLD,no_tasks,mpierr) 
    call MPI_COMM_RANK(MPI_COMM_WORLD,taskid,mpierr) 

    NINTS = FILESIZE/no_tasks !*INTSIZE) 
    OFFSET= taskid*NINTS !*INTSIZE 

    call MPI_File_open(MPI_COMM_WORLD, "ab.dat", MPI_MODE_RDONLY, & 
        MPI_INFO_NULL, FH, mpierr) 
    call MPI_FILE_READ_AT(FH, OFFSET, BUF, NINTS, MPI_INT, STATUS, mpierr) 

    write(6,*) taskid, no_tasks 
    call MPI_BARRIER(MPI_COMM_WORLD, mpierr) 
    write(6,*) 'taskid=',taskid,'NINTS=', NINTS 
    write(6,*) 'taskid_',taskid,'OFFSET=',OFFSET 

    write(6,*) BUF(:) 

    !call MPI_FILE_WRITE(FILENO_2, OFFSET, BUF, NINTS, DATATYPE, STATUS, mpierr) 

    call MPI_FILE_CLOSE(FH, mpierr) 
    !call MPI_FILE_CLOSE(FILENO_2) 

    call MPI_FINALIZE(mpierr) 

    end 

然後,輸入文件是2列的ASCII文件,其中第一列始終1和第二列始終2.

1  2 
1  2 
1  2 
1  2 
1  2 
1  2 
1  2 
1  2 
1  2 
1  2 

而輸出就這樣產生了與使用2處理器:

0   2 
1   2 
taskid=   1 NINTS=   5 
taskid_   1 OFFSET=     5 
taskid=   0 NINTS=   5 
taskid_   0 OFFSET=     0 
171051313 171051313 171051313 171051313 171051313   0   0   0   0   0 
822751753 822751753 822751753 822751753 822751753   0   0   0   0   0 

我不明白問題出在哪裏,以及爲什麼隨機值分配爲BUF(:)

你能幫我嗎?

回答

0

我想簡單的答案是,MPI-IO只執行二進制的IO,而你試圖在這裏實現的格式化的IO。

所以從這裏開始,你看,你有幾個問題,在您的代碼:

  1. 您文件的格式。正如我在序言中所說的那樣,MPI-IO只執行二進制IO,您必須切換到二進制輸入文件,或者將文件作爲一組字符串讀取,您必須在內部理解這些字符串。讓我們假設這篇文章的其餘部分,您的輸入文件現在是二進制文件。
  2. MPI_File_read_at()中使用的offset預計以字節爲單位。你傳遞的是一些元素。因此,您需要將此偏移量乘以您想要讀取的大小,也就是integer的大小。
  3. 最後,您打印完整的buf這是一個10 integer的數組,而您只能閱讀它們的nints。您可能應該只打印buf(1:nints)

因此,你的代碼應該工作。

+0

謝謝你的回答:) – GeezerButler