C++ 使用tbb::parallel_invoke时,是什么导致分段错误?
我尝试在Ubuntu18.04和gcc以及g++版本6上使用openmp和intel tbb来优化我的代码。我使用openmp为循环优化C++ 使用tbb::parallel_invoke时,是什么导致分段错误?,c++,tbb,C++,Tbb,我尝试在Ubuntu18.04和gcc以及g++版本6上使用openmp和intel tbb来优化我的代码。我使用openmp为循环优化,并使用tbb::parallel_invoke运行带有4个不同输入的1个函数 我尝试使用lambda表达式通过引用传递一些参数,但我不确定我写的是否正确。然而,当使用并行调用时,我不断得到“分段错误(核心转储)”错误 int-shrink=6; cv::Mat mat1、mat2; tbb::并行_调用([&] {mat1=myfunction(image1,
,并使用tbb::parallel_invoke
运行带有4个不同输入的1个函数
我尝试使用lambda表达式通过引用传递一些参数,但我不确定我写的是否正确。然而,当使用并行调用时,我不断得到“分段错误(核心转储)”错误
int-shrink=6;
cv::Mat mat1、mat2;
tbb::并行_调用([&]
{mat1=myfunction(image1,arg1,arg2)*shrink;},[&]
{mat2=myfunction(image2,arg1,arg2)*shrink;});
image1、image2和arg1是opencv矩阵,而arg2是我自己定义的类
当我在没有并行化的情况下运行程序时
mat1 = myfunction(image1, arg1, arg2) * shrink;
mat2 = myfunction(image2, arg1, arg2) * shrink;
没有问题,程序运行正常。我使用parallel_invoke,因为我希望这两个可以同时运行。由于arg1和arg2同时使用,它是否不起作用
我不知道该怎么办,因为分段故障(堆芯转储)
是终端中显示的全部内容
编辑:
这就是Myfunction()的外观:
Mat edgebox_main(Mat E0, Mat O0, _para o) {
// check and get inputs
arrayf E;
arrayf O;
int h = E0.rows;
O._h = E._h = h;
int w = E0.cols;
O._w = E._w = w;
E._x = new float[h * w];
O._x = new float[h * w];
getadd(E0, E._x);
getadd(O0, O._x);
//optionally create memory for visualization
arrayf V;
// setup and run EdgeBoxGenerator
EdgeBoxGenerator edgeBoxGen;
Boxes boxes;
edgeBoxGen._alpha = o.alpha;
edgeBoxGen._beta = o.beta;
edgeBoxGen._eta = o.eta;
edgeBoxGen._minScore = o.minScore;
edgeBoxGen._maxBoxes = o.maxBoxes;
edgeBoxGen._edgeMinMag = o.edgeMinMag;
edgeBoxGen._edgeMergeThr = o.edgeMinMag;
edgeBoxGen._clusterMinMag = o.clusterMinMag;
edgeBoxGen._maxAspectRatio = o.maxAspectRatio;
edgeBoxGen._minBoxArea = o.minBoxArea;
edgeBoxGen._maxBoxLength = std::min(std::min((int)o.maxBoxLength,h),w);
edgeBoxGen._gamma = o.gamma;
edgeBoxGen._kappa = o.kappa;
edgeBoxGen.generate(boxes, E, O, V);
boxesNms(boxes,edgeBoxGen._beta,edgeBoxGen._eta,edgeBoxGen._maxBoxes);
// create output bbs and output to Matlab
int n = (int) boxes.size();
float *bbs = new float[n * 5];
for (int i = 0; i < n; i++) {
bbs[i + 0 * n] = (float) boxes[i].c + 1;
bbs[i + 1 * n] = (float) boxes[i].r + 1;
bbs[i + 2 * n] = (float) boxes[i].w;
bbs[i + 3 * n] = (float) boxes[i].h;
bbs[i + 4 * n] = boxes[i].s;
}
Mat bbs_mat(n, 5, CV_32FC1);
fillmat(bbs, bbs_mat);
return bbs_mat;
}
Mat edgebox_main(Mat E0,Mat O0,_para o){
//检查并获取输入
arrayf E;
arrayf O;
int h=E0.5行;
O.h=E.h=h;
int w=E0.cols;
O._w=E._w=w;
E._x=新浮点数[h*w];
O._x=新浮点数[h*w];
getadd(E0,E.。x);
getadd(O0,O.。x);
//可以选择为可视化创建内存
arrayf V;
//设置并运行EdgeBoxGenerator
edgeBoxGen发电机;
盒子;
edgeBoxGen._alpha=o.alpha;
edgeBoxGen._β=o.beta;
edgeBoxGen._eta=o.eta;
edgeBoxGen._minScore=o.minScore;
edgeBoxGen._maxBoxes=o.maxBoxes;
edgeBoxGen._edgeMinMag=o.edgeMinMag;
edgeBoxGen._edgeMergeThr=o.edgeMinMag;
edgeBoxGen._clusterMinMag=o.clusterMinMag;
edgeBoxGen._maxAspectRatio=o.maxAspectRatio;
edgeBoxGen._minBoxArea=o.minBoxArea;
edgeBoxGen._maxBoxLength=std::min(std::min((int)o.maxBoxLength,h),w);
edgeBoxGen._gamma=o.gamma;
edgeBoxGen._kappa=o.kappa;
edgeBoxGen.生成(框、E、O、V);
boxesNms(盒子,edgeBoxGen.\u beta,edgeBoxGen.\u eta,edgeBoxGen.\u MaxBox);
//创建输出bbs并输出到Matlab
int n=(int)box.size();
浮动*bbs=新浮动[n*5];
对于(int i=0;i
这段代码调用了其他几个类和函数,我认为如果我把它们都写在这里,它们会太长。另外,我对Linux中的调试不是很有经验。我通常使用微软Visual Studio调试C++,所以我不知道如何在终端中生成附加调试信息,您有没有使用调试器或G+的建议?我收到了额外的错误信息,上面写着SIGSEGV错误。该错误基本上说明我试图访问数组中不可用的元素 您是否尝试使用读取核心转储或附加到进程的调试器获取任何其他调试信息,例如回溯?谢谢您的建议。我不知道该怎么做才能得到额外的错误信息,因为我仍然是C++初学者。在获得更多信息后,我将编辑我的问题。粘贴myfunction
的主体可能会有所帮助@AmirulHaq@v78好的,我已经包括在内了