Re: C++ OpenMP 多CPU同時處理可能的問題

看板Programming作者 (陳揚和)時間15年前 (2010/05/19 11:51), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/7 (看更多)
Sorry還是沒有懂 外面3G/64M=47的迴圈 是什麼意思 平均每個bucket 47個count但不一定阿.. 裡面是說 每個CPU負責一種bucket? 是這樣嗎 而且我後來大概算了一下 如果每個CPU count的cycle是同步的話 平均的collision大概是四百多個..假設少算四百多個也沒關係的話 不設mutex 會有什麼關係嗎 可能有大問題是說 一個CPU已經把counter加很多了 另一個CPU有可能把他歸零是這樣嗎 ※ 引述《sorryChen (陳揚和)》之銘言: : 感謝回覆 可是我沒有看懂耶 外面64個迴圈不用OpenMp然後裡面才用?? : 然後裡面才用 可以在指點一下嗎? : 有人建議我說 說不定一個CPU負責 一部分的counter 可能會比叫快 : 這樣雖然每個CPU都要把整個array讀一次 : 但是可能就不用只需要cache 一部分counter 到cache.. : ※ 引述《sorryChen (陳揚和)》之銘言: : : 我有一個很大的array大概是 3G 個數(其實是Human Genome) : : 我想要用多個CPU同時bucket這些數到 64 million個 bucket : : 一個簡單的sudo code 大概是這樣 : : int array[3G]; : : int counters[64M]; : : for( int i = 0; i < 3G; i++) { : : counter[array[i] % 64M] ++; : : } : : 如果用openMP平行時 其實只要在for loop 加一行annotation : : 但可能會發生剛好兩個CPU同時要算到一個counter會可能出錯 : : 但因為有64M個counter 所以剛好算到同一個機會很低 而且其實如果差異不大 : : 其實也還可以 : : 請問有人有類似的經驗嗎 有人說假設有16個CPU就設16 * 64M個 CPU的counter : : 最後在加起來 這個要 4G memory..可能還ok : : 另外設semaphore..好像會慢很多 但可能是我設的不好 : : 另外就是 假設有衝突 不知道會發生什麼是 就是有counter少加了而以嗎 : : 如果只要算個大概就好 可以直接去并行嗎 還是會memory有錯 : : 其實錯沒關係 但其實我比較希望多加兒不是少加 有什麼算法或programming上得技巧 : : 可以解決這個問題嗎 : ※ 引述《sorryChen (陳揚和)》之銘言: : : 我有一個很大的array大概是 3G 個數(其實是Human Genome) : : 我想要用多個CPU同時bucket這些數到 64 million個 bucket : : 一個簡單的sudo code 大概是這樣 : : int array[3G]; : : int counters[64M]; : : for( int i = 0; i < 3G; i++) { : : counter[array[i] % 64M] ++; : : } : : 如果用openMP平行時 其實只要在for loop 加一行annotation : : 但可能會發生剛好兩個CPU同時要算到一個counter會可能出錯 : : 但因為有64M個counter 所以剛好算到同一個機會很低 而且其實如果差異不大 : : 其實也還可以 : : 請問有人有類似的經驗嗎 有人說假設有16個CPU就設16 * 64M個 CPU的counter : : 最後在加起來 這個要 4G memory..可能還ok : : 另外設semaphore..好像會慢很多 但可能是我設的不好 : : 另外就是 假設有衝突 不知道會發生什麼是 就是有counter少加了而以嗎 : : 如果只要算個大概就好 可以直接去并行嗎 還是會memory有錯 : : 其實錯沒關係 但其實我比較希望多加兒不是少加 有什麼算法或programming上得技巧 : : 可以解決這個問題嗎 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 204.140.140.37
文章代碼(AID): #1Bys11BK (Programming)
討論串 (同標題文章)
文章代碼(AID): #1Bys11BK (Programming)