OpenMP改善SpeedUp Block分解

时间:2019-01-10 02:21:32

标签: c++ c performance parallel-processing openmp

所以我将这段代码与OpenMP并行化,对矩阵使用块分解。我正在尝试通过以下方法解决负载不平衡问题:

#define lowerb(id, p, n) ( id * (n/p) + (id < (n%p) ? id : n%p) )
#define numElem(id, p, n) ( (n/p) + (id < (n%p)) )
#define upperb(id, p, n) ( lowerb(id, p, n) + numElem(id, p, n) - 1 )
#define min(a, b) ( (a < b) ? a : b )
#define max(a, b) ( (a > b) ? a : b )

这是代码。抱歉,我必须发布图片,但是直到下周才能拿起笔记本电脑。

关于代码,没有太多要解释的东西,每个线程都有一些行,并且它们共享工作量。我使用reduction(+:sum)来避免竞争状况。

enter image description here

好的,这就是问题。我只是得到这个Speed Up,而且我100%确信它会变得更好:

enter image description here

问题是我不知道该怎么办,或者可能是问题所在。在变量double *utmp中是否存在一些错误的共享?还是我应该以循环数据分解为目标?

感谢您的帮助!

0 个答案:

没有答案