小编Hon*_*dar的帖子

OpenMP paralelization抑制矢量化

我是OpenMP的新手,我正在尝试使用OpenMP对代码进行并行化:

#pragma omp parallel for
for(int k=0;k<m;k++)
{
   for(int j=n-1;j>=0;j--)
   {
       outX[k+j*m] = inB2[j+n * k] / inA2[j*n + j];

       for(int i=0;i<j;i++)
       {
           inB2[k*n+i] -= inA2[i+n * j] * outX[k + m*j];
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

对外循环进行并行化非常简单,但为了优化它,我想要对最内循环(对i进行迭代)进行并行化.但是当我尝试这样做时:

#pragma omp parallel for
for(int i=0;i<j;i++)
{
    inB2[k*n+i] -= inA2[i+n * j] * outX[k + m*j];
}
Run Code Online (Sandbox Code Playgroud)

编译器不会对内循环进行矢量化("因为可能的别名而导致为矢量化而循环"),这使得它运行得更慢.我用它编译了它gcc -ffast-math -std=c++11 -fopenmp -O3 -msse2 -funroll-loops -g -fopt-info-vec prog.cpp

谢谢你的建议!

编辑:我正在使用__restrict关键字的数组.

EDIT2:有趣的是,当我在内循环中仅保留pragma并将其从外部移除时,gcc将向量化它.因此,当我尝试对两个周期进行并行化时,问题才会发生.

编辑3:当我使用#pragma omp parallel for simd时,编译器将向量化循环.但它仍然比没有内部循环并行化更慢.

c++ vectorization openmp

8
推荐指数
1
解决办法
272
查看次数

静态库接口中未公开的类的名称冲突(c ++)

我有两个静态库(a.libb.lib)内部,库a有类Foo,但它没有在任何公开可用的包含中公开.库b.lib也有类Foo,它也没有在接口中公开.这些类位于同一名称空间中,并具有相同的构造函数签名.

当我调试或运行可执行文件(使用两个库)时,我发现错误的类lib a而不是lib b创建.试图了解这是如何发生的.这是链接器问题吗?(即类名是相同的,链接器插入它先找到的任何东西)

c++ static-libraries visual-studio-2017

0
推荐指数
1
解决办法
72
查看次数