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

C++ OpenMP/C++;如何并行增加一个变量?,c++,for-loop,parallel-processing,openmp,increment,C++,For Loop,Parallel Processing,Openmp,Increment,我有一个问题,大问题=。 我有两个图像(使用GDIplus),我想比较像素。 当pixelA=pixelB时,变量cont应递增 今天,我比较两个相等的图像,我的回报应该是100%,但这个回报是70% 为什么??我如何解决这个问题 看 #计划的pragma omp并行(动态) 对于(int x=0;xGetPixel(x、y和pixelColorImage02); luma02=pixelcolormage02.GetRed()+pixelcolormage02.GetGreen()+pixel

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

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

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

#计划的pragma omp并行(动态)
对于(int x=0;xGetPixel(x、y和pixelColorImage01);
luma01=pixelcolormage01.GetRed()+pixelcolormage01.GetGreen()+pixelcolormage01.GetBlue();
myImage02->GetPixel(x、y和pixelColorImage02);
luma02=pixelcolormage02.GetRed()+pixelcolormage02.GetGreen()+pixelcolormage02.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);

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

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

请参阅我的代码的结果:

使用#pragma omp parallel进行调度(动态,1024)缩减(+:cont) 并行时间(0.763秒)(100%相似性) 连续时间(0.702秒)(100%相似性)

使用#pragma omp parallel进行进度(动态)缩减(+:cont) 并行时间(0.113秒)(相似性的66%) 连续时间(0.703秒)(100%相似性)

图像1等于图像2。 我的代码中还有很多冲突=\ 我需要减少并行代码的时间。我不明白为什么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());


        }

    }
#pragma omp并行计划(动态)缩减(+:cont)
对于(int x=0;xGetPixel(x、y和pixelColorImage01);
myImage02->GetPixel(x、y和pixelColorImage02);
cont+=(pixelColorImage01.GetRed()==pixelColorImage02.GetRed()&&pixelColorImage01.GetGreen()==pixelColorImage02.GetGreen()&&pixelColorImage01.GetBlue()==pixelColorImage02.GetBlue());
}
}
顺序代码

#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());


        }

    }
for(int x=0;xGetPixel(x、y和pixelColorImage01);
myImage02->GetPixel(x、y和pixelColorImage02);
cont+=(pixelColorImage01.GetRed()==pixelColorImage02.GetRed()&&pixelColorImage01.GetGreen()==pixelColorImage02.GetGreen()&&pixelColorImage01.GetBlue()==pixelColorImage02.GetBlue());
}
}

您可能需要检查的返回值。你确定图像完全相同吗?您是否正确加载了它们?你计算的百分比正确吗?按照亚当的说法交换宽度和高度。更改为
#pragam omp parallel以减少计划(静态)(+:cont)
。删除crtical部分并将
if(luma02==luma02){cont++;}
更改为
cont+=(luma01==luma02)
我不明白为什么要使用
计划(动态)
。尝试
计划(静态)
。此外,如果颜色存储为整数(4个压缩字节RGBA),您可能只需要比较整数而不是独立字节。我尝试了schedule(static),但没有成功=\什么是不成功?我的应用程序返回图像之间的相似性。当我比较两个图像时,相等的并行代码:72%的相似性;顺序代码:100%相似性变量“cont”有许多共线=\I未成功使用#pragma omp parallel for schedule(动态)#pragma omp parallel for schedule(动态,1024)#pragma omp parallel for schedule(静态)#pragma omp atomic