Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何对直方图相加进行并行化?_C++_Parallel Processing_Openmp - Fatal编程技术网

C++ 如何对直方图相加进行并行化?

C++ 如何对直方图相加进行并行化?,c++,parallel-processing,openmp,C++,Parallel Processing,Openmp,我有一个算法,它扫描一幅图像,对每一个像素p计算一个256格的直方图,在这个直方图中,p周围的面片内的像素值被保存。算法需要是O(1),因此需要进行许多直方图添加,我想通过使用OpenMP并行化直方图添加来提高算法的速度,因此我在每个for之前添加了#pragma omp parallel for(仅是添加了直方图的那些),但实际上它使算法的速度降低了10倍。我想我需要在外面创建一个平行区域,但我不知道如何创建 另外,我担心OpenMP产生的开销会克服并行化256 for所获得的速度,但我不确定

我有一个算法,它扫描一幅图像,对每一个像素p计算一个256格的直方图,在这个直方图中,p周围的面片内的像素值被保存。算法需要是O(1),因此需要进行许多直方图添加,我想通过使用OpenMP并行化直方图添加来提高算法的速度,因此我在每个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];}}}``可能重复的