所以我将这段代码与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)
来避免竞争状况。
好的,这就是问题。我只是得到这个Speed Up,而且我100%确信它会变得更好:
问题是我不知道该怎么办,或者可能是问题所在。在变量double *utmp
中是否存在一些错误的共享?还是我应该以循环数据分解为目标?
感谢您的帮助!