gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:44:53 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com