c++ - 在 c++ 中执行此操作的最快方法是什么(使用 OpenMP)

标签 c++ opencv openmp

我有一个算法,我可以用伪代码编写如下:

for(int frame=0;frame <1000;frame++)
{
     Image *img=ReadFrame();
     mat processedImage=processImage(img);
     addtompeg(processedImage);
}

ProcessImage 非常耗时,大约需要 30 秒。 ReadFrame 和 AddToMpeg 并不慢,但它们需要按顺序完成(否则,fame 2 可能会在 frame 1 之前添加到输出中)。

如何使用 OpenMP 对其进行并行处理?

我正在使用 opencv 进行 readframe 和 addtompeg。

最佳答案

从技术上讲,在 OpenMP 中,您可以使用 ordered 子句以与程序顺序相同的顺序执行 for 循环的一部分(请参阅第 2.8.7 节) here)。无论如何,出于两个原因,我不建议使用此子句:

  1. 线程不得在同一循环中执行多个有序区域(这似乎不是您的情况)
  2. 在许多实现中,有序循环的行为很像顺序循环,对性能有不利影响

因此,在您的情况下,我的建议是展开循环:

Image * img           [chunk];
mat     processedImage[chunk];
/* ... */
for(int frame = 0; frame < nframes; frame += chunk) {

  #pragma omp single
  { /* Frames are read in sequential order */
    for( int ii = frame; ii < frame + chunk; ii++) {
       img[ii%chunk] = ReadFrame();
    }
  } /* Implicit barrier here */
  #pragma omp for
  for( int ii = frame; ii < frame + chunk; ii++) {
       processedImage[ii%chunk] = processImage(img[ii%chunk]); /* Images are processed in parallel */
  } /* Implicit barrier here */
  #pragma omp single
  { /* Frames are added to mpeg sequential order */
    for( int ii = frame; ii < frame + chunk; ii++) {
     addtompeg(processedImage[ii%chunk]);
    }
  } /* Implicit barrier here */
}

chunk 的取值主要取决于对内存的考虑。如果你认为内存不会有问题,那么你可以完全去掉外循环,让内循环从0nframes

当然必须注意正确管理外循环的剩余部分(我没有在代码片段中显示)。

关于c++ - 在 c++ 中执行此操作的最快方法是什么(使用 OpenMP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16754257/

相关文章:

c++ - "integer constant is too large for ‘long’ 求最大质因数时键入"

c++ - 在堆上分配时对齐内存

c++ - 用opencv错误搜索图像的均值和方差

c++ - 是否可以为并行区域中的共享二维数组创建选择元素的线程本地拷贝? (共享、私有(private)、屏障 : OPenMP)

c++ - 如何在 VS2013 项目配置中禁用链接步骤?

python - 是否可以在Linux上构建OpenCV应用并在Windows上执行它?

python - 使用python创建动态图像幻灯片

python - 使用 OpenCV (Python) 将 2 个图像写入时长 10 秒的视频

c++ - OpenMP自动更新数组值

c++ - 使用 openmp 并行化内循环