我寫了一個程序(使用FFTW)對OpenFOAM中寫入的一些數據文件執行傅立葉變換。C++中的文件的螺紋讀取
程序首先找到每個數據文件的路徑(在我當前的例子中是501個文件),然後拆分線程之間的路徑,例如thread0獲取路徑0-> 61,thread1獲取62-> 123左右等,然後在最後以串行方式運行其餘文件。
我已經在整個代碼中實現了定時器,以查看它的瓶頸位置,因爲每個文件的串行運行時間大約爲3.5s,並行運行時間爲8個文件的時間大約爲21s(從8s的8s減少到28s)。 5(串行時間),但不是那麼多)
我的代碼有問題的部分低於
if (DIAG_timers) {readTimer = timerNow();}
for (yindex=0; yindex<ycells; yindex++)
{
for (xindex=0; xindex<xcells; xindex++)
{
getline(alphaFile, alphaStringValue);
convertToNumber(alphaStringValue, alphaValue[xindex][yindex]);
}
}
if (DIAG_timers) {endTimerP(readTimer, tid, "reading value and converting", false);}
這裏,timerNow()返回時鐘值,並endTimerP計算,在已過去的時間女士。 (其餘的參數與它在並行線程中運行相關,爲了避免每個循環輸出8行等等,以及定時器測量的內容)。
convertToNumber獲取alphaStringValue上的值,並將其轉換爲double值,然後將其存儲在alphaValue數組中。
alphaFile是一個std :: ifstream對象,而alphaStringValue是一個存儲每行上的文本的std :: string。
要讀取的文件大約爲每個40MB(僅比5120000多幾行,每個文件只包含一個值,介於0和1之間(大多數情況下==(0 || 1)),我有16GB的RAM,所以將所有文件複製到內存當然是可能的,因爲只有8個(每個線程1個)應該一次打開。我不確定mmap是否會更好地完成這項工作?stackoverflow上的幾個線程討論了mmap vs更直接的讀操作,特別是順序訪問,所以我不知道這是否會有好處。
我試着用一個互斥鎖圍繞代碼塊,以便只有一個線程可以立即運行該塊,以防萬一讀取多個文件通過模糊的隨機訪問導致IO速度變慢,但這只是將過程簡化爲粗略y串行速度時間。
任何建議允許我更快地運行此部分,可能通過複製文件,或其他任何事情,將不勝感激。
編輯:
template<class T> inline void convertToNumber(std::string const& s, T &result)
{
std::istringstream i(s);
T x;
if (!(i >> x))
throw BadConversion("convertToNumber(\"" + s + "\")");
result = x;
}
原來一直緩慢的部分。我認爲這是由於每個文件創建500萬個字符串流,然後在條件下測試500萬個字符串?用TonyD的建議來替代它可能會消除發生錯誤的可能性,但可以節省大量(至少在這種受控情況下)不必要的操作。
您是否使用'time'(殼內置,或'在/ usr/bin中/ time')的基準程序(尤其是單線程的情況下)。你確定它不是I/O或系統CPU綁定的嗎?你願意花幾個小時的工作來改善幾個百分點嗎? –
定時器函數使用'gettimeofday',然後只計算差異,返回'unsigned long long's。程序的其餘部分每個循環的時間爲0.5s,而本節的每個線程爲3.5,所以不要認爲它是CPU的限制。我對IO的不太確定,但看起來我的硬盤驅動器幾乎沒有噪音,'iotop'和'dstat'顯示偶發的io,但主要是輸出,當程序稍後寫入時(此步驟僅需約0.1秒鐘,並受到互斥鎖,因爲進程都寫入一個文件) – chrisb2244
我寫了關於*系統CPU *(即CPU在內核中進行系統調用)。如果您堅持以編程方式計算時間,請使用[times(2)](http://man7.org/linux/man-pages/man2/times.2.html)和[clock_gettime(2)](http:// man7.org/linux/man-pages/man2/clock_gettime.2.html)並閱讀[time(7)](http://man7.org/linux/man-pages/man7/time.7.html)和[時間(1)](http://man7.org/linux/man-pages/man1/time.1.html)。不要忘記內核具有良好的文件系統和磁盤緩存。 –