2011-06-15 41 views
2

我正在寫一個MPI程序,需要將文件的一部分一次一個地讀入內存,每次一個文件進入可用進程。因此我使用共享的文件指針。該文件的第一部分是我想閱讀並分發到所有進程的頭文件,我已經設法通過在主進程上讀取它並將其廣播到所有其他進程來實現此目的。MPI文件視圖和IO

該文件的下一部分是一個長的(理論上高達幾千兆字節)浮動三元組數組。我想爲所有進程設置fileview,以便它從這個數組的開始處開始,並且每個進程都應該能夠看到整個數組。此外,這是我真正的問題,我不希望進程看到這個數組之外,所以當他們遇到最後一組3個浮點數時,他們會報告EOF。所以在實踐中,每個進程只會看到一個長3浮點數組,而沒有別的。

頭已經閱讀這之後是我的代碼:

MPI_Datatype particle_type; 
MPI_Type_contiguous(3,MPI_FLOAT,&particle_type); 
MPI_Type_commit(&particle_type); 
MPI_Offset cur_file_pos; 
MPI_File_get_position_shared(fh,&cur_file_pos); 
MPI_File_set_view(fh, cur_file_pos, particle_type, particle_type, (char *) "native", MPI_INFO_NULL); /* fh is the file-handle from MPI_File_open */ 

據我所知,這只是簡單地忽略了頭,但數組後的文件視圖不會停止,它繼續進入下一部分我不感興趣的文件。任何人都可以幫我解決這個簡單的問題嗎?我一直無法找到任何地方的文件視圖的任何徹底的解釋(與例子)。

回答

2

不幸的是,MPI_File_set_view不會爲你做這個;一旦你超越了filetypefiletype重複。雖然MPI_File_set_view允許您在進程之間對文件視圖進行分區,但它不會讓您像這樣「截斷」文件的視圖。

如果您使用共享文件指針,大概最簡單的做法是循環,直到新位置==粒子數量(一旦設置了視圖,文件指針以etypes爲單位)。

+0

謝謝你的回答,那也是我的解決方法。這看起來很不方便。在共享文件指針的文件視圖中我沒有看到太多的用處。 – user787267 2011-06-16 12:09:23

+0

我傾向於同意。 – 2011-06-16 12:32:59