gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:23:45 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com