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的笔记摘要

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