2012-09-19 31 views
0

對於在C中實現的數字例程,我需要從文件(ascii)中讀取數據。數據需要作爲數值計算的輸入,並且一般來說太大而不適合存儲器。因此,我需要動態地將它預取到某個數組,以便將其饋送到例程中(否則,讀取文件將會是計算中的僵局)。有沒有建立/簡單的方法來做到這一點使用stdlib,也許posix線程或MPI?我正在使用Linux下的intels MPI庫。用C和stdlib預取文件

例程func在下面的僞代碼中表示數值核心例程。它被稱爲非常頻繁的,用常微分方程的求解器來說。每次調用i時,都會調用具有已知值D的隨機浮動值x[i-1]<x[i]<x[i-1]+D。因此,有一些關於x的早期信息,它使我能夠在下一步中大致瞭解文件中需要哪些數據值。

read_file(x,data) 
{ 
    /* code to search x-dependent data in file */ 
    data[i]=...; 
} 

func(x) 
{ 

    read_file(x,&data); 

    /* several data- and x-dependent operations */ 
    result= ...; 

    return result; 

} 

雖然塊/* several data- and x-dependent operations */(和一些外部代碼)被執行我原則上可以預取需要的func從該文件的下一個呼叫到平行的緩衝器陣列中的數據。在下一次調用中,我可以搜索數組中的信息而不是文件。我詢問需要並行預取數據的代碼,並替換read_file(與文件讀取器通信的部分,下一步需要哪些數據)。理想情況下,如果/* several data- and x-dependent operations */塊需要大約多於搜索文件的時間,則不會花費任何額外的時間。如果代碼保持在它的執行時間將是約兩倍(忽略外部操作所需的時間)。請注意,如果該塊需要比讀取更多的時間,我可以輕鬆地將其並行化。我不能對現在的讀者做些什麼。

+1

爲什麼要預取它?不會按需閱讀嗎? – alk

+0

看到我上面的額外解釋! – highsciguy

+0

首先我想指出你對安吉爾的回答。其次,瞭解您的應用實際花費多少時間讀取一個計算步驟所需的數據以及後者運行的時間可能會很有趣。瞭解這一點肯定有助於決定是否花時間實施併發運行的數據讀取器。 – alk

回答

3

我建議你做的第一件事是將ASCII文件轉換爲二進制文件(例如,將本地雙精度字節存儲爲8字節,而不是ASCII字符串等)。在運行高分辨率有限元模型時,我一直在爲非常類似的事情苦苦掙扎。我正在使用triangle準備一個網格。不幸的是,它只有ascii輸入/輸出,對於大型網格來說,讀取數據需要很長時間!真。我修補了三角形以增加對二進制io的支持,所有問題都消失了。您可以使用標準fread將文件中的數據分配到分配的內存中,並且可以!當然,您必須以合理的方式將它們存儲在文件中,以便您可以訪問/讀取連續的塊。

您應該嘗試這樣做,因爲解析ASCII數據,特別是浮點數非常昂貴。如果仍有問題,則可能需要啓動一個後臺線程/工作程序,以便在其他線程執行計算的同時讀入數據。我只是在共享內存計算機上使用pthreads,讓MPI處理代碼的集羣版本。取決於你需要什麼。

如果您想要使用多線程IO,您正在尋找的是典型的生產者 - 消費者解決方案。有大量的例子在使用任何語言的簡單實現,並使用任何你喜歡的線程庫。使用pthreads在併發計算中查看this page discussing some classic examples

+0

謝謝!我一直知道ascii問題。這個問題幾乎是針對「將讀取數據的線程/工作者」的問題。我認爲這不是太困難,但我是線程編程的新手,我願意避免陷入陷阱。所以一個例子對我來說真的很有用。 – highsciguy

+0

@highsciguy看看最新的答案。 – angainor

+0

@highsciguy我的回答是否幫助您解決問題? – angainor