我想对使用特征库的代码进行并行化和优化,但由于这种情况,让我大吃一惊
代码的一部分需要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)
但首先问问自己,这个代码是做什么的?根据预期的算法,在某种重写下,是否有可能出现明显不相交的左手边?