看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Linux 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) google/sparsehash.h 問題(Question): 大家好。 我的某個程式要開30個threads同時執行, 但這30個核心都要共用同一個Google Sparse Hash Map, 所以我餵給這些threads的是某個Hash Table的pointer, 因此它們會共用這張Hash Table。 問題來了,這樣執行起來往往會造成core dumped, 一開始我用#pragma omp critical 將寫入這張Hash Table的程式碼(只有一行)包起來, 執行起來居然會Core dumped! 後來改成將每個讀取或寫入到這張table的程式碼都包起來, 但這顯然不是個好辦法,因為30核的效果會大打折扣,趨近於單核的速度。 後來改成針對不同的key值, 用omp_test_lock和omp_unset_lock去包住, 區別不同的critical section。 卻還是會造成core dumped! 所以開始懷疑是不是Google Sparse Hash不支援以key區分不同的執行緒的功能? 能解決這奇怪問題的我願意給500P 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.123.104.195 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1458292838.A.62D.html
stupid0319: 用儲列排隊寫入? 03/18 17:30
這就不太清楚了,有相關範例說明嗎?
Schottky: 你的 omp_test_lock 沒 lock 到的話是怎麼處理的? 03/18 17:34
while(!omp_test_lock(locker)); 讓它自己無窮迴圈 ※ 編輯: henry8168 (140.123.104.195), 03/18/2016 18:29:58
Schottky: ..... 既然如此何苦用 test,用 omp_set_lock 不就好了 03/18 19:34
如果那個locker本來就是被set成1的呢?這代表已經有其他thread在做這塊了吧, 是要怎麼卡住其他threads的執行ˊ_>ˋ?
LiloHuang: 可考慮改用 Intel TBB 的 tbb::concurrent_hash_map 03/18 20:06
這不錯耶! 到concurrent hash table的官網,這邊大家可以載他們的source code安裝: https://www.threadingbuildingblocks.org/download#stable-releases 而這是簡單的code示範:http://goo.gl/Dqk2Xk
Schottky: ..... 若已經被 lock,omp_set_lock() 會 block 住, 03/18 21:55
Schottky: 等待此 lock 被其他人釋放,才取得 lock 繼續。 03/18 21:56
Schottky: 所以切記,一個 thread 千萬不可在手上持有 lock 時 03/18 21:58
Schottky: 再去 set 一次,這樣就變成永遠解不開的 dead lock 了 03/18 21:58
好像是你說的這樣沒錯!不過我剛改用omp_set_lock()和omp_unset_lock()去包住, Sparse Hash還是會core dumped耶...。 感覺是Google Sparse Hash本身就不支援同時讀取? ※ 編輯: henry8168 (36.236.72.170), 03/18/2016 22:20:09
Schottky: 基本上 omp_set_lock 和你原本的作法沒有多少差別 03/18 22:24
Schottky: 會 core dump 的還是會 core dump 03/18 22:25
Schottky: 我那樣問只是懷疑你在 omp_test_lock 沒鎖到時處理有錯 03/18 22:26
※ 編輯: henry8168 (58.115.109.218), 03/27/2016 01:41:42