C++ OpenMP/C++;如何并行增加一个变量?
我有一个问题,大问题=。 我有两个图像(使用GDIplus),我想比较像素。 当pixelA=pixelB时,变量cont应递增 今天,我比较两个相等的图像,我的回报应该是100%,但这个回报是70% 为什么??我如何解决这个问题 看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
#计划的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