【问题标题】:Optimize dependent loops openmp优化依赖循环 openmp
【发布时间】:2012-03-27 22:59:31
【问题描述】:

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

谢谢。

【问题讨论】:

  • 首先是删除if (i != j)...
  • 只交换数组的 2 个元素:
  • void swapTab(int* tab,int i,int j){ int temp;临时 = 选项卡 [i];选项卡 [i] = 选项卡 [j];选项卡 [j] = 温度; }
  • 那么并行化这将是困难的,因为您遍历元素的顺序很重要。

标签: c++ c optimization loops openmp


【解决方案1】:

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

您确实可以选择以空间换时间。复制您的数组T(称为T')。在迭代 1 中,您将替换您的行:

swapTab(t,i,j)

类似的东西

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

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

在第二次迭代中,您需要先将T' 复制回T,然后继续。不要那样做——设置指向TT'的指针(TnewTold,也许)并切换指针,使Told始终指向要读取的数组,并且@ 987654332@总是指向要写入的数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 2019-10-15
    • 2013-12-08
    • 2017-12-03
    • 2010-09-12
    相关资源
    最近更新 更多