如何通过openMP或任何其他方式优化这个特征库代码



我想对使用特征库的代码进行并行化和优化,但由于这种情况,让我大吃一惊

代码的一部分需要2-3秒。在一次迭代中,由于while循环,它被重复运行了很多次,我无法在while循环中使用OpenMP,但当在部分代码上使用时,它没有显示出优化。

代码结构-

while(error>1e-6){
//some code ...
//part that i want to optimize
#pragma omp for
for(int i=0; i<18; i++)
{
XFG_e.coeffRef(IDOF(i)-1) += XFE(i);
XFG_i.coeffRef(IDOF(i)-1) += XFI(i);
for (int j=0;j<18;j++)
{
XKG.coeffRef(IDOF(i)-1,IDOF(j)-1) += XKT(i,j);
XMG.coeffRef(IDOF(i)-1,IDOF(j)-1) += XME(i,j);
}  
}     

}

请建议优化此代码的方法。。。使用openMP的任何更好的技术,任何库优化,其他库替代品等。

这段代码首先是很小的:18次平方迭代。并联回路末端的屏障很可能比操作更昂贵。

接下来,该位被写入omp并行化的错误方式:

x(i+1) += y(i)
x(i-1) += y(i)

不能保证左手边是不相交的,所以您将有并行写入冲突。您首先必须将其重写为

x(i) += y(i-1) + y(i+1)

但首先问问自己,这个代码是做什么的?根据预期的算法,在某种重写下,是否有可能出现明显不相交的左手边?

最新更新