[問題] OMP速度, 變數宣告位置

看板C_and_CPP作者 (攸藍)時間10年前 (2014/02/20 17:43), 編輯推噓2(203)
留言5則, 4人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) Eigen (本問題不會利用到) 問題(Question): 第一個問題: omp的使用,為何速度有差異? 第一個是 int N = 200, n = 10; int run = N / n; int m[n][run] #pragma omp parallel for for(int i = 0; i < N; i++) { int p = i / run; int q = i - p*q; // do something m[p][q] = //something } 另外一種是 int N = 200, n = 10; int run = N / n; int m[n][run] #pragma omp parallel for for(int p = 0; p < n; p++) { for(int q = 0; q < run; q++) { // do something m[p][q] = //something } } 我的直覺是第二種應該比較慢 因為每一個執行序都要再跑一個迴圈 這樣最後不是要等其他完成才會結束程式嗎? 但其實實際測的結果是第二種比較快 有沒有誰可以跟我討論為什麼嗎? 還是我在迴圈裡面做的事情會影響結果? 第二個問題: 有關記憶體的問題,我還是一個對C++不是很熟的programer 我想問記憶體要如何控制比較好? 同前一個問題,我有兩層的迴圈 而迴圈中,我每次都必須宣告一個區域變數供迴圈使用, 我在迴圈外先宣告,然後再讓迴圈執行是否會比較快? 我知道一般情況可以,可是omp之下會發生錯誤,想知道omp是否也可行? 最後還有一個很笨的問題: 我通常都在程式最前面直接使用 using namespace std; 這樣的指令,這樣是不是加入太多不必要的函數,而減慢速度? 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 36.238.88.107

02/20 18:06, , 1F
一些常數可以試著在pragma時 宣告成private
02/20 18:06, 1F
private? 我試試看,謝謝。 ※ 編輯: celestialgod 來自: 36.238.88.107 (02/20 18:10)

02/20 18:36, , 2F
第一種迴圈 相較之下每次多計算一次除法和一次乘法
02/20 18:36, 2F

02/20 19:14, , 3F
此外平行處理時不是把 job 切得更細小就會變快.
02/20 19:14, 3F

02/20 19:15, , 4F
每個 job 跟 全部 job 個數都有要 "適當" 的大小.
02/20 19:15, 4F

02/20 21:57, , 5F
一個原因應該是 N 太小了,測量出來是誤差
02/20 21:57, 5F
文章代碼(AID): #1J1SvTlH (C_and_CPP)