openmp處理vector

背景

最近又需要進行性能優化了,偶然接觸到一個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;

這裏是寫的一篇關於openmp的筆記摘要

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章