首页 > 解决方案 > 使用 OpenMP 时性能最差

问题描述

我正在尝试使用 OpenMP 并行化我的代码,基本上攻击每个我认为值得并行化的 for 循环。但我无法在任何实现中获得更好的性能。这是一个简单的例子:

double start = omp_get_wtime();

            #pragma omp parallel for collapse(2)
            for(int y=0;y<hl;y++) 
                for(int x=0;x<wl;x++) 
                {
                    dI_l[x + y*wl][0] = 0.25f * (dI_lm[2*x   + 2*y*wlm1][0] +
                                                dI_lm[2*x+1 + 2*y*wlm1][0] +
                                                dI_lm[2*x   + 2*y*wlm1+wlm1][0] +
                                                dI_lm[2*x+1 + 2*y*wlm1+wlm1][0]);
                }

            double end = omp_get_wtime();
            std::cout << "   wall time : " << end - start << std::endl;

没有编译指示的时间会有所不同,但大约是:0.000385959。当我添加编译指示时:0.00149408。

我尝试添加具有不同数量的块和许多其他实现的“计划”子句,但我似乎从未获得更好的性能。

hl 是 240,wl 是 340。dI_l 和 dI_lm 是 Eigen::Vector3f 类型的指针。

知道我应该改进什么以获得更好的性能吗?

标签: parallel-processingopenmppragma

解决方案


推荐阅读