→ purpose:題外話,t大的守備範圍真的很廣 08/14 14:58
→ tropical72:哪裡,都是版友們不吝指導牽成而已。 08/14 15:07
→ firejox:我覺得這兩個有兩個地方不一樣... 08/14 15:28
→ firejox:不... 是3個 = = 08/14 15:29
→ firejox:iterator!=ITER iterator<=ITER .... 08/14 15:31
→ firejox:i!=SIZE i<SIZE ... 08/14 15:31
謝謝指正, 確實沒改好,code2 確實仍比 code1 快一點.
推 VictorTom:要不要看一下code2的asm code? 感覺code2可能可以被 08/14 15:51
→ VictorTom:compiler optimize掉....@_@" 08/14 15:53
→ firejox:同樓上 現在優化的能力都有點可怕了...@@ 08/14 15:56
抱歉上面程式碼錯不少 (openmp compare operator 也不能用 != , <=)
我把我整段測過東西及結果放上來參考好了
<header 略>
#define ITER 100000
#define SIZE 20000
#define ELASPE(msg, t) {printf("%s elaspe: %ld\n",(msg),clock() - (t));}
int main(void)
{
int i, j, in[SIZE]={0};
clock_t t;
/* code 1 - omp inside, takes 891 */
memset(in, 0, SIZE);
t=clock();
for (i=0;i<SIZE;++i)
#pragma omp parallel for
for (j=0; j<ITER; ++j)
in[i] = i + 2680;
ELASPE("code1 (openmp inside)", t);
/* code 2 - normal, takes 1406 */
memset(in, 0, SIZE);
t=clock();
for (i=0;i<SIZE;++i)
for (j=0; j<ITER; ++j)
in[i] = i + 2680;
ELASPE("code2 (normal)", t);
/* code 3 - omp outside, takes 12062 */
memset(in, 0, SIZE);
t=clock();
#pragma omp parallel for
for (i=0;i<SIZE;++i)
for (j=0; j<ITER; ++j)
in[i] = i + 2680;
ELASPE("code3 (openmp outside)", t);
return 0;
}
這裡的真正問題是在於,parallel for 放的位置不對,效率會變差,
但的確就是不知道該如何判斷要放哪裡,和什麼參數有關,
從產生之 asm 看不出個所以然,故才在想應是哪些 background 不懂,
所以才想問有沒有書會特別拉 openmp / thread 在討論 XD
以上程式碼,vs 2008編譯參數
/O2 /Oi /Ot /GT /GL /D "_MBCS" /FD /EHsc /MT /GS- /arch:SSE2 /GR- /openmp
/FAs /Fa"Release\\" /Fo"Release\\" /Fd"Release\vc90.pdb" /W4 /nologo /c
/wd4996 /errorReport:prompt
出來的 asm : https://gist.github.com/1144706
※ 編輯: tropical72 來自: 180.177.78.41 (08/14 16:40)
→ proLIONS:看起來是有cache locality的問題 08/14 18:05
→ proLIONS:omp for放在j的時候threads寫到一段連續的區塊 08/14 18:06
→ proLIONS:omp for放在i的時候thread寫的位置錯開 08/14 18:07
→ proLIONS:如果離得夠遠不在同一條cache line上就會影響效能 08/14 18:08
→ proLIONS:asm code應該不容易看出來 尤其你又開O2 08/14 18:08
→ tropical72:謝謝 p 大指教*^_^* 08/14 23:07