[問題] OPENMP 寫入資料不同步

看板C_and_CPP (C/C++)作者時間15年前 (2011/02/16 01:37), 編輯推噓0(0018)
留言18則, 4人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) OpenMP 問題(Question): 使用OpenMP後資料寫入檔案有不同步的情形 程式碼(Code):(請善用置底文網頁, 記得排版) 因為程式碼有點長 大致上是如此 #pragma omp parallel for for (int par=0;par<4;++par) { for (int ii=0;ii<1000;++ii) { ofstream REC REC.open("file_(par)_(ii).txt.txt"); // par,ii 已轉成str REC<<step_x<<" "<<step_y<<" "<<step_z<<" "<<step_time[0]<<" "<<trace<<"\n"; flush(REC); while (n<10000) { 很多計算 寫入檔案 REC<<xx<<" "<<yy<<" "<<zz<<" "<<step_time<<" "<<itrace[Reci]<<"\n"; flush(REC); 清理變數 } REC.close(); } } 使用的電腦是Due Core 所以每次寫入的檔案順序為 file_0_000.txt file_2_000.txt . . . file_0_999.txt file_2_999.txt 結果看起來很正常 但我發現在file_0_000的檔案尾端吃到了file_0_001的頭 (如此一來 若我要另外讀檔做處理時(matlab處理數據) 就會發生錯誤) 而且因為整個計算是在for loop 所以沒辦法用barrier 想請問該如何讓thread同步 雖然照理來說 OPENMP在for迴圈內應該都是有內建barrier在最後一行才是 感謝解答~ 補充一下 這情形並沒有每次發生 感覺有點隨機 所以我才懷疑是不是有時候不同步 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 72.33.134.232 ※ 編輯: xellosss 來自: 72.33.134.232 (02/16 01:39) ※ 編輯: xellosss 來自: 72.33.134.232 (02/16 01:39)

02/16 01:44, , 1F
所以運算的相依性是怎樣?
02/16 01:44, 1F

02/16 01:49, , 2F
原PO的意思是都是OpenMP的錯囉??
02/16 01:49, 2F

02/16 01:51, , 3F
運算沒有任何相依性
02/16 01:51, 3F

02/16 01:52, , 4F
我不確定耶 因為若是沒有開openMP 是沒有任何問題的
02/16 01:52, 4F

02/16 01:53, , 5F
我感覺是第一個thread 在等第二個thread時 就先讀了
02/16 01:53, 5F

02/16 01:53, , 6F
下一個迴圈 所以值才會被寫入前一個檔案
02/16 01:53, 6F

02/16 02:03, , 7F
所以你所謂的錯誤跟不同步是指啥...先釐清問題吧...
02/16 02:03, 7F
※ 編輯: xellosss 來自: 72.33.134.232 (02/16 02:09)

02/16 02:10, , 8F
我改了一些內容 看這樣會不會清楚一些 感謝~
02/16 02:10, 8F

02/16 02:11, , 9F
其實問題就是前一個檔案的後面會吃到下一個檔案的前面
02/16 02:11, 9F
※ 編輯: xellosss 來自: 72.33.134.232 (02/16 02:13) ※ 編輯: xellosss 來自: 72.33.134.232 (02/16 02:14) ※ 編輯: xellosss 來自: 72.33.134.232 (02/16 02:23)

02/16 02:33, , 10F
要不要把REC每次讀檔就砍掉從練啊
02/16 02:33, 10F

02/16 02:52, , 11F
REC.close() 不是就是把REC砍掉了嗎??
02/16 02:52, 11F

02/16 11:05, , 12F
REC 變數宣告在哪? 上面的程式碼看不出前後檔案怎樣相依
02/16 11:05, 12F

02/16 12:55, , 13F
就剛好宣告在REC.OPEN上面
02/16 12:55, 13F

02/16 12:57, , 14F
前後檔案是沒有關連的 而且我檔案關掉後就不應該
02/16 12:57, 14F

02/16 12:58, , 15F
會再有檔案被讀進去阿@@ 一個一個跑又很正常
02/16 12:58, 15F
※ 編輯: xellosss 來自: 204.15.26.236 (02/16 12:59)

02/16 23:03, , 16F
thread 0, 1 分別跑 par (0,1) (2,3) 的內部迴圈
02/16 23:03, 16F

02/16 23:05, , 17F
T0: 0_000 完才會跑 0_001 從你上面寫的看來
02/16 23:05, 17F

02/16 23:05, , 18F
跟 T1 似乎沒有關係
02/16 23:05, 18F
文章代碼(AID): #1DMhdfya (C_and_CPP)
文章代碼(AID): #1DMhdfya (C_and_CPP)