Opencv 当平行剖面创建cv::Mat时,Omp临界行为不同
我编辑了这个问题(希望)使问题更清楚。 以下函数包含两个相同的代码块。每个块产生的输出是不同的。具体来说,在执行第一个关键部分时,“done”变量没有正确更新。临界段似乎确实具有防止输出混合的效果。第二块代码似乎产生了预期的输出。生成的输出遵循代码 有人对这种行为有什么解释吗。我开始怀疑微软有一个bug。我正在使用VisualStudio2010高级SP1进行开发 感谢您提供的任何见解Opencv 当平行剖面创建cv::Mat时,Omp临界行为不同,opencv,openmp,Opencv,Openmp,我编辑了这个问题(希望)使问题更清楚。 以下函数包含两个相同的代码块。每个块产生的输出是不同的。具体来说,在执行第一个关键部分时,“done”变量没有正确更新。临界段似乎确实具有防止输出混合的效果。第二块代码似乎产生了预期的输出。生成的输出遵循代码 有人对这种行为有什么解释吗。我开始怀疑微软有一个bug。我正在使用VisualStudio2010高级SP1进行开发 感谢您提供的任何见解 void OmpTest(int iterations) { int done; // . . . .
void OmpTest(int iterations)
{
int done;
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
done = 0;
#pragma omp parallel for
for (int ii = 0; ii < iterations; ++ii)
{
// do something useful
cv::Mat frame(32, 32, CV_8UC1, cv::Scalar(255));
// now update
#pragma omp critical
{
++done;
cout << setw(3) << 100 * done / iterations << "% "
<< setw(3) << done << " of " << setw(3) << iterations
<< " ii = " << ii << endl;
}
}
cout << endl;
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
done = 0;
#pragma omp parallel for
for (int ii = 0; ii < iterations; ++ii)
{
// do something useful
cv::Mat frame(32, 32, CV_8UC1, cv::Scalar(255));
// now update
#pragma omp critical
{
++done;
cout << setw(3) << 100 * done / iterations << "% "
<< setw(3) << done << " of " << setw(3) << iterations
<< " ii = " << ii << endl;
}
}
cout << endl;
}
您可以从输出中看到“done”变量在第一个过程中没有正确更新。它确实在第二天正确更新。我不明白cv::Mat的实例化和初始化应该如何改变关键部分的行为。您是否尝试在关键部分打印“ii”的值?我尝试过。太长,不能放在这里,但是有8个线程,第一个线程处理ii={0,1}。第二个线程处理ii={2,3},等等。在不创建cv::Mat的情况下,两个代码块都会产生预期的输出(第二个输出块)。
% OmpTest
6% 1 of 16 ii = 0
12% 2 of 16 ii = 1
6% 1 of 16 ii = 8
6% 1 of 16 ii = 6
6% 1 of 16 ii = 12
6% 1 of 16 ii = 2
6% 1 of 16 ii = 4
6% 1 of 16 ii = 14
12% 2 of 16 ii = 15
12% 2 of 16 ii = 9
12% 2 of 16 ii = 7
12% 2 of 16 ii = 13
12% 2 of 16 ii = 3
12% 2 of 16 ii = 5
6% 1 of 16 ii = 10
12% 2 of 16 ii = 11
6% 1 of 16 ii = 10
12% 2 of 16 ii = 2
18% 3 of 16 ii = 3
25% 4 of 16 ii = 14
31% 5 of 16 ii = 15
37% 6 of 16 ii = 12
43% 7 of 16 ii = 8
50% 8 of 16 ii = 4
56% 9 of 16 ii = 11
62% 10 of 16 ii = 6
68% 11 of 16 ii = 0
75% 12 of 16 ii = 13
81% 13 of 16 ii = 9
87% 14 of 16 ii = 5
93% 15 of 16 ii = 7
100% 16 of 16 ii = 1