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;