作者hardman1110 (笨小孩)
看板C_and_CPP
標題[問題] OpenMP 如何確定每顆核心都有用到?
時間Fri May 20 10:04:35 2016
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
g++ on Raspberry Pi 3
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
OpenCV OpenMP
問題(Question):
在加速一些追蹤的演算法,在雙核的筆電上以驗證過,速度變1.8倍
但在4核心的樹莓派3上卻也只大約變2倍
餵入的資料(Input):
可平行化的迴圈(如程式碼)
預期的正確結果(Expected Output):
速度變為原來的3倍多
錯誤結果(Wrong Output):
效能不符合預期
程式碼(Code):(請善用置底文網頁, 記得排版)
vector<double> vSumRadio(sampleBoxNum, 0);
#pragma omp parallel for num_threads(4)
for (int j=0; j< sampleBoxNum; j++)
{
double eSumRadioTmp = 0;
double eTmp1 = 0;
double eTmp2 = 0;
eSumRadioTmp = 0.0f;
for (int i = 0; i<featureNum; i++)
{
double ePosTmp = 0, eNegTmp = 0;
eTmp1 = (sampleValue[i][j]-Pos[i])*(sampleValue[i][j]-Pos[i]);
eTmp2 = (sampleValue[i][j]-Neg[i])*(sampleValue[i][j]-Neg[i]);
ePosTmp = exp(eTmp1/-(2.0f*sigmaPos[i]*sigmaPos[i]
+1e-30))/(sigmaPos[i] + 1e-30);
eNegTmp = exp(eTmp2/-(2.0f*sigmaNeg[i]*sigmaNeg[i]+
1e-30))/(sigmaNeg[i]+1e-30);
eSumRadioTmp += log(ePosTmp + 1e-30) - log(eNegTmp + 1e-30);
}
vSumRadio[j] = eSumRadioTmp;
}
補充說明(Supplement):
1. 原本沒用 num_threads(4),用omp_get_thread_num()抓出來的執行緒只有0跟1
2. omp_get_num_procs() 抓出來的核心數確定為4核心
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.251.212.76
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1463709878.A.999.html
※ 編輯: hardman1110 (111.251.212.76), 05/20/2016 10:29:55
推 Bencrie: 不是 top 看一下就知道了嗎 05/20 11:32
→ hardman1110: top是指?? 如果真的只用到其中兩顆核心 那要怎做才能 05/20 12:16
→ hardman1110: 4顆都用到呢? 05/20 12:17
推 Bencrie: /usr/bin/top 啊 05/20 12:33
→ james732: top是linux下的一隻程式,可看cpu使用率等資訊 05/20 13:36
→ james732: 不過我更喜歡htop 05/20 13:36
推 nowar100: time 看 real 和 user 的比例 05/20 13:44
→ hardman1110: 謝謝指導 還真的不知道top 看了一下CPU使用率,不管 05/20 15:11
→ hardman1110: 我有沒有強制切成4個執行緒,run程式時4顆cpu 05/20 15:12
→ hardman1110: 使用率都會增加到40~50% 原本都5%以內 05/20 15:13