看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
Falldog:一些常數可以試著在pragma時 宣告成private 02/20 18:06
private? 我試試看,謝謝。 ※ 編輯: celestialgod 來自: 36.238.88.107 (02/20 18:10)
CaptainH:第一種迴圈 相較之下每次多計算一次除法和一次乘法 02/20 18:36
Feis:此外平行處理時不是把 job 切得更細小就會變快. 02/20 19:14
Feis:每個 job 跟 全部 job 個數都有要 "適當" 的大小. 02/20 19:15
johnjohnlin:一個原因應該是 N 太小了,測量出來是誤差 02/20 21:57