作者celestialgod (攸藍)
看板C_and_CPP
標題[討論] OMP速度
時間Thu Feb 20 17:43:54 2014
開發平台(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