我有一个问题,我想用openmp并行化两个for循环。
如何使用openmp优化此循环:
void test(float** m,tab* t,int n){
int i,j;
float gain;
for (i = 1; i < n; i++)
{
for (j = i + 1;] j < n; j++)
{
if (i != j)
{
gain=m[t[(i+n-1)%n]][t[j]] + m[t[i]][t[(j+1)%n]] - m[t[(i+n -1)%n]][t[i]] - m[t[j]][t[(j+1)%n]]
if (gain< 0)
{
swapTab(t,i,j);
}
}
}
}
}
THX。
答案 0 :(得分:1)
正如Oli Charlesworth指出遍历矩阵中元素的顺序很重要,所以简单地在最外层循环周围打一个并行指令是行不通的。
您拥有的一个选择是交易一些空间。复制数组T
(称之为T'
)。在迭代1中,您将替换您的行:
swapTab(t,i,j)
类似
T'[j][i] = T[i][j]
(我不是一个C ++程序员,所以忽略语法中的缺陷。)
在第二次迭代中,您需要先将T'
复制回T
,然后再继续。不要这样做 - 设置指针(Tnew
,Told
,也许)到T
和T'
并切换指针,以便始终Told
指向要读取的数组,Tnew
始终指向要写入的数组。