Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 优化依赖循环openmp_C++_C_Optimization_Loops_Openmp - Fatal编程技术网

C++ 优化依赖循环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

我有一个问题,我想用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);
                }
            }
        }
    }
}
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;}然后并行化这将很困难,因为遍历元素的顺序很重要。