C++ 优化依赖循环openmp
我有一个问题,我想用openmp并行两个for循环 如何使用openmp优化此循环:C++ 优化依赖循环openmp,c++,c,optimization,loops,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) { g
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);
}
}
}
}
}
void测试(浮点**m,tab*t,int n){
int i,j;
浮动增益;
对于(i=1;i
thx.正如Oli Charlesworth指出的那样,矩阵中元素的遍历顺序很重要,因此简单地在最外层的循环上打一个parallel for指令是行不通的 你的一个选择是用一些空间换取时间。复制一个数组
T
(称之为T'
)。在迭代1中,您将替换您的行:
swapTab(t,i,j)
有点像
T'[j][i] = T[i][j]
(我不是一个C++程序员,所以忽略语法中的缺陷)
在第二次迭代中,首先要将
T'
复制回T
,然后继续。不要这样做——设置指向T
和T
的指针(Tnew
,teld
,也许),并切换指针,使teld
始终指向要读取的数组,Tnew
始终指向要写入的数组。如果(i!=j),首先要删除
…只需交换数组的2个元素:void swapTab(int*tab,inti,intj){int-temp;temp=tab[i];tab[i]=tab[j];tab[j]=temp;}然后并行化这将很困难,因为遍历元素的顺序很重要。