OpenMP缩减了并行循环并减少了

时间:2019-05-09 22:22:06

标签: c multithreading for-loop openmp reduction

我正在尝试将这种折叠循环与openMP并行化,但这就是我得到的: “ smooth.c:47:6:错误:在'sum'sum = 0之前,嵌套循环不够完善;”

有人知道并行化此方法的好方法吗?我在这个问题上停留了2天。

这是我的循环:

long long int sum;  
#pragma omp parallel for collapse(3) default(none) shared(DY, DX) private(dx, dy) reduction(+:sum) 
            for (y = 0; y < height; y++) {
                for (x = 0; x < width; x++) {
                     sum = 0;
                    for (d = 0; d < 9; d++) {
                        dx = x + DX[d];
                        dy = y + DY[d];
                        if (dx >= 0 && dx < width && dy >= 0 && dy < height)
                            sum += image(dy, dx);
                    }
                    smooth(y, x) = sum / 9;
                }
            }

完整代码: https://github.com/fernandesbreno/smooth_

1 个答案:

答案 0 :(得分:1)

  

我正在尝试将这种折叠循环与openMP并行化,但这就是我得到的:“ smooth.c:47:6:错误:在'sum'sum = 0之前没有足够嵌套的循环;”

您不能折叠三个循环级别,因为第三个级别未完全嵌套在第二个级别内。有

sum = 0;

之前和

smooth(y, x) = sum / 9;

在中间循环之后。 (我想smooth()是一个宏,否则分配没有意义。但是,不要这样做,因为会造成混淆。)

请考虑如何利用对问题结构和细节的了解,将循环嵌套手工重写为等效的单个循环。我认为这样做将具有挑战性,而且结果将不可避免地具有数据依赖性。但是,如果您在不引入依赖的情况下成功做到了,那就瞧!您只需一个平面环路即可并行化,而无需折叠。

但是,最简单的前进方法可能是仅折叠两个级别而不是三个级别。而且,您要与完全不折叠进行比较,因为与仅并行化外循环相比,完全折叠是否会产生改善尚不明显,而且甚至可能折叠更差。

但是,如果您必须让OpenMP折叠嵌套的所有三个级别,则需要使用我在上面调用的两行,并将其从循环嵌套中移出。可能您可以通过完全摆脱sum并直接使用结果栅格来部分实现此目的。同样,这不一定会带来改善。

相关问题