无法检测为什么下面的代码没有被矢量化

PGO*_*eGo 11 c sse vectorization icc stencils

我一直在努力使用某个特定的应用程序,我已经尝试了一切.从自动向量化到手动编码的SSE内在函数.但不知何故,我无法在基于模板的应用程序上获得加速.

以下是我当前代码的片段,我使用SSE内在函数进行了矢量化.当我使用-vec-report3编译(Intel icc)时,我不断获取此消息:
remark:loop未向量化:语句无法向量化.

  #pragma ivdep
  for ( i = STENCIL; i < z - STENCIL; i+=4 )
  {
    it = it2 + i;

    __m128 tmp2i = _mm_mul_ps(_mm_add_ps(_mm_load_ps(&p2[i+j*it_j-it_j4+k*it_k]),_mm_load_ps(&p2[i+j*it_j+it_j4+k*it_k])),X4_i); //loop was not vectorized: statement cannot be vectorized
    __m128 tmp3 = _mm_mul_ps(_mm_add_ps(_mm_load_ps(&p2[i+j*it_j-it_j3+k*it_k]),_mm_load_ps(&p2[i+j*it_j+it_j3+k*it_k])),X3_i);
    __m128 tmp4 = _mm_mul_ps(_mm_add_ps(_mm_load_ps(&p2[i+j*it_j-it_j2+k*it_k]),_mm_load_ps(&p2[i+j*it_j+it_j2+k*it_k])),X2_i);
    __m128 tmp5 = _mm_mul_ps(_mm_add_ps(_mm_load_ps(&p2[i+j*it_j-it_j +k*it_k]),_mm_load_ps(&p2[i+j*it_j+it_j +k*it_k])),X1_i);

    __m128 tmp6 = _mm_add_ps(_mm_add_ps(_mm_add_ps(tmp2i,tmp3),_mm_add_ps(tmp4,tmp5)), _mm_mul_ps(_mm_load_ps(&p2[it]),C00_i));

    _mm_store_ps(&tmp2[i],tmp6);

   }
Run Code Online (Sandbox Code Playgroud)

我错过了一些关键的东西吗 由于该消息没有说明为什么它不能被矢量化,我发现很难确定瓶颈.

更新: 仔细考虑了建议后,我按照以下方式调整了代码.我认为最好将其进一步分解,以确定实际上导致向量依赖性的语句.

//#pragma ivdep
  for ( i = STENCIL; i < z - STENCIL; i+=4 )
  {
    it = it2 + i;
    __m128 center = _mm_mul_ps(_mm_load_ps(&p2[it]),C00_i);

    u_j4 = _mm_load_ps(&p2[i+j*it_j-it_j4+k*it_k]); //Line 180
    u_j3 = _mm_load_ps(&p2[i+j*it_j-it_j3+k*it_k]);
    u_j2 = _mm_load_ps(&p2[i+j*it_j-it_j2+k*it_k]);
    u_j1 = _mm_load_ps(&p2[i+j*it_j-it_j +k*it_k]);
    u_j8 = _mm_load_ps(&p2[i+j*it_j+it_j4+k*it_k]);
    u_j7 = _mm_load_ps(&p2[i+j*it_j+it_j3+k*it_k]);
    u_j6 = _mm_load_ps(&p2[i+j*it_j+it_j2+k*it_k]);
    u_j5 = _mm_load_ps(&p2[i+j*it_j+it_j +k*it_k]);

    __m128 tmp2i = _mm_mul_ps(_mm_add_ps(u_j4,u_j8),X4_i);
    __m128 tmp3 = _mm_mul_ps(_mm_add_ps(u_j3,u_j7),X3_i);
    __m128 tmp4 = _mm_mul_ps(_mm_add_ps(u_j2,u_j6),X2_i);
    __m128 tmp5 = _mm_mul_ps(_mm_add_ps(u_j1,u_j5),X1_i);

    __m128 tmp6 = _mm_add_ps(_mm_add_ps(tmp2i,tmp3),_mm_add_ps(tmp4,tmp5));
    __m128 tmp7 = _mm_add_ps(tmp6,center);

    _mm_store_ps(&tmp2[i],tmp7);  //Line 196

   }
Run Code Online (Sandbox Code Playgroud)

当我编译(icc)上面的代码而没有#pragma ivdep得到以下消息:

remark: loop was not vectorized: existence of vector dependence.
vector dependence: assumed FLOW dependence between tmp2 line 196 and tmp2 line 196.
vector dependence: assumed ANTI dependence between tmp2 line 196 and tmp2 line 196.
Run Code Online (Sandbox Code Playgroud)

当我用它编译(icc)时#pragma ivdep,我得到以下消息:

remark: loop was not vectorized: unsupported data type. //Line 180
Run Code Online (Sandbox Code Playgroud)

为什么对196号线有依赖性建议?如何消除建议的向量依赖性?

hda*_*nte 2

问题是您尝试将自动矢量化与手动矢量化代码一起使用。编译器表示该行无法向量化,因为无法向量化向量函数。

要么让编译器自动矢量化它,要么禁用自动矢量化并手动矢量化您的代码。正如已经评论过的,自动矢量化器将计算矢量化盈利能力:它检查是否值得对代码进行矢量化。