背景
最近又需要進行性能優化了,偶然接觸到一個openmp的相關只是 學習了2天 感覺受益匪淺
主要對openmp如何進行多線程的方便設計很感興趣
問題
項目中使用了openmp,對一個for循環中的vector進行了push_back的操作導致了段錯誤
看了下stackoverflow的相關問題的解釋 是由於push_back帶來的vector內存擴充而引起的
解決思路及參考代碼
定義vector時直接設置好容量大小 之後使用拷貝賦值操作而非push_back或者insert等對內存realloction的操作
vector<Mat> vecDspts(retnum); // 圖像數據集ORB描述子存儲vector
vector<string> goodImgs(retnum); // 預先設置數量就不用了reallocation
vector<int> vecRetCode(retnum); //返回值 根據返回值刪除部分錯誤的數據
int ncore = omp_get_num_procs(); //獲取執行核的數量
double t0 = elapsed();
#pragma omp parallel for num_threads(2*ncore) //96個線程 48*2
for (int i = 0; i < retnum; i++)
{
Mat descriptors;
int ret = featureGen(vecFiles[i], descriptors);
vecDspts[i] = descriptors;
goodImgs[i] = vecFiles[i];
vecRetCode[i] = ret;
}
cout << "success and good files: " << goodImgs.size() << " and dpts num: " << vecDspts.size() << endl; // 注意 這裏的容器應該一一對應
cout << "costs time: " << elapsed() - t0 << endl;