【发布时间】:2018-05-15 16:43:09
【问题描述】:
我在尝试并行化 for-loop 时遇到分段错误,我无法理解原因。
代码如下:
#pragma omp parallel for schedule(static) reduction(+:ptx,pty)
for(int i=0;i<numSteps;i++)
{
float energy=0;
for(int idx=0;idx<patternNum;idx++)
{
float hitColor = getInterpolatedElement31(frame->dI,
(float)(ptx+rotatetPattern[idx][0]),
(float)(pty+rotatetPattern[idx][1]),
wG[0]);
if(!std::isfinite(hitColor)) {energy+=1e5; continue;}
float residual = hitColor - (float)(hostToFrame_affine[0] * color[idx] + hostToFrame_affine[1]);
float hw = fabs(residual) < setting_huberTH ? 1 : setting_huberTH / fabs(residual);
energy += hw *residual*residual*(2-hw);
}
if(debugPrint)
printf("step %.1f %.1f (id %f): energy = %f!\n",
ptx, pty, 0.0f, energy);
errors[i] = energy;
if(energy < bestEnergy)
{
bestU = ptx; bestV = pty; bestEnergy = energy; bestIdx = i;
}
ptx+=dx;
pty+=dy;
}
std::cout << "hello\n";
这个for-loop所在的函数被多次调用,分段错误只是在这个函数的多次迭代之后引起的。
这就是我放置cout << "hello" 的原因,以查看"hello" 被打印了多少次。
然而,即使前几次迭代没有产生错误,我认为正在执行的计算的结果是不正确的,这是一个 SLAM 代码,所以在输出中我可以看到结果,在我得到分割之前错误,不是它应该是的。
你能在这个循环中看到任何可能使用这个编译指示产生这个错误的东西吗?
【问题讨论】:
-
请将代码转换为minimal reproducible example,并说明您自己调试的结果。
-
代码运行时是否没有错误,是否在串行中给出了正确的结果?你的第一句话听起来像,但对我来说并不完全清楚。
-
@Shadow 是的
标签: for-loop parallel-processing segmentation-fault openmp