繁体   English   中英

OpenMP / C ++如何并行增加变量?

[英]OpenMP/C++ How to increment a variable in parallel for?

我有一个问题,大问题=。 我有两个图像(使用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减速器。

我很高兴您的回答! 亚当,我换了Matriz的位置。 现在,我比较各个颜色! 现在,我有两个小问题。 当我运行代码时:

查看我的代码结果: http : //postimg.org/image/8c1ophkz9/

使用#pragma omp parallel进行时间表(dynamic,1024)减少(+:cont)并行时间(0.763秒)(相似度的100%)顺序时间(0.702秒)(相似度的100%)

使用#pragma omp parallel进行调度(动态)减少(+:cont)并行时间(0.113秒)(相似度的66%)顺序时间(0.703秒)(相似度的100%)

image1等于image2。 我的代码中有很多大肠菌病= \\我需要减少并行代码的时间。 我不明白为什么o并行代码比顺序代码更慢= \\

并行代码

#pragma omp parallel for schedule(dynamic) reduction(+:cont)
                for (int x = 0; x < width; x++){
                    for (int y = 0; y < height; y++){

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

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


                    }

                }

顺序码

        for (int x = 0; x < width; x++){
        for (int y = 0; y < height; y++){

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

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


        }

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM