c++ - 优化openmp的依赖循环

标签 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);
                }
            }
        }
    }
}

谢谢。

最佳答案

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

你确实有一个选择就是用一些空间换取时间。复制数组 T(将其命名为 T')。在迭代 1 中,您将替换您的行:

swapTab(t,i,j)

类似的东西

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

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

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

关于c++ - 优化openmp的依赖循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9898941/

相关文章:

c++ - OpenCL 的问题(opencl.dll、AMD APP SDK、cl.h)

c# - 让 C# 和 C++ 一起玩得很好

用 C 中的另一个单词更改字符串中的单词

c - 在 C 中使用 malloc 时是否需要类型转换?

c - 等待文件解锁 - Windows

optimization - 计算结果和多路复用与否

c++ - 使用vector引发 'std::out_of_range'错误实例后调用终止

c++ - QSqlQuery:在执行前获取准备好的语句字符串

c++ - 优化求和循环

c++ - 将代码编译为单个自动合并文件,以允许编译器更好地优化代码