2015-05-22 48 views
1

我對MPI中的文件寫入有些懷疑。假設我有一個程序工作的「N」no。在程序結束時,每個過程將具有「m」個粒子(位置+速度)。但是,每個過程的粒子數m不同。我如何將所有的粒子信息(pos + vel)寫入單個文件中。我從搜索中瞭解到,我可以通過MPI_File_open,MPI_File_set_view,MPI_File_write_all這樣做,但是我需要在每個進程中都有相同數量的粒子。任何想法如何我能做到這一點在我的情況?MPI寫入文件不等大小的向量

回答

0

需要執行

MPI_Allgather(np, 1, MPI_INTEGER, procnp, 1, & 
       MPI_INTEGER, MPI_COMM_WORLD, ierr) 

其中N p是每個進程和procnp顆粒的數量的工序nprocs大小數的陣列。這給你一個關於所有其他過程中分子數量的每個過程的數組。通過計算基於進程ID的偏移量,可以爲每個進程正確選擇MPI_File_set_view。這psudocode得到補償是一樣的東西,

procdisp = 0 
    !Obtain displacement of each processor using all other procs' np 
    for i = 1, irank -1 
     procdisp = procdisp + procnp(i)*datasize 
    enddo 

這是從FORTRAN代碼,以便irank是從1到nprocs

+0

非常感謝@Ed史密斯....這解決了我的問題。 –

1

你並不需要在每個處理器上相同數量的粒子拍攝。你需要的是每個處理器參與。一個或多個甚至可以有零粒子。 Allgather是一種很好的方法,並且所有進程之間交換的單個整數不是那麼大的開銷。

然而,更好的辦法是使用MPI_SCAN:

incr = numparts; 
MPI_Scan(&incr, &new_offset, 1, MPI_LONG_LONG_INT, 
         MPI_SUM, MPI_COMM_WORLD); 
new_offset -= incr; /* or skip this with MPI_EXSCAN, but \ 
         then rank 0 has an undefined result */ 
MPI_File_write_at_all(fh, new_offset, buf, count, datatype, status); 
+0

非常感謝您的回答.... –