优化依赖循环openmp

时间:2012-03-27 22:59:31

标签: c++ c optimization loops openmp

我有一个问题,我想用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。

1 个答案:

答案 0 :(得分:1)

正如Oli Charlesworth指出遍历矩阵中元素的顺序很重要,所以简单地在最外层循环周围打一个并行指令是行不通的。

您拥有的一个选择是交易一些空间。复制数组T(称之为T')。在迭代1中,您将替换您的行:

swapTab(t,i,j)

类似

 T'[j][i] = T[i][j]

(我不是一个C ++程序员,所以忽略语法中的缺陷。)

在第二次迭代中,您需要先将T'复制回T,然后再继续。不要这样做 - 设置指针(TnewTold,也许)到TT'并切换指针,以便始终Told指向要读取的数组,Tnew始终指向要写入的数组。