Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 当平行剖面创建cv::Mat时,Omp临界行为不同_Opencv_Openmp - Fatal编程技术网

Opencv 当平行剖面创建cv::Mat时,Omp临界行为不同

Opencv 当平行剖面创建cv::Mat时,Omp临界行为不同,opencv,openmp,Opencv,Openmp,我编辑了这个问题(希望)使问题更清楚。 以下函数包含两个相同的代码块。每个块产生的输出是不同的。具体来说,在执行第一个关键部分时,“done”变量没有正确更新。临界段似乎确实具有防止输出混合的效果。第二块代码似乎产生了预期的输出。生成的输出遵循代码 有人对这种行为有什么解释吗。我开始怀疑微软有一个bug。我正在使用VisualStudio2010高级SP1进行开发 感谢您提供的任何见解 void OmpTest(int iterations) { int done; // . . . .

我编辑了这个问题(希望)使问题更清楚。 以下函数包含两个相同的代码块。每个块产生的输出是不同的。具体来说,在执行第一个关键部分时,“done”变量没有正确更新。临界段似乎确实具有防止输出混合的效果。第二块代码似乎产生了预期的输出。生成的输出遵循代码

有人对这种行为有什么解释吗。我开始怀疑微软有一个bug。我正在使用VisualStudio2010高级SP1进行开发

感谢您提供的任何见解

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