c++ - OpenMP/C++ 如何并行递增一个变量?

标签 c++ for-loop parallel-processing openmp increment

我有一个问题,大问题=。 我有两个图像(使用 GDIplus),我想比较像素像素。 当 pixelA = pixelB 时,变量 cont 应该递增。

今天我比较两个相等的图像,我的返回应该是100%,但是这个返回是70%。

为什么?我该如何解决这个问题?

    #pragma omp parallel for schedule(dynamic) 
    for (int x = 0; x < height; x++){
        for (int y = 0; y < width; y++){
            int luma01 = 0, luma02 = 0;


            Gdiplus::Color pixelColorImage01;
            Gdiplus::Color pixelColorImage02;

                myImage01->GetPixel(x, y, &pixelColorImage01);
                luma01 = pixelColorImage01.GetRed() + pixelColorImage01.GetGreen() + pixelColorImage01.GetBlue();
                myImage02->GetPixel(x, y, &pixelColorImage02);
                luma02 = pixelColorImage02.GetRed() + pixelColorImage02.GetGreen() + pixelColorImage02.GetBlue();

                #pragma omp critical
                if (luma01 == luma02){
                    cont++;
                }
            }
        }

图像之间的相等百分比

谢谢 =)

最佳答案

在并行化您的解决方案之前,请确保您可以按顺序解决它。在这种情况下,这意味着注释掉 #pragma 并首先对其进行调试。

首先,

for (int x = 0; x < height; x++){
    for (int y = 0; y < width; y++){
        ...
        myImage01->GetPixel(x, y, &pixelColorImage01);

您调换了 widthheight,所以对于任何非正方形的图像,您都会得到错误的答案。

其次,您的像素平等指标容易发生冲突。由于您将各个颜色的亮度相加然后比较该总和,因此它会认为,例如,全红色像素等于全蓝色像素。
改为做这样的事情:

if (red1 == red2 && green1 == green2 && blue1 == blue2)
    cont++;

至于您的并行化,它在技术上是正确的,但会给您带来糟糕的性能。您在 if 周围放置了一个关键部分,这意味着是否所有工作人员都在不断尝试获取该锁。换句话说,您有并行工作人员,但每个工作人员都必须等待所有其他工作人员。换句话说,您已经序列化了您的并行代码。要解决此问题,请查找 OpenMP reducer 。

关于c++ - OpenMP/C++ 如何并行递增一个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21614008/

相关文章:

for-loop - delims 中的双引号=?

c++ - OpenMP 初学者 - 圈内问题

c - 减少最大值并保存其索引

c++ - QWidget继承自自定义QWidget

c++ - 将 boost phoenix lambda 与 io_service 一起使用

c++ - 构建 ATL 项目

C++ 中断 UDP 监听器。在 Xcode 中使用 oscpack 编译

javascript - Node.js mysql循环仅显示最后一个条目

javascript - JQuery 在点击时循环遍历

c++ - 什么是并行 for 循环,应该如何/何时使用它?