我想对我的代码进行并行化和优化,它使用了特征库,但由于这种情况,我很吃惊。
代码的一部分需要2-3 secs.in一次迭代,由于有一个which循环,多次重复运行,我无法在when循环上使用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的任何更好的技术,任何的库优化,其他的库选择等等。
发布于 2022-07-27 01:30:50
这段代码首先是微小的:18平方迭代。并行回路末端的屏障很可能比操作更昂贵。
接下来,该位被错误地写入omp并行化:
x(i+1) += y(i)
x(i-1) += y(i)不能保证左手边是不相交的,所以你会有并行写冲突。你首先要把它重写为
x(i) += y(i-1) + y(i+1)但是首先问问自己,这段代码是做什么的?从预期的算法,是否有可能有明显的-不相交的左手边在一些重写?
https://stackoverflow.com/questions/73112189
复制相似问题