看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) minGW64 GCC 4.7.2 win 7 X64 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) OpenMP 問題(Question): 如何對多顆實體硬碟同時寫入? /////////程式碼的想法/////////////// 在程式碼(1)時程式碼是 資料計算完成-->寫第一筆資料-->寫第二筆資料-->寫第三筆資料-->結束main 在程式碼(2)時"希望"程式分別對三顆實體硬碟寫入 |--->寫第一筆資料--| 資料計算完成--+--->寫第二筆資料--+--->結束main |--->寫第三筆資料--| ////////// 發現問題 //////////////// 但程式碼(2)實際跑的時間 "大於" 程式碼(1)實際跑的時間 很明顯在程式碼(2)沒有同時寫入 也是跟(1)一樣一筆一筆慢慢寫入 所以我想問:如何對多顆實體硬碟同時寫入? 程式碼(Code): (1)原來的程式碼 /*寫入資料的函數*/ void WriteData(char*Path,double*buffer){ FILE *fPtr; fPtr = fopen(d:\\1\\123.txt, "wb"); fwrite(buffer1,sizeof(double),FiM.n2,fPtr); fclose(fPtr); } int main (void){ /*計算要寫入的東西*/ //開始寫入東西 WriteData(d:\\1\\123.txt,buffer1); // 對 d:\\1\\ 寫入第一筆資料 WriteData(d:\\2\\123.txt,buffer1); // 對 d:\\2\\ 寫入第二筆資料 WriteData(d:\\3\\123.txt,buffer1); // 對 d:\\3\\ 寫入第三筆資料 return 0; } (2)改成多顆同時寫入 d,e,f分別為不同顆的實體硬碟 int main (void){ /*計算要寫入的東西*/ //開始寫入東西 #pragma omp parallel sections{ #pragma omp section{ WriteData(d:\\1\\123.txt,buffer1); // 對 d:\\1\\ 寫入第一筆資料 } #pragma omp section{ WriteData(e:\\2\\123.txt,buffer1); // 對 e:\\2\\ 寫入第二筆資料 } #pragma omp section{ WriteData(f:\\3\\123.txt,buffer1); // 對 f:\\3\\ 寫入第三筆資料 } } return 0; } 預期的正確結果(Expected Output): 程式碼(2)速度應快於程式碼(1) 錯誤結果(Wrong Output): 程式碼(1)較快 補充說明(Supplement): 執行緒有開出來 所以猜是 win7 system 寫檔的問題 -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.63.132
sitos:說不定開 thread 比 fwrite 寫到 buffer 還久 10/30 10:10
sitos:不過 WriteData 那個 function 好像寫得怪怪的 10/30 10:38
wope:WriteData 那個只是我寫一部分過來 他實際上寫入約為1MB 10/30 10:50
wope:經過測試主要還是卡在寫入硬碟 10/30 10:51
wope:我一個檔案只寫一次就關起來了(剩下的都在buffer操作) 10/30 10:53
wope:目前是CPU沒有跑滿 硬碟IO數也不多 寫入的MB也不多 10/30 10:55
Schottky:每個檔都只寫一次就關起來... 那時間應該都花在開關檔吧 10/30 10:57
wope:回Schottky: 我沒想過這個問題 那這要怎麼加速 10/30 11:01
wope:經過這幾天的測試經驗 非常有可能 10/30 11:01
Schottky:將作業系統更換為Linux。警告:這個動作可能會損失資料。 10/30 11:47
Schottky:Windows處理許多小檔案時就會特別慢,這個無解... 10/30 11:49
Schottky:只能儘量把要寫的內容合併到同一個檔案裡面去 10/30 11:50
Schottky:程式一倒可以試試 Windows Overlapped I/O 10/30 11:52
Schottky:不過即使沒有這些問題,程式二本來也就不可能比程式一快啊 10/30 11:58
Schottky:瓶頸在 disk I/O, 不關 CPU thread 的事 10/30 11:59
回Schottky: 程式2是多顆實體硬碟 程式1是單顆硬碟 多顆實體硬碟理論上是可以同時disk I/O的呀(還是我想錯了)
xvid:1MB*3對硬碟來說不是小菜一碟嗎? 10/30 20:51
xvid:資源檢視器上的硬碟有很忙碌嗎? 10/30 20:52
我是覺得沒有 平均30 IO/sec 所以我一直在想卡在哪裡 感覺會部卡在4k以下的小檔 (我程式中除三個1MB之外還有7個1KB的小檔寫入 本來想不是重點) 剛剛在網路上找到測試文 http://home.gamer.com.tw/creationDetail.php?sn=2037702 在4k時讀寫 一般硬碟約在 1.3~1.4 MB/sec (寫入平均) 我的程式約在 6MB/sec (4硬碟) 1 MB*3*17(每分鐘跑17組)/60 ~~ 0.85MB/sec 小檔處理速度:6-0.85=5.15 MB/sec 平均單硬碟: 5.15/4=1.2875 MB/sec (約在測試文的 95.37% 的效能) 所以是小檔處理的問題了嗎?
holyspectral:可詳見windows internals 10/30 23:23
holyspectral:Windows kernel一次只能處理一個I/O 10/30 23:24
holyspectral:所以multi-thread跑I/O不會有幫助 10/30 23:24
holyspectral:sorry 弄錯,請無視 10/30 23:54
※ 編輯: wope 來自: 220.133.104.111 (10/31 08:46) ※ 編輯: wope 來自: 220.133.104.111 (10/31 10:09)