2012-02-18 44 views
3

我使用MPI2.2標準寫在C.並行程序我有64位機。MPI_offset的範圍在MPI

/* MPI offset is long long*/ 

MPI_Offset my_offset; printf ("%3d: my offset = %lld\n", my_rank, my_offset); 

int count; 
MPI_Get_count(&status, MPI_BYTE, &count); 

printf ("%3d: read =%d\n", my_rank, count); 

我正在逐字節讀取一個非常大的文件。要平行讀取文件,我使用偏移量設置每個進程的偏移量。我對MPI_offset類型的數據類型有困惑,那"whither it is signed or unsigned"長?

第二個問題是關於其在MPI_Get_count()函數中使用的「範圍計數變量的」的限制。因爲此功能用於讀取每個進程緩衝區中的所有元素so i think it should also be of the long long type to read such a very large file.

+0

這個文件在硬盤上嗎?你意識到試圖像這樣並行讀取一個文件可能會比單個閱讀器慢得多。 – Janne 2012-02-18 12:58:09

+1

是文件在磁盤上。我正在使用MPICH2並行I/O通過「總字節數/ NP」大小塊並行讀取文件。其中NP是要創建的進程的數量。 – Gopal 2012-02-18 13:24:50

+1

@Janne:如果您擁有專爲並行IO設計的硬件和文件系統(例如Lustre),它當然可以更快。這在HPC中很常見。 – janneb 2012-02-18 14:12:01

回答

4

MPI_Offset的大小不是由標準定義的 - 它大致上儘可能大。 ROMIO是MPI-IO廣泛使用的基礎實現,在支持它們的系統上使用8字節整數。您可以通過查看系統的mpi.h來找到肯定的答案。

MPI_Offset十分肯定地簽署;有類似MPI_File_seek的函數,MPI_Offset類型的值取負值是完全合理的。

MPI_Get_count返回一個整數正常整數大小的,這當然會引起一些大型文件IO的戰略問題。

一般來說,它是一個數量的理由不這樣做MPI-IO時,使用IO的小型低級別的單位,比如字節更好;在性能和代碼可讀性方面表現更好,以基礎數據類型爲單位來表達IO。在這樣做時,這些尺寸限制變得不太成問題。如果您的底層數據類型真的是字節,但是,並不是很多選項。

+0

我有一個大小爲40GB的文件,每行包含一個最大30字節的字符串。我正在使用MPI_File_read(fh,read_buffer,chunk,MPI_BYTE,&status);由每個進程閱讀。是否有任何其他級別的單位閱讀它有更好的表現? – Gopal 2012-02-18 15:34:30

+0

其他,這是一個艱難的;我想,我記得你之前詢問過這個版本。我認爲答案是否定的,給你的文件沒有更好的方法。如果您知道該文件具有最多30個字節的記錄,是否可以運行一次性轉換以確保每個記錄具有恰好30個字節(例如,只填充短行),然後使用MPI-IO ?您將支付一次性轉換成本,但固定記錄長度文件上的操作將更快更簡單。 – 2012-02-18 15:44:40

+0

該標準的2.2版說,MPI_Offset應該是在目標體系結構中保持任何有效文件大小所需的大小的整數。然後標準繼續定義「MPI_Offset」的「external32」表示應該是8個字節長。去搞清楚。 – 2014-08-01 12:02:50

0

你嘗試交錯MPI_File_read喜歡的東西MPI_File_seek(mpiFile,mpiOffset,MPI_SEEK_CUR)?這樣你可以成功避免MPI_Offset溢出