C++ 如何对直方图相加进行并行化?
我有一个算法,它扫描一幅图像,对每一个像素p计算一个256格的直方图,在这个直方图中,p周围的面片内的像素值被保存。算法需要是O(1),因此需要进行许多直方图添加,我想通过使用OpenMP并行化直方图添加来提高算法的速度,因此我在每个for之前添加了C++ 如何对直方图相加进行并行化?,c++,parallel-processing,openmp,C++,Parallel Processing,Openmp,我有一个算法,它扫描一幅图像,对每一个像素p计算一个256格的直方图,在这个直方图中,p周围的面片内的像素值被保存。算法需要是O(1),因此需要进行许多直方图添加,我想通过使用OpenMP并行化直方图添加来提高算法的速度,因此我在每个for之前添加了#pragma omp parallel for(仅是添加了直方图的那些),但实际上它使算法的速度降低了10倍。我想我需要在外面创建一个平行区域,但我不知道如何创建 另外,我担心OpenMP产生的开销会克服并行化256 for所获得的速度,但我不确定
#pragma omp parallel for
(仅是添加了直方图的那些),但实际上它使算法的速度降低了10倍。我想我需要在外面创建一个平行区域,但我不知道如何创建
另外,我担心OpenMP产生的开销会克服并行化256 for所获得的速度,但我不确定
for (int i = 0; i < src.rows; i++) {
for (int j = 0; j < src.cols; j++) {
if (j == 0)
{ ... }
else {
if (j > side/2) { // subtract col
for (int h = 0; h < 256; h++) // THIS ONE
histogram[h] -= colHisto[j - (side/2) - 1][h];
}
if (j < src.cols - side/2) { // add column
if (i > side/2) { // subtract pixel
colHisto[j + side/2][src.at<uchar>(i - side/2 - 1, j + side/2)]--;
}
if (i < src.rows - side/2) { // add pixel
colHisto[j + side/2][src.at<uchar>(i + side/2, j + side/2)]++;
}
for (int h = 0; h < 256; h++) // AND THIS ONE
histogram[h] += colHisto[j + side/2][h];
}
}
}
}
for(int i=0;iside/2){//减去列
for(inth=0;h<256;h++)//这个
直方图[h]-=colHisto[j-(侧/2)-1][h];
}
如果(jside/2){//减去像素
colHisto[j+side/2][src.at(i-side/2-1,j+side/2)]--;
}
如果(i
实际上,我通过学习OpenMP解决了自己的问题。下面是代码
#pragma omp parallel
{
for (int i = 0; i < src.rows; i++) {
for (int j = 0; j < src.cols; j++) {
// printf("%d%d:", i, j);
if (j == 0) { ... }
else {
#pragma omp single
{ ... }
one = getTickCount();
#pragma omp for
for (int h = 0; h < 256; h++)
histogram[h] += colHisto[j + side / 2][h];
printf("histotime = %d\n", getTickCount() - one);
}
}
}
}
#pragma omp并行
{
对于(int i=0;i
它比在每个循环之前放置
#pragma omp parallel for
要快得多,但比顺序版本要慢得多直方图算法永远不会是O(1),因为它必须至少检查数组的每个元素一次。这使它成为O(n),其中n是数组大小(或面片数)。再多的并行化也不能改变时间复杂度。请忘记复杂性(相对于补丁的半径,它是O(1))这里真的不相关,我只需要并行化那256个循环,但问题是那些外部循环。你能添加更多细节吗?典型的输入图像有多大?补丁有多大?你在使用OpenCV吗?图像的内存布局是什么?最重要的是:您是否在启用优化的情况下验证了您的结果?我需要使用OpenMP获得这种行为:```` pragma omp parallel private(I,j,me,n){pragma omp single{for(int I=0;I<10;I++){for(int j=0;j<10;j++){if(j==0)}pragma omp for(int h=0;h<256;h++)//这一个柱状图[h]+=h2[h];}}}``可能重复的