Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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&;加速嵌套for循环;展开但速度慢我想知道为什么?_C++_Performance_Openmp_Loop Unrolling - Fatal编程技术网

C++ 我试图通过openmp&;加速嵌套for循环;展开但速度慢我想知道为什么?

C++ 我试图通过openmp&;加速嵌套for循环;展开但速度慢我想知道为什么?,c++,performance,openmp,loop-unrolling,C++,Performance,Openmp,Loop Unrolling,我试图加速一个简单的嵌套循环: for (int k = 0; k < n; k++) for (int i = 0; i < n - k; ++i) c[k] += a[i + k] * b[i]; 但是…情况更糟了!我只是想知道为什么 更多:我通过g++-9 test.cpp-openmp-o test编译了它您所做的第一次修改似乎只将工作共享应用于第一个k-for循环(具有k

我试图加速一个简单的嵌套循环:

for (int k = 0; k < n; k++)
    for (int i = 0; i < n - k; ++i)
      c[k] += a[i + k] * b[i];
但是…情况更糟了!我只是想知道为什么


更多:我通过
g++-9 test.cpp-openmp-o test编译了它

您所做的第一次修改似乎只将工作共享应用于第一个k-for循环(具有
k
)。另一个不考虑用于工作共享,并且在构造的
#pragma omp之外。是的,只共享外部循环,但我认为第二个不在#pragma之外。更重要的是,使用“pragma omp parallel for(int k=0;k#pragma omp for
仅适用于第一个k循环块。尝试为下一个k循环添加另一个
#pragma omp for
,并检查。事实上,我已经试过了,但它有点帮助(比只使用
#pragma omp for
)我可以建议使用
schedule
子句,而不是将循环拆分为多个部分吗?除非负载模式非常明显,否则很难预测适当的负载平衡。旁注:第二个k循环中的条件仍然是
n-n/2=n/2
。我认为这不是您的意图。您所做的第一次修改似乎只对第一个k-for循环(带有
k
的循环)应用工作共享。另一个不考虑用于工作共享,并且在构造的
#pragma omp之外。是的,只共享外部循环,但我认为第二个不在#pragma之外。更重要的是,使用“pragma omp parallel for(int k=0;k#pragma omp for
仅适用于第一个k循环块。尝试为下一个k循环添加另一个
#pragma omp for
,并检查。事实上,我已经试过了,但它有点帮助(比只使用
#pragma omp for
)我可以建议使用
schedule
子句,而不是将循环拆分为多个部分吗?除非负载模式非常明显,否则很难预测适当的负载平衡。旁注:第二个k循环中的条件仍然是
n-n/2=n/2
。我认为那不是你的本意。
#pragma omp parallel for
  for (int k = 0; k < n/2; k++)
    for (int i = 0; i < n - k; ++i){
      c[k] += a[i + k] * b[i];
      if(i < k+1) c[n-1-k] += a[i + n-1-k] * b[i];
    }
for(int k = n/2; k < n - n/2; k++)
  for (int i = 0; i < n - k; ++i)
    c[k] += a[i + k] * b[i];

#pragma omp parallel for
    for (k = 0; k < n/2-7; k+=8){
        for (int i = 0; i < n - k; ++i){
            c[k] += a[i+k] * b[i];
            if(i < n-k-1)   c[k+1] += a[i+k+1] * b[i];
            if(i < n-k-2)   c[k+2] += a[i+k+2] * b[i];
            if(i < n-k-3)   c[k+3] += a[i+k+3] * b[i];
            if(i < n-k-4)   c[k+4] += a[i+k+4] * b[i];
            if(i < n-k-5)   c[k+5] += a[i+k+5] * b[i];
            if(i < n-k-6)   c[k+6] += a[i+k+6] * b[i];
            if(i < n-k-7)   c[k+7] += a[i+k+7] * b[i];
            if(i < k+1)    c[n-1-k] += a[i+n-1-k] * b[i];
            if(i < k+2)    c[n-2-k] += a[i+n-2-k] * b[i];
            if(i < k+3)    c[n-3-k] += a[i+n-3-k] * b[i];
            if(i < k+4)    c[n-4-k] += a[i+n-4-k] * b[i];
            if(i < k+5)    c[n-5-k] += a[i+n-5-k] * b[i];
            if(i < k+6)    c[n-6-k] += a[i+n-6-k] * b[i];
            if(i < k+7)    c[n-7-k] += a[i+n-7-k] * b[i];
            if(i < k+8)    c[n-8-k] += a[i+n-8-k] * b[i];
        }

    }
    // this loop must <= 16 and is well balance
    #pragma omp parallel for
    for(int j = k; j < n-k; j++)
        for(int i = 0; i < n - j; ++i){
            c[j] += a[i + j] * b[i];
        }